Prolog 序言中的家族关系:后代树

Prolog 序言中的家族关系:后代树,prolog,Prolog,我希望在列表结构中递归地存储一个族关系。我有以下代码: descendantTree(X,[X]) :- \+ parent(X,_). descendantTree(X,L) :- forall(parent(X,Y), descendantTree(Y,YL)), append([X],[YL],L). parent(john, paul). parent(john, mary). parent(paul, henry). parent(paul, june).

我希望在列表结构中递归地存储一个族关系。我有以下代码:

descendantTree(X,[X]) :-
    \+ parent(X,_).

descendantTree(X,L) :-
    forall(parent(X,Y), descendantTree(Y,YL)),
    append([X],[YL],L).

parent(john, paul).
parent(john, mary).
parent(paul, henry).
parent(paul, june).
parent(mary, adam).
parent(henry, helen).
我所期望的是:

L =[john,[paul,[henry,[helen]],[june]],[mary,[adam]]]
但实际上它只是返回:

L = [john, _9250].

您能告诉我为什么吗?

forall/2谓词使用否定实现生成和测试循环。它可以定义为:

% for all solutions of Generate, Test is true
forall(Generate, Test) :-
    \+ (Generate, \+ Test)).
使用否定表示调用成功时不会返回任何绑定。在您的情况下,这意味着您正在呼叫:

append([X],[_],L)
因此,您得到的结果是:

L = [john, _9250].

查找谓词的所有解族:<代码> BAGO/3 ,<代码> SET/OS/<代码>,和<代码> FUNDALL/3 ,然后考虑用问题发现编辑您的问题。