- •Глава 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"
- •Библиографические заметки
- •Упражнения
Глава 3 управление ходом выполнения программы
3. 1. Как выполняется запрос в прологе
Три семантические модели
В гл. 0 было сказано, что существуют три различные семантические модели, предназначенные для трактовки Пролог-программ: декларативная модель, процедурная модель и модель в виде абстрактной машины. В декларативной модели смысл предиката - это определение статического отношения между термами. Для этой модели порядок следования условий в правиле не важен. Процедурная модель определяет смысл правила как серию вызовов подпрограмм, что позволяет объяснить действие правил, в которых важно учитывать порядок следования подцелей. Модель в виде абстрактной машины сходна с бихевиористическими семантическими моделями других языков программирования. В ней специфицируется поведение интерпретатора при выполнении конструкций языка Пролог. Эта модель дает возможность точно описывать побочные эффекты ввода-вывода и управления в Пролог-программах.
Декларативная и процедурная модели были рассмотрены в гл. 1. В данном разделе рассказывается о работе модели в виде абстрактной машины. Работа этой машины поясняется через операции над стеком активных запросов. Вначале будет показано, как абстрактная машина выполняет Пролог-программу, в которой отсутствуют побочные эффекты управления. Затем рассматривается то, как управляющие конструкции, такие как сократить (cut) и повторить (repeat), влияют на работу абстрактной машины.
Выполнение запроса
Работу интерпретатора языка Пролог можно трактовать как рекурсивный циклический процесс унификации (т. е. сопоставления с эталоном) и вычисления подцелей. Действия интерпретатора инициируются запросом. В ходе выполнения этих действий интерпретатор "опустится" в структуру текущей программы настолько глубоко, насколько это окажется необходимым для того, чтобы найти факты, требующиеся для определения истинностного значения запроса. Затем интерпретатор вернется в исходное состояние, доказав или оказавшись не в состоянии доказать истинность запроса.
После того как пользователь вводит запрос интерпретатору, этот запрос активируется. Интерпретатор приступает к анализу фраз текущей программы в поисках первой фразы, заголовок которой будет унифицироваться с запросом. Для того чтобы запрос унифицировался с заголовком фразы, нужно совпадение у них имени предиката и количества аргументов и то, чтобы все их аргументы унифицировались. Правила, описывающие унификацию термов, приводятся ниже.
Активация согласующейся фразы
После того как фраза, унифицирующаяся с запросом, будет обнаружена, она активируется. При этом каждая подцель, входящая в тело фразы, обрабатывается точно так же, как и исходный запрос. Если тело унифицирующейся фразы является пустым (т. е. она представляет собой факт), то запрос сразу же оказывается успешным. Если интерпретатор не сможет найти в базе данных фразу, унифицирующуюся с целью, то он возвратится назад. Он возвращается к последней успешной подцели, ликвидирует конкретизацию любых переменных, явившуюся результатом успешной обработки этой подцели, и приступает к поиску в множестве фраз текущей программы заголовка другой фразы, которая унифицируется с данной подцелью.
Успешное выполнение
При успешном выполнении запроса пользователя интерпретатор выводит на терминал значения всех тех переменных, входящих в состав запроса, которые были конкретизированы в результате процесса обработки, или слово да, если переменные в запросе отсутствовали. Если пользователь введет символ; после того, как интерпретатор нашел ответ, то это будет эквивалентно отказу от полученного ответа. Интерпретатор вернется назад и попытается найти иной ответ.