Пролог-программы: родственные отношения
Сущности предметной области – люди. Предикат parent(X,Y) обозначает бинарное отношение "X родитель Y".
parent(pam,bob).
parent(tom,bob).
parent(tom,liz).
parent(bob,ann).
parent(bob,pat).
parent(pat,john).
Диалог с интерпретатором:
?- parent(bob,pat).
Yes
?- parent(liz,pat).
No
?- parent(tom,sid).
No
?- parent(X,liz).
X = tom
Yes
?- parent(bob,X).
X = ann
Yes
Вводя ";" после ответа Пролога (вместо Enter), мы заставляем интерпретатор продолжить поиск ответа.
?- parent(bob,X).
X = ann ;
X = pat ;
No
?- parent(X,Y).
X = pam
Y = bob ;
X = tom
Y = bob ;
X = tom
Y = liz ;
X = bob
Y = ann ;
X = bob
Y = pat ;
X = pat
Y = john ;
No
Кто является родителем родителя Джона?
?- parent(Y,john),parent(X,Y).
X = bob
Y = pat
Yes
Кто внуки Тома?
?- parent(tom,X),parent(X,Y).
X = bob
Y = ann ;
X = bob
Y = pat ;
No
Использование анонимных переменных ("_").
Кто имеет детей?
?- parent(X,_).
X = pam ;
X = tom ;
X = tom ;
X = bob ;
X = bob ;
X = pat ;
No
Добавим теперь в нашу программу-пример еще несколько родственных отношений. Предикат women(X) обозначает свойство "X – женщина". Предикат mother(X,Y) обозначает отношение "X – мать Y".
women(pam).
women(liz).
women(ann).
women(pat).
mother(X,Y):-
women(X),
parent(X,Y).
?- mother(X,Y).
X = pam
Y = bob ;
X = pat
Y = john ;
No
Рекурсивное определение правил.
Предикат predok(X,Y) обозначает отношение "X – предок Y".
predok(X,Y) :-
parent(X,Y).
predok(X,Y) :-
parent(X,Z),
predok(Z,Y).
?- predok(X,john).
X = pat ;
X = pam ;
X = tom ;
X = bob ;
No
Факты существуют только там, где отсутствуют люди. Когда люди появляются, остаются одни интерпретации.
Станислав Лем. Расследование