使用prolog查找所有一对祖父关系



如果您有以下事实:

parent(albert, bob).
parent(albert, betsy).
parent(albert, bill).
parent(alice, bob).
parent(alice, betsy).
parent(alice, bill).
parent(bob, carl).
parent(bob, charlie).

然后这个代码:

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

如何编写查询以查找共享的所有对祖父母关系?

基本查询如下所示:

?- grand_parent(X,Y).

给出以下输出(在一个回答之后;将显示下一个(:

X = carl,
Y = albert;
X = carl,
Y = alice;
X = charlie,
Y = albert;
X = charlie,
Y = alice;
false.

然而,如果你想拥有一个特定人的所有孙子,你可以自己编程";find_all_grandchillen&quot-谓词,或者只使用内置谓词来收集所有答案。示例:

?- findall(Y,grand_parent(carl,Y),X).
X = [albert, alice].

其读作:找到满足grand_parent(carl,Y)的每个项Y,并将其放入列表X中。

使用SWISH进行测试。

正确处理数据模型非常重要。

您可能会发现更改数据模型以更好地表示真实世界的模型非常有用。类似的东西

parents( carol, bob, jim ).

也就是说,carolbob分别是jim的母亲和父亲。

一旦你有了这些东西:

mother(M,C) :- parents(M,_,C).
father(F,C) :- parents(_,F,C).
child(P,C) :- mother(P,C).
child(P,C) :- father(P,C).
child(M,F,C) :- parents(M,F,C).
children(P,Cs) :- findall( C , child(P,C), Cs).
children(M,F,Cs) :- findall( C, child(M,F,C), Cs).
family(M,F,[M,F|Cs]) :- children(M,F,Cs).
sibling(S,C) :- parents(M,F,C), parents(M,F,S).
grandparents(GM,GF,C) :- mother(M,C), parents(GM,GF,M).
grandparents(GM,GF,C) :- father(F,C), parents(GM,GF,F).

现在,要获得所有祖父母对的列表很简单:

all_grandparents(GPs) :- findall( GM:GF, grandparents(GM,GF,_), GPs ).

最新更新