Запросы к предикату "можно_путешествовать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 (ГородА, ГородВ): -

путешествие (_, ГородА, ГородВ, _)

;

путешествие (_, ГородА, ГородБ, _),

путешествие (_, ГородБ, ГородВ, _).

Для чего пользуются символом;?

Когда интерпретатор встречает приведенную выше программную конструкцию, он преобразует ее в два правила, аналогичные процедуре "можно_путешествовать", текст которой был дан на одной из предыдущих страниц. В некоторых случаях употребление символа; улучшает читабельность программы, так как оно позволяет обойтись одним правилом вместо нескольких либо устраняет необходимость написания нового предиката для принятия единственного решения.

Соседние файлы в папке Гл.0,1,2,3,4,5,Предисловие