swi-prolog如何防止重复输出

时间:2017-04-06 15:25:07

标签: prolog

我有一个知识库

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 ;

1 个答案:

答案 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个结果,因为

  • 儿子&amp;女儿有同样的妈妈
  • 女儿&amp;儿子有同一个妈妈
  • 儿子&amp;女儿有同一个爸爸
  • 女儿&amp;儿子有同样的爸爸

使用前面的实现,为了兄弟(X,Y)为真,X和Y需要有相同的两个父母,所以你只能得到:

  • 儿子&amp;女儿有同样的两个父母
  • 女儿&amp;儿子有同样的两个父母

据我所知,如果您同时需要sibling(son,daughter)和&amp; sibling(daughter,son)是真的。