Логическое программирование

       

Пролог-программы: родственные отношения


Сущности предметной области – люди. Предикат 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 

 

Факты существуют только там, где отсутствуют люди. Когда люди появляются, остаются одни интерпретации.

Станислав Лем. Расследование



Содержание раздела