序言中的家庭关系:descendantTree

时间:2018-10-13 06:37:08

标签: 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).
parent(mary, adam).
parent(henry, helen).

我所期望的是:

L =[john,[paul,[henry,[helen]],[june]],[mary,[adam]]]

但实际上它只是返回:

L = [john, _9250].

你能告诉我为什么吗?

1 个答案:

答案 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/3setof/3findall/3,然后考虑根据发现来修改问题。< / p>