
- •Предисловие
- •Глава 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. Установка контрольных точек
- •Возможные действия в контрольной точке
- •Включение и выключение режима контрольных точек
- •Необязательные параметры режима контрольных точек
- •Предикаты для работы с контрольными точками
- •Режимы, связанные с контрольными точками
- •Основные отладочные предикаты
- •Статистическая информация
Глава 9 Встроенные предикаты
В настоящей главе рассматриваются встроенные предикаты Пролога, описываются способы обновления базы данных, вопросы ввода/вывода и обработки файлов.
9.1. Встроенные предикаты
После загрузки системы Пролог пользователю становится доступен ряд системных предикатов. Они определяются с помощью либо самого Пролога, либо языка низшего уровня, используемого для реализации Пролога.
Описание предикатов и способы их применения содержатся в документации по конкретной реализации Пролога. При доказательстве некоторых предикатов имеет место так называемый побочный эффект. Благодаря ему обеспечивается интерфейс с пользователем и обработка файлов. Предикаты, обладающие побочным эффектом, обычно реализуются не на Прологе, а на языке низкого уровня, например Ассемблере, либо на языке высокого уровня, таком, как Паскаль.
Встроенные предикаты не могут быть изменены пользователем, а попытка заменить их, применяя предикаты assert и retract, приведет к сообщению об ошибке.
9.2. Обновление базы данных Пролога
Программная среда Пролога состоит из двух частей:
программный модуль Пролога:
база данных Пролога.
Программный модуль включает интерпретатор Пролога (в некоторых реализациях и компилятор), драйвер ввода/вывода и, кроме того, системные процедуры. Пользователь обычно не имеет возможности изменять программный модуль.
База данных Пролога содержит набор основных, заранее определенных предикатов. Кроме того, резервируется пространство для добавления предикатов, которые будут объявлены пользователем. Механизмы добавления, удаления и обновления утверждений, заданных пользователем, классифицируются следующим образом:
1) добавление и удаление утверждений;
2) добавление утверждений из файла и замена имеющихся утверждений на утверждения, находящиеся в файлах для того же самого предиката (ввод программ и повторный ввод программ).
Файл Пролога состоит из утверждений. Утверждение есть факт или правило. Утверждения обрабатываются интерпретатором (компилятором) Пролога и потому должны удовлетворять синтаксическим определениям.
Добавление и удаление утверждений
Как уже говорилось, в Прологе имеется набор встроенных предикатов, позволяющих добавлять или удалять утверждения из базы данных. В гл.7 мы ввели предикаты asserta, assertz и retract, служащие для обновления базы данных. Подытожим ранее сказанное и рассмотрим встроенные предикаты retractall и abolish.
assertz(X)
X должен быть конкретизирован термом, не являющимся переменной. Терм интерпретируется как утверждение и добавляется в базу данных Пролога. Утверждение помещается в конец базы данных, или если существует процедура с теми же функтором и арностью, то добавляется к этой процедуре. (В некоторых реализациях Пролога допустимы исключения из приведенного правила, потому необходимо обратиться к руководству по конкретной системе.)
asserta(X)
Определяется аналогично предикату assertz(X), но новое утверждение становится первым утверждением в процедуре с теми же функтором и арностью.
retract(X)
Х должен быть конкретизирован составным термом. В базе данных осуществляется поиск утверждения, голова и тело которого сопоставляются с термом X. Первое такое утверждение затем удаляется.
retractall(X)
Удаляет из базы данных все утверждения, функтор и арность которых сопоставимы с X.
abolish(P,A)
Удаляет из базы данных все утверждения для процедуры Р с арностью А.
Описанные предикаты служат для обновления базы данных Пролога во время выполнения программы.
Возможность динамического обновления программы довольно часто применяется в Прологе. После удаления части базы данных с помощью предикатов retract и abolish необходимо запустить механизм «сборки мусора» для восстановления памяти. Алгоритм, выбранный для чистки памяти, зависит от реализации Пролога.