
- •Глава 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"
- •Библиографические заметки
- •Упражнения
Обработка тела фразы
После унификации запроса с заголовком фразы интерпретатор переходит к телу этой фразы. Если тело фразы пустое (т. е. фраза является фактом), то запрос сразу же оказывается успешным. Если же тело фразы не пустое, то интерпретатор помещает в стек запросов каждую подцель, входящую в тело, и, в свою очередь, обрабатывает ее. Если все подцели из тела фразы будут успешно обработаны, то и весь исходный запрос будет успешным.
Тело правила "дядя"
Тело правила "дядя" образовано составным запросом «брат(джон, В)», «отец(В,W)». Первая подцель - «брат (джон, В)» - помещается в стек запросов так:
(4)
- Активные запросы — — Фразы программы —
? - дядя (джон, W). ------> дядя (джон,W). -
брат (джон. В),
отец (В, W).
? - брат (джон, В). ------> брат (даниэль, кеннет).
брат (джон, билл).
Теперь новый запрос - «брат (джон, В)» - является активным запросом. Исходный запрос — "дядя" - однако все еще находится в стеке в ожидании завершения обработки тела правила "дядя". Запрос "брат" теперь указывает на начало множества фраз "брат".
Если попытка унификации будет неудачной, то переход к следующей фразе
Если попытка унификации запроса с заголовком фразы закончится неудачей, то интерпретатор перейдет к анализу следующей фразы соответствующего множества. Этот процесс будет продолжаться до тех пор, пока не обнаружится фраза, которую можно будет унифицировать с запросом. Если интерпретатор достигнет конца множества фраз, не обнаружив фразу, поддающуюся унификации, то запрос завершится неудачей.
Обработка подцели "брат"
Интерпретатор предпринимает попытку унифицировать подцель «брат (джон, В)» с фразой «брат (данизль, кеннет)». Эта попытка заканчивается неудачей, так как «джон» не унифицируется с « даниэль». Затем интерпретатор переходит к анализу следующей фразы "брат":
(5)
- Активные запросы - - Фразы программы-
? - дядя (джон, W). ----- > дядя (джон, W): -
брат (джон, В),
отец (В, W).
брат (даниэль, кеннет).
? - брат (джон, В). - - - - - -> брат (джон, билл).
Запрос «брат (джон, В)» унифицируется с фразой «брат (джон, билл)», в результате чего конкретизируется переменная В. Эта переменная получает значение «билл». После выполнения данной унификации состояние интерпретатора станет таким:
(6)
- Активные запросы - - Фразы программы -
? -дядя (джон, W). ------> дядя (джон, W): -
брат (джон, билл),
отец (билл, W).
брат (даниэль, кеннет).
? - брат (джон, билл). ----- -> брат (джон, билл).
В результате последней унификации переменная В получает значение «билл». Это значение будет использоваться при каждом употреблении переменной В в правиле "дядя".
Подцель "брат" дает положительный результат
Фраза «брат (джон, билл)» является фактом (у нее пустое тело), поэтому подцель "брат" сразу же оказывается успешной. Теперь интерпретатор помещает в вершину стека вторую подцель правила "дядя"- «отец (билл. W)».
(7)
- Активные запросы - - Фразы программы -
? - дядя (джон, W). ------> дядя (джон. W): -
брат (джон, билл),
отец (билл, W).
брат (даниэль, кеннет).
? - брат (джон, билл). ------> брат (джон, билл).
? -отец (билл, W). -------> отец (билл, даниэль).
отец (билл, кеннет).