Понимание пролога(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).
Данному множеству соответствует следующий граф.
Допустим нас интересует, кто потомки 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')
Соответствующий граф.
В Прологе мы можем искать предков следующими запросами.
?- parent(Y, juli), parent(X, Y).
Y = pat,
X = bob .
Для графов.
ancNodes = getancestors(bg.nodes(3),2);
set(ancNodes,'Color',[1 .7 .7]);
bg.view;
Так же все то можно делать в интерактивном режиме.
В прологе можно ввести понятие - 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) будет выглядеть следующим образом.
Выполним предыдущие запросы.
В обратном графе у pam нет потомков.
Соответствеено у juli нет предков.
Следовательно множество отношений, child(Y, X) :- parent(X, Y)., действительно является обратным к parent.
Т.е. запрос
?- child(X,bob).
X = ann ;
X = pat.
В графах будет аналогичен, вопросу кто предки bob.
В общем данное множество упорядоченно, то есть имеет вид.
Принадлежит ли пара [pam, bob] данному множеству?
Для пролога аналогичный запрос выглядит так.
?- 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).
Это унарное отношение разбивающее множество на два класса.
Наше множество разбито на две части.
Соотношение mother(X, Y):-parent(X, Y), female(X). означает, что образуется класс матерей, в который входят только те элементы, которые являются родителями и при этом женского пола.
С точки зрения теории графов, это означает, что образуется новый граф, где не рассматриваются родители мужчины(классы попарно не пересекаются).
Кто мать juli?
?- mother(X, juli).
X = pat.
Аналогично введение класса сестер, определенное как.
sister(X, Y):- parent(Z,X),parent(Z,Y),female(X),female(Y),X\=Y.
Этот класс определен как множество людей имеющих общего родителя, женского пола, и различных.
Будет определяться графом, где есть всего две связанные вершины.
Соответственно, множество где нас не интересуют сестринские отношения будет дополнением для данного графа.
Так же несложно заметить, что существует путь от ann до pat, и он единственный отвечающий заданным условиям.
В общем подобные задачи можно решать путем поиска путей отвечающих заданным условиям, что собственно Пролог и делает.
Следует отметить гибкость и мощность Пролога при работе с множествами данных и удобный механизм классификации.
Vsoft(c).