
- •Предисловие
- •Глава 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. Установка контрольных точек
- •Возможные действия в контрольной точке
- •Включение и выключение режима контрольных точек
- •Необязательные параметры режима контрольных точек
- •Предикаты для работы с контрольными точками
- •Режимы, связанные с контрольными точками
- •Основные отладочные предикаты
- •Статистическая информация
7.4. Предикат repeat
Специальный встроенный предикат repeat всегда согласуется с базой данных и всегда может быть передоказан при возврате.
В качестве примера использования repeat приведем запрос, предлагающий пользователю вводить значения до тех пор, пока прочитанное системой число не превысит 100:
?- repeat,nl,write ('число?'), read(X),X100.
число ? 2
число? 100
число? 101
да
7.5. Декларативная и процедурная семантики
При составлении и написании программ на Прологе следует установить, какие факты и отношения свойственны данной задаче. Они могут быть непосредственно выражены утверждениями Пролога и образуют декларативное описание задачи. Такое описание не задает порядок использования утверждений и согласования целевых утверждении в пределах утверждения, не показывает, как сформированные утверждения могут быть использованы для решения задачи. Пролог будет пытаться согласовать список целевых утверждений, просматривая утверждения сверху вниз и слева направо. В этом заключается процедурная семантика утверждений.
Иногда декларативное описание может быть выполнено как программа. В других случаях нужно упорядочить утверждения таким образом, чтобы способ согласования целевых утверждений Прологом привел к решению задачи. Однако упорядочение утверждений само по себе не гарантирует получения работающей программы. Возможно, придется добавить некоторые детали для управления ходом выполнения программы: предикаты repeat, fail и отсечение (см. гл. 8). Такая информация указывает системе Пролог, как использовать факты и отношения. Полученную в результате программу следует рассматривать уже процедурно.
Характеристики процедуры
При написании или разборе процедуры необходимо определить следующие характеристики.
1) Сколько раз может быть успешно согласовано целевое утверждение? Когда целевое утверждение вызывает процедуру, важно знать, что случится, если механизм возврата снова приведет к этому целевому утверждению: будет ли оно согласовано вновь? должно ли оно быть согласовано?
2) Какая конкретизация переменных происходит при использовании каждого утверждения? Смысл вызова процедуры, независимо от побочных эффектов, заключается в том, чтобы произвести какую-либо проверку и/или осуществить конкретизацию или сцепление переменных.
3) Какие возникают побочные эффекты ? Обычно это изменения, связанные с вводом в базу данных и удалением из нее, или обработка термов.
4) Какие параметры используются для входных значений и какие - для выходных? Некоторые процедуры могут иметь параметры, служащие для ввода и вывода.
Пример 7.4.1. Определим процедуру дв_пол таким образом:
дв_пол(N,S) :- integer(N), var(S), S is N*2.
дв_пол(N,S) :- integer(S), var(N), N is S/2.
Здесь встроенный предикат integer успешно согласуется в том случае, если его аргумент является целым числом, а предикат var - в том случае, если его аргумент является неконкретизированной переменной. На запрос
?- дв_пол(5,5).
будет получен ответ
S=10
в то время как на запрос
?- дв_пол(N,8).
ответом будет
N=4
Предикат дв_пол является симметричным. В других случаях некоторые или все параметры процедуры используются строго определенным образом.
Пример 7.4.2. Определим процедуру квадрат:
квадрат(N,S) :- integer(N), var(S), S is N*N.
Переменная S в процедуре будет конкретизирована как квадрат N, только в том случае, если N (входной параметр) является целым числом, а S (выходной параметр) - переменной.