我想将家庭关系递归存储在列表结构中。我有以下代码:
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].
你能告诉我为什么吗?
答案 0 :(得分:0)
forall/2
谓词使用求反来实现生成和测试循环。可以定义为:
% for all solutions of Generate, Test is true
forall(Generate, Test) :-
\+ (Generate, \+ Test)).
使用否定表示调用成功后将不返回任何绑定。就您而言,这意味着您在打电话:
append([X],[_],L)
因此,您得到的结果:
L = [john, _9250].
取而代之的是 all-solutions 谓词家族:bagof/3
,setof/3
和findall/3
,然后考虑根据发现来修改问题。< / p>