Понимание пролога(Understanding of a Prolog). 

Рассмотрим программу. 

 

parent(pam, bob). 

parent(tom, bob). 

parent(tom, liz). 

parent(bob, ann). 

parent(bob, pat). 

parent(mary, ann). 

parent(pat, juli). 

 

Данному множеству соответствует следующий граф. 

 

 

Image 

 

 

Допустим нас интересует, кто потомки pam? 

 

?- parent(pam, X),parent(X, Y). 

X = bob, 

Y = ann ; 

X = bob, 

Y = pat. 

 

 

С точки зрения графов это будет поиск предков и потомков. 

Приведем вариант кода для Matlab. 

 

 

desNodes = getdescendants(bg.nodes(6),2); 

set(desNodes,'Color',[1 .7 .7]); 

bg.view; 

get(getdescendants(bg.nodes(6),2),'ID') 

 

 

Соответствующий граф. 

 

Image 

В  Прологе мы можем искать предков следующими запросами. 

 

?- parent(Y, juli), parent(X, Y).  

 

Y = pat, 

X = bob . 

 

 

Для графов. 

 

ancNodes = getancestors(bg.nodes(3),2); 

set(ancNodes,'Color',[1 .7 .7]); 

bg.view; 

Image 

 

 

 

Так же все то можно делать в интерактивном режиме. 

 

В прологе можно ввести понятие - child, обратное к parent. 

 

Например. 

 

parent(pam, bob). 

parent(tom, bob). 

parent(tom, liz). 

parent(bob, ann). 

parent(bob, pat). 

parent(mary, ann). 

parent(pat, juli). 

child(Y, X) :- parent(X, Y). 

 

В данном случае child является дополнением к parent 

Обратное так же верно. Можно формально записать - child =not parrent. 

 parent(X, Y) - представляет собой упорядоченное множество, 

или две вершины грфа связаенные направленным ребром X->Y 

соответственно not(parent(X, Y))-> Y->X 

то есть граф child, будет определен теми же вершинами, но направление ребер изменится. 

 

 

Обратный граф not(parent) будет выглядеть следующим образом. 

 

Image 

 

Выполним предыдущие запросы. 

 

Image 

 

В обратном графе у pam нет потомков. 

Соответствеено у juli нет предков. 

 

Следовательно множество отношений, child(Y, X) :- parent(X, Y)., действительно является обратным к parent. 

 

Т.е. запрос 

 

?- child(X,bob). 

X = ann ; 

X = pat. 

 

В графах будет аналогичен, вопросу кто предки bob. 

 

В общем данное множество упорядоченно, то есть имеет вид. 

 

S := {[pam, bob], [tom, bob], [tom, liz], [bob, ann], [bob, pat], [mary, ann], [pat, juli]}
S := {[pam, bob], [tom, bob], [tom, liz], [bob, ann], [bob, pat], [mary, ann], [pat, juli]}
 

{[pam, bob], [tom, bob], [tom, liz], [bob, ann], [bob, pat], [mary, ann], [pat, juli]}
{[pam, bob], [tom, bob], [tom, liz], [bob, ann], [bob, pat], [mary, ann], [pat, juli]}
 

 

Принадлежит ли пара [pam, bob] данному множеству? 

 

 

evalb(`in`([pam, bob], S)); 1 

true 

Для пролога аналогичный запрос выглядит так. 

 

?- parent(pam, bob). 

true. 

 

 

Добавим еще одно отношение в базу данных, унарное, определяющее пол. 

 

male(tom). 

male(bob). 

female(ann). 

female(juli). 

female(liz). 

female(mary). 

female(pam). 

female(pat). 

mother(X, Y):-parent(X, Y), female(X). 

Это унарное отношение разбивающее множество на два класса. 

 

Image 

 

Наше множество разбито на две части. 

Соотношение mother(X, Y):-parent(X, Y), female(X). означает, что образуется класс матерей, в который входят только те элементы, которые являются родителями и при этом женского пола. 

С точки зрения теории графов, это означает, что образуется новый граф, где не рассматриваются родители мужчины(классы попарно не пересекаются). 

 

 

Image 

 

Кто мать juli? 

 

?- mother(X, juli).  

 

X = pat. 

 

 

Image 

Аналогично введение класса сестер, определенное как. 

sister(X, Y):- parent(Z,X),parent(Z,Y),female(X),female(Y),X\=Y. 

 

Этот класс определен как множество людей имеющих общего родителя, женского пола, и различных.  

 

 

Будет определяться графом, где есть всего две связанные вершины. 

 

Plot 

 

 

Соответственно, множество где нас не интересуют сестринские отношения будет дополнением для данного графа. 

Plot 

Так же несложно заметить, что существует путь от ann до pat,  и он единственный отвечающий заданным условиям.  

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

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

 

 

 

Vsoft(c).