
- •Предисловие
- •Глава 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. Установка контрольных точек
- •Возможные действия в контрольной точке
- •Включение и выключение режима контрольных точек
- •Необязательные параметры режима контрольных точек
- •Предикаты для работы с контрольными точками
- •Режимы, связанные с контрольными точками
- •Основные отладочные предикаты
- •Статистическая информация
Если мы введем
?- asserta (запись (верх)), assertz (запись (низ)).
то база данных примет вид:
запись (верх).
Запись (первая).
запись (вторая).
запись (низ).
Если затем мы введем
?- retract (запись (X)).
то получим
Х=верх
другие решения (да/нет)? да
Х=первая
другие решения (да/нет)? нет
В базе данных останутся
запись (вторая).
запись (низ).
Теперь напишем процедуру кратчайший_путь(А,Р) для построения кратчайшего пути в лабиринте из позиции А к выходу и запоминания его в списке Р. На рис.7.1.2 показано, в каком порядке генерируются пути. Заметим, что встроенный предикат length(L,N) находит длину N списка L.
/* Генерируем альтернативные пути и запоминаем
/* кратчайший путь, найденный к настоящему
/* моменту.
/* Вызываем состояние неудачи, если нет больше
/* альтернативных путей без повторного
/* посещения позиций:
кратчайший_путь(А,_) :-
asserta (короткий ([],99999)),
путь(А, Новый_путь, [A]),
length (Новый_путь, Новая_длина),
короткий (_, Старая_длина),
сравнить (Новый_путь, Новая_длина, Старая_длина).
/* Вызываем кратчайший_путь
кратчайший_путь(А,Р) :-
retract(короткий(P,L)).
/* Сохраняем новый путь, если он короче, чем
/* старый
сравнить (Новый_путь, Новая_длина, Старая_длина) :-
Новая_длина Старая_длина,
retract (короткий (_,_)),
asserta (короткий (Новый_путь, Новая_длина)),
fail.
Рис 7.1.2. Порядок генерации путей
7.3. Обработка фактов с помощью механизма возврата
Часто приходится выполнять некоторые операции над фактами, имеющими одинаковые главный функтор и арность. Например, нужно узнать первую компоненту следующих фактов:
запись (джим, 1).
запись (джек, 4).
запись(билл,6).
запись(фил,З).
Мы можем получить доступ ко всем записям, активизируя механизм возврата с помощью вызова состояния неудачи. Так, запрос
?- запись(Х,Y), write (X),nl,fail.
определит значения:
джим
джек
билл
фил
нет
Если требуется внести исправления в факты, то мы помещаем маркер в конец всех фактов и обрабатываем их до тех пор, пока не достигнем маркера. Приведенная ниже процедура именно таким образом добавляет единицу ко второй компоненте фактов запись:
доб_едии :- assertz(запись(poyг,0)),
retract(запись(Х,Y)),
сохр_запись(Х,Y).
сохр_запись(роуг,_).
сохр_запись(X,Y) :-
Z is Y+1,
assertz(запись(Х,Z)),fail.
Рис.7.2.1 показывает, как выглядят факты вида запись на различных этапах согласования доб_един.
запись(джим,1).
запись(джек,4).
запись(билл,6).
запись(фил,3).
запись(роуг,0). < Добавляется маркер.
запись(джек,4).
запись(билл,6). Выбирается первая запись,
запись(фил,3). добавляется единица ко второму
запись (роуг,0). аргументу, запись вносится в базу
данных и вызывается состояние
неудачи.
запись(джим,2). <
запись(билл,6). Включается механизм возврата
запись(фил,3). и выбирается вторая запись.
запись(роуг,0). Сохр_запись обрабатывает запись
и оказывается в состоянии неудачи.
запись(джим,2).
запись(джек,5). <
Процесс продолжается до тех пор, пока маркер не «поднимется к вершине» записей.
запись(джим,2). Включается механизм возврата
запись(джек,5). и выбирается запись-маркер.
запись(билл,7). На этот раз согласуются
запись(фил,4). сохр_запись и доб_един.
Рис.7.2.1. Согласование доб_един