
- •Глава 1 факты и правила
- •1.1. Использование языка пролог
- •Вызов транслятора языка Пролог
- •Синтаксис различных версий Пролога
- •1. 2. Факты Части Пролог-программы
- •Форма записи фактов в Прологе
- •Ввод программы
- •3. Запросы к базе данных Составление запроса
- •Запросы с константами
- •Запросы с переменными
- •Выполнение запроса
- •Составные запросы
- •Переменная _
- •1. 4. Прав ила
- •Форма записи правила: Заголовок:— Тело
- •Правило, при определении которого используются переменные
- •Пример: база данных "путешествие"
- •Косвенные отношения
- •1. 5. Процедуры Декларативная и процедурная семантика
- •Версия программы "можно_путешествовать", состоящая из двух правил
- •Запросы к предикату "можно_путешествовать2"
- •Соединитель "или"
- •Версия предиката "можно_путешествовать", в которой употребляется соединитель;
- •1. 6. Рекурсивные процедуры Определение понятия рекурсии
- •"Предок"
- •Состав рекурсивной процедуры
- •Рекурсивная версия процедуры "можно_путешествовать"
- •Порядок выполнения запроса к процедуре "можно_путешествовать4"
- •1. 7. Типы отношений Характеристики отношений
- •Ограничения вида один-к-одному
- •Ограничения вида один-к-многим
- •Ограничения вида многие-к-одному
- •Ограничения вида многие-к-многим
- •Симметрия
- •Асимметрия
- •Рефлексивность и нерефлексивность
- •Транзитивность
- •Анализ общеупотребительных отношений
- •Библиографические заметки
- •Упражнения
Запросы к предикату "можно_путешествовать2"
При обработке запроса к предикату "можно_путешествовать2" интерпретатор вначале проверяет фразу (1). Если фраза (1) дает отрицательный ответ, то интерпретатор переходит к проверке фразы (2).
|?— можно_путешествовать2 (нью_йорк, Вашингтон).
да % ответ получен по фразе (1)
|?— можно_путешествовать2 (нью_йорк, портленд).
да % ответ получен по фразе (2)
Как обрабатывается запрос
Обработку последнего запроса можно представить в виде эквивалентной последовательности запросов. Для наглядности запросы, соответствующие подцелям правил, выделены отступом.
|? - можно_путешествовать2 (нью_йорк, портленд).
% первая подцель первого правила "можно_путешествовать2"
|?— путешествие (_, нью_йорк, портленд, _).
нет
% первая подцель второго правила "можно_путешествовать2"
|? - путешествие (_, нью_йорк, ГородБ, _).
ГородБ = бостон
% вторая подцель второго правила "можно_путешествовать2"
|? — путешествие (_, бостон, портленд, _).
да
да
Последний ответ да и будет ответом на исходный запрос к предикату "можно_путешествовать2".
Соединитель "или"
В рассмотренных до сих пор телах правил подцели связывались друг с другом посредством соединителя "и", обозначаемого символом, (запятая). Можно также связывать подцели (или множества подцелей) соединителем "или", который обозначается символом; (точка с запятой). В некоторых версиях языка Пролог используется альтернативное обозначение соединителя "или" – символ |.
Составные запросы, в которых употребляется символ;
Рассмотрим запрос:
|? - a (X), b (X, Y); c (Z).
Для того чтобы этот составной запрос оказался истинным, нужно либо чтобы одновременно две подцели — а (Х) и b (X, Y) — были истинными, либо чтобы подцель c (Z) была истинной. Если подцель а (X) потерпит неудачу, то интерпретатор пропустит подцель b (X, Y) и попытается обработать подцель с (Z).
Еще один пример употребления символа; приводится ниже:
|? - жена (Ж, джордж), богатый (Ж); богатый (джордж).
Запрос будет истинным, если либо у Джорджа есть жена и она богата, либо если Джордж сам богат. Если подцель «жена (Ж, джордж)» потерпит неудачу, то интерпретатор не будет обрабатывать подцель «богатый (Ж)», а сразу же перейдет к рассмотрению подцели, стоящей за символом;, т. е. к подцели « богатый (джордж)».
Совместное использование соединителей, и;
Соединитель "и", обозначаемый символом,, группирует подцели более тесно, чем соединитель "или", обозначаемый символом;. В следующих примерах А, Б, В и Г обозначают произвольные подцели. В выражениях, стоящих в правом столбце, скобки показывают подразумеваемое группирование.
%это: означает то же самое, что и:
А; Б, В. А; (Б. В).
А, Б; В. (А, Б); В.
А, Б; В, Г. (А, Б); (В, Г).
А; Б, В; Г. А; ((Б, В); Г).
Подразумеваемое группирование подцелей, соединенных символами; и , всегда можно изменить при помощи скобок.
Версия предиката "можно_путешествовать", в которой употребляется соединитель;
Процедуру "можно_путешествовать2" можно переопределить и свести к одному правилу при помощи соединителя "или":
можно_путешествовать3 (ГородА, ГородВ): -
путешествие (_, ГородА, ГородВ, _)
;
путешествие (_, ГородА, ГородБ, _),
путешествие (_, ГородБ, ГородВ, _).
Для чего пользуются символом;?
Когда интерпретатор встречает приведенную выше программную конструкцию, он преобразует ее в два правила, аналогичные процедуре "можно_путешествовать", текст которой был дан на одной из предыдущих страниц. В некоторых случаях употребление символа; улучшает читабельность программы, так как оно позволяет обойтись одним правилом вместо нескольких либо устраняет необходимость написания нового предиката для принятия единственного решения.