- •Глава 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. Отрицание как неудача запроса Негативная информация
Информация о фактах, которые не являются истинными, или об отношениях, которые не соблюдаются, называется негативной. Обычно негативная информация не хранится в Пролог-программах в явной форме. Вместо этого считается, что вся информация, отсутствующая в текущем множестве фраз, ложна. Это эквивалентно предположению о том, что всегда имеет силу следующее правило:
Если фраза Р не представлена в текущей программе, то считается, что представлено отрицание Р.
Предположение о замкнутости мира
С практической точки зрения это означает, что интерпретатор не может отличить неизвестную фразу от доказуемо неистинной фразы. Правило, приведенное выше, известно как предположение о замкнутости мира. Множество фраз текущей программы называется миром. Это - замкнутый мир, поскольку интерпретатор ведет себя так, как будто бы в этом мире содержатся все возможные знания. Предположение о замкнутости мира является результатом действия неявного предиката метаязыка, описывающего смысл запроса в языке Пролог (см. разд. 0. 9).
Тогда и только тогда, когда
Вследствие того, что предполагается замкнутость мира, множество фраз, определяющих отношение, имеет металингвистический смысл, несколько отличающийся от его смысла с позиций объектного языка. Предположим, к примеру, что в программе представлены три фразы "начальник":
начальник (джордж).
начальник (гарри).
начальник (нэнси).
На уровне объектного языка смысл этих фраз следующий:
Х является начальником, если
Х - это « Джордж» или
Х - это « Гарри» или
Х - это «Нэнси».
Однако из-за предположения о замкнутости мира фактический смысл этих трех фраз на уровне метаязыка будет несколько иным:
Х является начальником тогда и только тогда, когда
Х — это « Джордж» или
Х - это «Гарри» или
Х-это «Нэнси».
Член "только тогда" появляется вследствие предположения о замкнутости мира.
Предположение об открытости мира
При работе с неизвестной информацией альтернативой предположению о замкнутости мира служит предположение об открытости мира:
Если фраза Р отсутствует в текущей программе, то считается, что Р ни истинна, ни ложна.
В соответствии с предположением об открытости мира запрос может обладать одним из трех допустимых истинностных значений: истина, ложь или неизвестно. Если запрос признан неизвестным, то программа может предпринять какие-то особые действия, скажем, она может обратиться к альтернативному источнику знаний. По умолчанию интерпретатор языка Пролог руководствуется предположением о замкнутости мира. Поэтому если требуется, чтобы поведение программы соответствовало предположению об открытости мира, то это нужно выражать в явном виде при составлении программы. Составление такой программы равнозначно изменению неявного предиката метаязыка, описывающего смысл запроса.
Отрицание в явной форме
Встроенный предикат "not" ("не"), который в некоторых версиях языка Пролог записывается как "\+", имеет один аргумент. Этим аргументом является запрос, значение истинности которого (после обработки данного запроса) заменяется на противоположное. Если запрос успешен, то отрицание этого запроса является неудачей и, наоборот, если запрос терпит неудачу, то его отрицание будет успехом. Запрос:
|? -not (отец (питер, Х)). % (1)
будет истинным тогда и только тогда, когда
|? - отец (питер, X). % (2)
потерпит неудачу.
Квантификация переменных в запросе с предикатом "not"
Как отмечалось в разд. 1. 3, переменная Х в запросе (2), приведенном выше, квалифицирована экзистенциально. Запрос (2) соответствует вопросу:
Существует ли некоторый X, для которого Питер является отцом?
С другой стороны, переменная Х в запросе (1) квантифицирована универсально. Запрос (1) соответствует вопросу:
Является ли Питер не-отцом?
(или: Для любого X, является ли Питер не-отцом X?)
Заметьте, что для проверки этого положения требуется отыскание только одного значения Х (означающее кого-либо, кому Питер на самом деле является отцом), при котором запрос (1) потерпит неудачу. Обратите внимание, что квалификация переменных всегда изменяется на обратную (т. е. из экзистенциальной превращается в универсальную и наоборот), если фраза подвергается отрицанию.
Пример использования предиката "not "
Напишем правило, определяющее сельского жителя как человека, который не является ни горожанином, ни жителем пригорода.
горожанин (джейк).
житель_пригорода (сюзан).
сельский_житель (Х):—
not (горожанин (X)),
not (житель_пригорода (X)).
Какой ответ Вы ожидаете получить на запрос:
|?— сельский_житель (билл).?
