- •Глава 3 управление ходом выполнения программы
- •3. 1. Как выполняется запрос в прологе
- •Три семантические модели
- •Выполнение запроса
- •Правила, описывающие унификацию термов
- •Пример с программой "дядя"
- •Активация запроса
- •Унификация запроса
- •Обработка тела фразы
- •Обработка подцели "брат"
- •Обработка подцели "отец"
- •Неудача запроса и возврат назад
- •Поиск третьего ответа
- •Поиск несуществующих ответов
- •Выполнение запроса к правилу "регистрация"
- •Автоматический просмотр выполнения программы
- •3.2. Предикат "сократить" Пространство поиска запроса
- •Предикат "сократить" останавливает возврат назад
- •Влияние предиката "сократить" на составной запрос
- •Влияние предиката "сократить" на процедуру
- •Предикат "сократить" как подцель в составном запросе
- •Использование предиката "сократить" для того, чтобы сделать процедуру детерминированной
- •Применение предиката "сократить" для отбрасывания части пространства поиска
- •Ограничение сферы действия предиката "сократить"
- •Общее правило ограничения сферы действия предиката "сократить"
- •3. 3. Отрицание как неудача запроса Негативная информация
- •Предположение о замкнутости мира
- •Тогда и только тогда, когда
- •Предположение об открытости мира
- •Отрицание в явной форме
- •Пример процедуры, поведение которой соответствует предположению об открытости мира
- •3. 4. Встроенные предикаты, предназначенные для обеспечения ввода-вывода Побочные эффекты ввода-вывода
- •Пример запроса, в котором используется предикат "read"
- •3. 5. Встроенные предикаты, предназначенные для управления файлами
- •3. 6. Проверка типа терма
- •Использование предикатов "var" и "nonvar"
- •3. 7. Действия с текущей программой
- •Изменение значения факта
- •Алгоритм поиска с возрастом, в котором используется предикат "assert"
- •Процедура, которая учится у пользователя
- •Программа, которая модифицирует сама себя
- •3. 8. Компараторы
- •3. 9. Прочие встроенные предикаты
- •Программа ввода "вводполя"
- •3. 10. Операции Расширяемость синтаксиса языка Пролог
- •Инфиксная операция ",", обладающая правой ассоциативностью
- •Инфиксная операция, не обладающая свойством ассоциативности
- •Объявление операций
- •3. 11. Преобразование процедурного алгоритма в программу на языке пролог Сравнение поиска с возвратом и рекурсии
- •Цикл "пока"
- •Рекурсия
- •Поиск с возвратом
- •Применение предиката "findall"
- •Библиографические заметки
- •Упражнения
Правила, описывающие унификацию термов
Унификация термов регулируется приводимыми ниже правилами. Во всех примерах используется встроенный предикат =, который выполняет попытку унификации своих аргументов.
1) Переменная унифицируется с константой или структурой. В результате этого переменная становится конкретизированной, т. е. она принимает значение этой константы или структуры.
|? - Х=джон.
Х=джон
2) Переменная унифицируется с переменной, при этом обе они становятся одной и той же переменной.
|? -X=Y.
Х=_1
Y=_1
(_1 — это внутреннее имя и переменной X, и переменной Y.)
3) _унифицируется с чем угодно.
|? -джоан =_.
4) Константа унифицируется с константой, если они идентичны.
|? - джоан = джоан.
да
5) Структура унифицируется с другой структурой, если их имена одинаковы, а аргументы поддаются унификации.
|? -отец (джордж) =отец (Х).
Х = джордж
Пример с программой "дядя"
Для того чтобы показать процесс выполнения запроса, воспользуемся простой программой, состоящей из базы данных "отец", базы данных "брат" и правила "дядя".
отец (билл, даниэль).
отец (билл, кеннет).
брат (даниэль, кеннет).
брат (джон, билл).
дядя (U, N): -
брат (U, В),
отец (В, N).
В оставшейся части раздела будем попеременно концентрировать внимание то на общих действиях интерпретатора, то на конкретных событиях, происходящих при обработке запроса к правилу "дядя".
Активация запроса
После того как пользователь введет запрос, этот запрос помещается в вершину стека активных запросов. В этом случае говорят, что запрос активируется. Рассмотрим запрос к программе "дядя":
|? -дядя (джон, W).
Диаграмма, приводимая ниже, служит "моментальным снимком" состояния интерпретатора сразу после активации запроса "дядя (джон, W)".
(1)
— Активные запросы - — Фразы программы -
? -дядя (джон, W).
Как только в стеке появится запрос, интерпретатор приступит к поиску множества фраз с тем же самым именем предиката и с тем же количеством аргументов, что и у запроса. Если таких фраз нет, то запрос оказывается неудачным. Диаграмма (2) показывает запрос, указывающий на начало множества фраз "дядя":
(2)
— Активные запросы - — Фразы программы -
? -дядя (джон, W). ------> дядя (U, N): -
брат (U В),
отец (В, N).
Унификация запроса
Интерпретатор анализирует первую фразу множества фраз "дядя" и пытается унифицировать каждый аргумент запроса с соответствующим аргументом этой фразы. В нашем случае запрос "дядя" успешно унифицируется с заголовком правила "дядя". В результате унификации конкретизируется переменная U, которая получает значение «джон», а W и N становятся одной и той же неконкретизированной переменной. После того как переменная, расположенная в заголовке правила, будет унифицирована с другим термом, результат выполнения этих действий распространяется на каждый случай использования этой переменной в правиле. Диаграмма (3) показывает состояние интерпретатора сразу после данной унификации.
(3)
— Активные запросы — - Фразы программы -
? - дядя (джон, W). ------> дядя (джон, W): -
брат (джон. В),
отец (В, W).
