Косвенные отношения

Правило "можно_путешествовать", приводимое далее, устанавливает косвенную связь между двумя городами. Такое косвенное отношение будет соблюдаться в том случае, если возможно путешествие из одного города в другой через третий - промежуточный — город.

можно_путешествовать (ГородА, ГородВ):—

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

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

В соответствии с приведенной выше базой данных "путешествие" правило "можно_путешествовать" даст положительный результат для городов Нью-Йорк и Портленд, так как можно добраться из Нью-Йорка в Бостон поездом компании Амтрак, а из Бостона — в Портленд на автобусе компании Грейхаунд.

Изображение отношений

Отношение "можно_путешествовать" для случая городов Нью-Йорк и Портленд можно представить графически, если изобразить каждый аргумент в виде точки, а каждый предикат - в виде стрелки, соединяющей точки. Это показано на рис. 1. 1.

1. 5. Процедуры Декларативная и процедурная семантика

Смысл фразы языка Пролог может быть понят либо с позиций декларативного подхода, либо с позиций процедурного подхода. До сих пор в данной главе обсуждался только декларативный смысл фраз. Декларативный смысл подчеркивает статическое существование отношений. Порядок следования подцелей в правиле не влияет на декларативный смысл этого правила.

Процедурная семантика

При процедурной трактовке Пролог-программы подчеркивается последовательность шагов, которые выполняет интерпретатор при обработке запроса. Таким образом, приобретает значение порядок следования подцелей в правиле. Множество фраз, имеющих одно и то же имя и одинаковое количество аргументов, можно рассматривать как процедуру, при этом запрос (или подцель правила) является вызовом процедуры. Когда интерпретатор обрабатывает запрос к процедуре, то он анализирует фразы, образующие процедуру, в том порядке, как они в ней представлены.

Два смысловых значения правила "можно_путешествовать"

Рассмотрим снова правило "можно_путешествовать", приведенное выше. Декларативная трактовка данного правила может быть такой:

Будет возможным совершить путешествие между

городами « ГородА» и « ГородВ», если

можно добраться из города «ГородА»

в промежуточный пункт « ГородБ»

и

можно добраться из города « ГородБ» в « ГородВ».

Процедурная трактовка этого же правила будет иной:

Для того чтобы найти способ, которым

можно добраться из города «ГородА» в «ГородВ»,

вначале

нужно найти способ передвижения из

города « ГородА» в промежуточный «ГородБ»,

затем

нужно найти способ передвижения из

города «ГородБ» в «ГородВ».

Версия программы "можно_путешествовать", состоящая из двух правил

Можно предложить новую версию программы "можно_путешествовать", состоящую из двух правил. Фраза (1) гласит, что отношение "можно_путешествовать2" будет соблюдаться в том случае, если существует фраза "путешествие", устанавливающая прямую транспортную связь между двумя нужными городами. Фраза (2) совпадает с приведенным ранее правилом "можно_путешествовать".

можно_путешествовать2 (ГородА, ГородВ):— % (1)

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

можно_путешествовать2 (ГородА, ГородВ):— % (2)

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

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

Считается, что между этими двумя правилами неявно присутствует соединитель "или". С декларативных позиций оба эти правила можно прочесть так:

Путешествие из города «ГородА» в «ГородВ» будет

возможным, если либо

1) существует прямая транспортная связь между этими городами, либо

2) можно совершить путешествие из городе «ГородА» в некоторый промежуточный пункт « ГородБ», а затем добраться из города « ГородБ» в «ГородВ».

Процедурная трактовка данных правил будет иной:

Для того чтобы найти способ добраться из города «ГородА» в «ГородВ», необходимо либо

1) найти прямую транспортную связь между городами, либо

2) найти вид транспорта, связывающий «ГородА» с промежуточным

пунктом « ГородВ», а затем

найти транспортную связь между городами «ГородБ» и «ГородВ».

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