Во-первых, мы создадим предикат, который может найти одного потомка.
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].