
- •Предисловие
- •Глава 1 Введение в Пролог
- •Глава 2 Синтаксис и унификация
- •2.1. Синтаксис термы
- •Константы
- •Переменные
- •Область действия переменных
- •Сложные термы, или структуры
- •Синтаксис операторов
- •Синтаксис списков
- •Синтаксис строк
- •Утверждения
- •Запросы
- •Ввод программ
- •2.2 Унификация
- •Глава 3 Арифметические выражения
- •3.1. Введение
- •3.2. Арифметические выражения
- •3.3. Арифметические операторы
- •3.4. Вычисление арифметических выражений
- •3.5. Сравнение результатов арифметических выражений
- •Глава 4 Рекурсия
- •4.1. Стратегия «разделяй и властвуй»
- •Пример 4.1.1
- •Фаза разбиения
- •Фаза решения задачи
- •4.2. Восходящая стратегия
- •4.3. Рекурсия и эффективность
- •Пример 4.3.2
- •Глава 5 Структуры данных
- •5.1. Списки списковая форма записи
- •А на запрос
- •Некоторые стандартные целевые утверждения для обработки списков
- •5.2. Бинарные деревья представление бинарных деревьев
- •Бинарное дерево на рис.5.2.1 имеет левое поддерево
- •Представление множеств с помощью бинарных деревьев
- •Будем называть линейным представление такого вида, как на рис.5.2.3, и сбалансированным - такое, как на рис.5.2.2.
- •Левому поддереву соответствует отсортированный список
- •Глава 6 Операторы
- •6.1. Операторы и структуры синтаксис операторов
- •Свойства операторов
- •6.2. Позиция операторов
- •6.3. Приоритет операторов
- •6.4. Ассоциативность операторов
- •6.5. Спецификаторы
- •6.6. Операторы объявления
- •6.7. Пример: вычисление многочленов
- •6.8. Системные операторы
- •Глава 7 Механизм возврата и процедурная семантика
- •7.1. Механизм возврата
- •7.2. Пример: задача поиска пути в лабиринте
- •Целевое утверждение не удается согласовать с первым утверждением
- •Если мы введем
- •Если затем мы введем
- •7.3. Обработка фактов с помощью механизма возврата
- •7.4. Предикат repeat
- •7.5. Декларативная и процедурная семантики
- •Характеристики процедуры
- •7.6. Вопросы эффективности
- •Глава 8 Отсечение
- •8.1. Почему используют отсечение?
- •8.2. Использование отсечения
- •Выдав запрос
- •Обратившись к системе с запросом
- •8.3. Ловушки отсечения
- •Глава 9 Встроенные предикаты
- •9.1. Встроенные предикаты
- •9.2. Обновление базы данных Пролога
- •Добавление и удаление утверждений
- •Считывание утверждений в базу данных
- •Предикаты сохранения и восстановления
- •9.3. Особенности ввода и вывода чтение символов
- •Запись символов
- •Считывание термов Предикаты
- •Запись термов
- •9.4. Обработка файлов
- •Редактирование программ на прологе
- •Распечатка предикатов
- •Глава 10 Модули. Пример разработки системы
- •10.1. Модули
- •Пример 10.1.1
- •10.2. Пример разработки системы: деревья решений
- •Описание дерева решений
- •Разработка системы
- •Целевое утверждение
- •Глава 11 Отладка
- •11.1. Трассировка
- •Включение и выключение механизма трассировки
- •Необязательные параметры трассировки
- •Предикаты трассировки
- •Режимы трассировки
- •11.2. Установка контрольных точек
- •Возможные действия в контрольной точке
- •Включение и выключение режима контрольных точек
- •Необязательные параметры режима контрольных точек
- •Предикаты для работы с контрольными точками
- •Режимы, связанные с контрольными точками
- •Основные отладочные предикаты
- •Статистическая информация
Считывание утверждений в базу данных
Для того чтобы добавить новые утверждения в базу данных, пользователь вводит
:- consult(user).
Такая команда Пролог-системы вызывает считывание утверждении с терминала пользователя до тех пор, пока не встретится символ конец_файла. Типичная последовательность имеет вид:
?- consult(user). /* начало считывания
/* утверждений
: утверждение 1 /* Обратите внимание, что
/* использован другой знак
/* приглашения системы
: утверждение 2
:$ /* символ конец_файла
?- /* снова появилось обычное
/* приглашение системы
Утверждения 1 и 2 добавлены к базе данных и будут выбраны при попытке Пролога доказать цель с теми же функтором и арностью. Более короткий вариант записи consult(user):
?- [user].
В данном случае используется тот же символ конца файла $.
Пользователю будет нелегко вводить одни и те же предикаты при каждом новом сеансе работы. Для устранения нежелательной ситуации в Прологе реализован механизм, позволяющий считывать группы предикатов или программы пользователя. Пусть мой-файл - файл пользователя. Утверждение
?- consult(мой-файл).
считывает содержимое файла мой-файл. Целевое утверждение consult(X) всегда выполняется успешно. В результате утверждения из файла мой-файл добавляются в базу данных Пролога. Если при чтении одного из утверждений обнаруживается синтаксическая ошибка, выдается сообщение об этом утверждении, но обработка оставшихся утверждений продолжается до тех пор, пока не будет найден конец файла. Целевое утверждение consult(X) нельзя передоказать. Если Х не является именем реально существующего файла или файл не может быть открыт, то выдастся сообщение об ошибке. При вводе программы из файла в ней иногда встречаются команды или директивы, относящиеся к системе Пролог. Они отличаются от утверждений, добавляемых в базу данных, тем, что им предшествует оператор ?- или :-.
Целевое утверждение consult(F) добавляет утверждения из файла F в конец существующей базы данных. Пролог пытается сопоставить цель с добавленным утверждением только в том случае, если при прямом доказательстве попытка согласования существующего утверждения закончилась неудачей. Допускается замена новым утверждением утверждения, ранее записанного в базу данных, для чего используется встроенный предикат reconsult. Он работает аналогично предикату consult, но утверждения, считываемые в базу данных, замещают ранее записанные утверждения с теми же функтором и арностью.
В качестве аргументом предикатов consult и reconsult могут выступать списки файлов. Например:
consult(['F1','F2',...]).
reconsult(['F1','F2',...]).
Предикаты сохранения и восстановления
После добавления новых утверждений в базу данных пользователь имеет возможность сохранить копию текущего состояния системы и в следующем сеансе продолжить работу, начиная с записанного состояния. Для этого применяется предикат save. Утверждение
save ('мой-фаил').
сохраняет текущее состояние базы данных Пролога в файл, называемый мой-файл. Целевое утверждение save(X) нельзя передоказать. В случае, если не существует файла с именем Х или если его невозможно открыть, то выдастся сообщение об ошибке.
Успешно выполнив сохранение текущего состояния базы данных Пролога в файл, мы можем вернуться к прежнему состоянию, используя предикат restore:
Restore('мой-файл').