我有一个知识库
parent(dad, son).
parent(mom, son).
parent(dad, daughter).
parent(mom, daughter).
我有功能
mother/2
father/2
child/2
按预期工作,但是当我使用兄弟
时sibling(X,Y):-
parent(Z,X),
parent(Z,Y),
not(X=Y).
输出重复
?- sibling(X,Y).
X = son,
Y = daughter ;
X = daughter,
Y = son ;
X = son,
Y = daughter ;
X = daughter,
Y = son ;
我明白为什么会重复,我的问题是如何将它限制为只有1对非重复? 如在
?- sibling(X,Y).
X = son,
Y = daughter ;
答案 0 :(得分:0)
你可以尝试lurker写的:使用X @< Y
而不是not(X = Y)
,但是你会得到:
?- sibling(X,Y).
X = daughter ,
Y = son;
X = daughter ,
Y = son;
然后sibling(son,daughter).
将返回no
,而它应返回true
。
或你可以在获得第一个结果后点击输入,并且不会提示你输入其他结果(但这取决于你使用的环境,因为有些环境提示每个结果而不询问你是否想要他们与否)。
您可以采取以下措施限制结果:
sibling(X,Y):-
parent(Z,X),
parent(Z,Y),
parent(A,X),
parent(A,Y),
not(X=Y),
Z @< A.
让我解释一下:在您当前的实现中,您得到4个结果,因为
使用前面的实现,为了兄弟(X,Y)为真,X和Y需要有相同的两个父母,所以你只能得到:
据我所知,如果您同时需要sibling(son,daughter)
和&amp; sibling(daughter,son)
是真的。