Для основной программы пролога мы должны определить следующие предикаты: уже определенные предикаты (попытка)
a) ancestor(X,Y)
, что означает, что X
является предком Y
, т.е.X
является родителем Y
или X
является предком того, кто является родителем Y
;
b) общего ancestor(X,Y,Z)
, что означает, что X
является общим предкомY
и Z
, т. е. X
является предком обоих Y
и Z
;
c) ближайшего общего ancestor(X,Y,Z)
, означающего, что X
является ближайшим общим предкомY
и Z
, т. е. X
является общим предком Y
и Z
, а ни один из потомков X
не является общим предком Y
и Z
;
Предикаты не определены:
1) ancestorList(X,Y,L)
, где указано, что если X
является предком Y
, а L
является списком потомковX
(т. Е. Люди, чей предок X
), являющиеся предками Y
, упорядоченные от ближайшего к дальнему от X
;Например, если Джон является родителем paul
, который является родителем henry
, который является родителем helen
, тогда ancestorList(john,helen,L)
должен быть успешным с возвращением L = [paul,henry]
;
2) descendantTree(X,L)
, который содержит iff L
- это структура списка, представляющая дерево всех потомков X
;каждый узел в дереве потомков должен быть представлен списком, первый элемент которого является меткой узла, а остальные элементы являются представлениями его дочерних элементов, если таковые имеются;Например, если дети Джона paul
и mary
, paul
дети henry
и june
, henry
, единственный ребенок helen
, mary
единственный ребенок adam
, и ни adam
, ни june
, ни helen
не имеют дочерних элементов, тогда descendantTree(john,L)
должно преуспеть с возвращением
L =
[john,
[paul,
[henry,
[helen]
],
[june]
],
[mary,
[adam]
]
]
(отступы и разрывы строк были добавлены здесь для удобства чтения, новаша программа не должна этого делать).
Я просто немного запутался в том, как запускать определенные предикаты.Вот список предикатов, которые у меня есть на данный момент:
child(X,Y) :- parent(Y,X).
not(P):- call(P), !, fail.
not(P).
ancestor(X,Y):- parent(X,Y).
ancestor(X,Y):- parent(Z,Y), ancestor(X,Z).
common_ancestor(X,Y,Z):- ancestor(X,Y), ancestor(X,Z).
closest_common_ancestor(X,Y,Z):-
common_ancestor(X,Y,Z),
\+(child(P,X),common_ancestor(P,Y,Z)).
ancestorList(X,Y,L):- ancestor(X,Y),
Есть ли где-нибудь, куда я могу обратиться, чтобы помочь мне с этими предикатами?
Спасибо!