База данных “ путешествие ” содержит факты, каждый из которых имеет по три аргумента. Каждый факт устанавливает, что можно совершить путешествие из одного города (1-й аргумент) в другой город (2-й аргумент) воспользовавшись некоторым видом транспорта (3-й аргумент).
путешествие(белгород, орел, поезд).
путешествие(брянск, дятьково, автобус).
путешествие (губкин, белгород, автобус).
путешествие(орел, брянск, поезд).
Два правила “ можно_путешествовать ” устанавливают либо прямую, либо косвенную связь между двумя городами. Косвенное отношение будет соблюдаться в том случае, если возможно путешествие из одного города в другой через третий – промежуточный город.
можно_путешествовать(A,B):- путешествие (А, B,_).
можно_путешествовать(A,B):- путешествие(A, С,_),
путешествие (С, B,_).
Считается, что между этими двумя правилами неявно присутствует соединитель “ или ”. С декларативных позиций оба этих правила можно прочесть так: путешествие из города А в город B будет возможным, если
существует прямая транспортная связь между этими городами, либо можно совершить путешествие из города А в некоторый промежуточный пункт С, а затем добраться из города С в город В.
|
|
Процедурная трактовка данных правил будет иной:
Для того, чтобы найти способ добраться из города А в город B, необходимо либо найти прямую транспортную связь между городами, либо найти вид транспорта, связывающий город А и город C, а затем найти транспортную связь между городами С и B.
Пример 12.
Следующий запрос к базе данных можно_путешествовать:
Есть ли транспортная связь между городами Губкин и Орел?
?- можно_путешествовать(губкин, орел).
Yes
Ответ получен по второй фразе.
При обработке этого запроса интерпретатор вначале проверяет первую фразу. Если первая фраза дает отрицательный ответ, то интерпретатор переходит к проверке второй фразы.
Обработку последнего запроса можно представить в виде эквивалентной последовательности запросов:
?−можно_путешествовать(губкин, орел).
% первая подцель первого правила “можно_путешествовать”
?- путешествие (губкин, орел,_).
no
% первая подцель второго правила “можно_путешествовать”
?- путешествие (губкин, С,_).
С = белгород
% вторая подцель второго правила “можно_путешествовать”
?- путешествие (белгород, орел,_).
yes