Как кодировать предикаты относительно списков в генеалогическом прологе? - PullRequest
0 голосов
/ 15 октября 2018

Для основной программы пролога мы должны определить следующие предикаты: уже определенные предикаты (попытка)

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), 

Есть ли где-нибудь, куда я могу обратиться, чтобы помочь мне с этими предикатами?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...