
- •Предисловие
- •Глава 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. Установка контрольных точек
- •Возможные действия в контрольной точке
- •Включение и выключение режима контрольных точек
- •Необязательные параметры режима контрольных точек
- •Предикаты для работы с контрольными точками
- •Режимы, связанные с контрольными точками
- •Основные отладочные предикаты
- •Статистическая информация
8.2. Использование отсечения
Отсечение применяется для устранения бесконечных циклов, при программировании взаимоисключающих утверждений и при необходимости неудачного завершения доказательства цели. Продемонстрируем все три случая на примерах.
Пример 8.1. Устранение бесконечных циклов. Вновь обратимся к утверждениям, определяющим последовательность Фибоначчи (см. гл. 4)
Фиб(0,_,1).
Фиб(1,1,1).
Фиб(N,F1,F2) :-
М is N-1,
Фиб(М,F0,F1),
F2 is F0+Fl.
Выдав запрос
?- Фиб(0,_,F2).
получим:
F2=1
другие решения (да/нет)?
Если мы ответим «да», то Пролог сделает попытку сопоставить с запросом второй факт и потерпит неудачу. Однако сопоставление головы третьего утверждения с запросом происходит успешно и осуществляется попытка доказать цель Фиб(-1,F0,F1), что в свою очередь приводит к цели Фиб(-2,..,..) и так далее, т.е. образуется бесконечный цикл.
К счастью, мы можем устранить такие ситуации, используя отсечение и тем самым указывая Прологу, что не существует других решений в случае успешного согласования граничного условия.
Фиб(0,_,1) :- !.
Фиб(1,1,1) :- !.
Фиб(N,F1,F2) :-
М is N-1,
Фиб(М,F0,F1),
F2 is F0+F1.
Учитывая данное определение Фиб и задав вопрос
?- Фиб(0,_,F2).
получим:
F2=1
На дополнительный запрос
другие решения (да/нет) ? да
Пролог даст ответ
Других решении нет
Пример 8.2. Программирование взаимоисключающих утверждений. Напишем целевое утверждение, которое рассматривает в качестве аргумента экзаменационную оценку студента в интервале от 0 до 100 и определяет степень согласно следующим критериям:
Критерий Степень
Оценка > = 80 A
80 > Оценка > = 60 B
60 > Оценка > = 40 C
40 > Оценка D
Запишем данные условия на Прологе, не применяя отсечение:
степень(М,'А') :- М >= 80.
степень(М,'В') :-М < 80,М >= 60.
степень(М,'С') :- М < 60,М >= 40.
степень(M,'D') :- М < 40.
Теперь разберем процесс доказательства запроса
?-стенень,(50,6).
при G = 'С'.
Голова первого утверждения сопоставляется с запросом, но Пролог терпит неудачу при доказательстве тела утверждения: 50 >= 80. Поэтому первое утверждение не может быть согласовано. Пролог пытается доказать второе утверждение. Его голова сопоставляется с целью, проверка условия 50 < 80 осуществляется успешно, но проверка второго условия в теле: 50 >= 60, заканчивается неудачей. Пролог переходит к доказательству третьего утверждения. Его голова сопоставляется с целью, и на этот раз проверка условия в теле также завершается успешно, если G принимает значение ‘С’.
Обратим внимание на следующий момент. Доказательство первого утверждения заканчивается неудачей из-за того, что не выполняется условие М >= 80. Однако при рассмотрении второго утверждения все же будет осуществляться проверка М < 80, хотя результат данного сравнения вытекает из неудачи доказательства первого утверждения. Аналогично в третьем утверждении проверяется условие М < 60, хотя оно следует из неудачи доказательства второго утверждения. Такое дублирование проверок приводит к неэффективности работы программы.
Если мы опустим перекрывающиеся условия, то определение процедуры примет вид:
степень(М,'А') :- М >= 80.
степень(M, 'В') :- М >= 60.
степень(М, 'С') :- М >= 50.
степень(М, 'D').