Пролог домашняя помощь - PullRequest
0 голосов
/ 05 марта 2010

Хорошо, мой последний вопрос по прологу.Это общая проблема генеологии.

Я полагаю, что взять список фактов и иметь функцию под названием Потомок, которая будет возвращать список, который имеет всех потомков.Например:

С учетом правил:

parent('Bob', 'Tim').
parent('Joe', 'Bob').

Вызов функции:

    descendant('Joe', X).

должен вернуть:

        X = ['Bob', 'Tim'].

Я могу получитьэто вернуть непосредственного потомка «Джо», но не полную строку.Вот что у меня есть.

 % Recursive case
  descendant(X,DList) :- parent(X,A), NewDList = [A|DList], 
                         descendant(A, NewDList).
 % Base case, I have a feeling this is wrong.
  descendant(_,[]).

Этот код, кажется, только возвращает true или false, или просто пустой [].

Я мог бы использовать некоторую помощь в том, что мне, возможно, нужно посмотреть,Спасибо.

Ответы [ 3 ]

1 голос
/ 05 марта 2010

Во-первых, мы создадим предикат, который может найти одного потомка.

descendant(X, Y) :- parent(X, Y).
descendant(X, Y) :- parent(X, Z), descendant(Z, Y).

Затем мы можем использовать предикат findall для вывода списка всех потомков:

descendants(X, L) :- findall(A, descendant(X, A), L).

Так, например:

parent(bob, tim).
parent(joe, bob).
parent(joe, mary).

descendant(X, Y) :- parent(X, Y).
descendant(X, Y) :- parent(X, Z), descendant(Z, Y).

descendants(X, L) :- findall(A, descendant(X, A), L).

дает:

?- descendants(joe, X).
X = [bob, mary, tim].
0 голосов
/ 05 марта 2010
parent('Bob', 'Tim').
parent('Joe', 'Bob').

descendant(X,[H|T]) :- parent(X,H), descendant(H, T).
descendant(X,[]) .

возвращает

?- descendant('Joe', L).
L = ['Bob', 'Tim'] ;
L = ['Bob'] ;
L = [].

на самом деле трудно написать предикат, который будет возвращать только ['Bob', 'Tim'], потому что список ['Bob'] также допустим. если вы решите оставить только самую длинную цепь, она станет слишком сложной

если я неправильно понял вопрос, вот одна из версий:

desc(X, A) :- parent(X,H), desc(H, A).
desc(X, A) :- X = A.
0 голосов
/ 05 марта 2010

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

Я просто укажу, что у вас не должно быть этого оператора присваивания - NewDList = [A | DList] - это считается плохой формой в стиле программирования Prolog - присваивания должны использоваться только там, где их нет «чистое» логическое решение - конечно, дело не в этом.

Ура, Крейг.

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