- •Предисловие
- •Глава 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. Установка контрольных точек
- •Возможные действия в контрольной точке
- •Включение и выключение режима контрольных точек
- •Необязательные параметры режима контрольных точек
- •Предикаты для работы с контрольными точками
- •Режимы, связанные с контрольными точками
- •Основные отладочные предикаты
- •Статистическая информация
Фаза решения задачи
Согласование посл(1,U2). Самое последнее из отложенных целевых утверждений - третье целевое утверждение в третьем обращении: U2 is U3 * 1. Поскольку переменная U3 равна 1 в результате согласования второго целевого утверждения, U2 получает значение 1. Таким образом, посл(1,U2) согласуется при U2, равной 1.
Согласование посл(2,U). Предпоследнее отложенное целевое утверждение - третье целевое утверждение во втором обращении: U is U2 * 2. Так как переменная U2 равна 1 в результате согласования второго целевого утверждения, U получает значение 2. Итак, посл(2,и) согласуется при U , равной 2.
Согласование посл(3,Х). Предыдущее из отложенных целевых утверждений - третье целевое утверждение в первом обращении: Х is U * 3. Поскольку переменная U равна 2 в результате согласования второго целевого утверждения, X получает значение 6. Целевое утверждение посл(3,Х) согласуется при Х, равной 6.
Если отложенных целевых утверждений больше нет, Пролог определяет, при каком значении переменной удовлетворяется запрос:
X=6
другие решения (да/нет)? нет
На рис.4.1.1 приведена полная трассировка запроса. Дуги, исходящие из цели, помечены номером сопоставляемого утверждения и значениями переменных при сопоставлении. Значения переменных, при которых согласуется целевое утверждение, заключены в круглые скобки и записаны на той же строчке, что и соответствующее целевое утверждение. Метки на дугах, входящих в вершины со значениями переменных, являются целевыми утверждениями, которые приводят к этим значениям.

Рис. 4.1.1. Трассировка запроса ?- посл(3,Х).
Пример 4.1.2
Требуется написать процедуру для вычисления ряда
f(x,n) = 1+х+х^2+х^3+...+х^n
при известных действительном числе х и натуральном числе n.
Поскольку утверждения Пролога определяют некоторое отношение, а не вычисляют значение, как функции Паскаля, нам нужно ввести третий параметр, который обозначал бы сумму
1+х+х^2+х^3+...+х^n
для данных х и n. Тогда голова утверждения будет выглядеть следующим образом: f(X,N,S). (Напомним, что переменные в Прологе должны начинаться с заглавной буквы.)
Для того чтобы написать утверждения, мы должны преобразовать приведенное выше определение ряда в рекурсивное определение.
Это можно сделать, учитывая, что
f(x,0) = 1
f(x,l) = l + x = f(x,0) * x+l
f(x,2) = l + x + x^2 = f(x,l) * x+l
…
…
…
f(x,n) = 1 + x + x^2 + x^n = f(x,n-l) * х+ 1
Определим ряд рекурсивно:
f(x,0) = 1
f(x,n) = f(x,n-1) * x+ l
Такому определению соответствуют следующие утверждения Пролога:
/* ГРАНИЧНОЕ УСЛОВИЕ
f(x,0,l).
/* РЕКУРСИВНОЕ УСЛОВИЕ
f(x,n,s) :-
M is N-1,
f(X,M,R),
S is R * X+l.
На рис.4.1.2 показано, как Пролог согласует запрос ?- f(2,3,T).
4.2. Восходящая стратегия
Мы рассмотрели процесс разбиения задач на подзадачи и их решения. Так, в примере 4.1.1 для определения посл(4,V) нужно вычислить
посл(3,V2),посл(2,V3),...,посл(0,V5)
и построить решение, выбрав в качестве базиса граничное условие.

Рис.4.1.2. Трассировка запроса ?- f(2,3,T).
Другой подход заключается в том, чтобы, начав с граничного условия, строить решение до тех пор, пока не будет решена исходная задача. Следуя данному подходу и пытаясь найти четвертый член в последовательности, мы должны начать с граничного условия 1, вычислить значение первого терма 1*1, второго - 1*1*2, третьего -1*1*2*3 и, наконец, четвертого - 1*1*2*3*4. Такую стратегию мы называем восходящей.
В описанном методе решения целевое утверждение должно иметь два дополнительных параметра: один - для указания на «размер» решенной к настоящему времени задачи, а второй - для записи промежуточного решения. При вызове утверждения параметры связываются с граничным условием.
Пример 4.2.1
Если применить восходящую стратегию к решению задачи, взятой из примера 4.1.1, мы получим следующие утверждения Пролога:
/* постр_посл(NS,VS,N,V) строит N-й
/* терм последовательности – V
/* VS - это значение NS-ro терма
/* в построенной к данному моменту
/* последовательности
/* Требуемое решение:
постр_посл(N,V,N,V).
/* Построение следующего решения
постр_посл(NS,VS,N.V) :-
NS1 is NS + 1,
VS1 is VS * NS1,
постр_посл(NS1,VS1,N,V).
Запрос включает граничное условие как решенную к настоящему времени задачу. На запрос
?- постр_посл(0,1,7,V).
получаем
V=5040
другие решения (да/нет)? Нет
Альтернативным вариантом является определение еще одного утверждения, которое маскирует дополнительные параметры в постр_посл:
посл_п(N,V) :- постр_посл (0,l,N,V).
так что
?- посл_п(7,V).
дает
V = 5040
