swi prolog如何防止重复输出

swi prolog如何防止重复输出,prolog,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 = daugh

我有一个知识库

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对非重复? 如


你可以试试潜伏者写的:使用
X@
而不是
not(X=Y)
,但是你会得到:

?- sibling(X,Y).
X = daughter ,
Y = son;
X = daughter ,
Y = son;
然后
兄弟姐妹(儿子、女儿)。
将返回
no
,而它应该返回
true

您只需在获得第一个结果后按enter键,其他结果将不会提示您(但这取决于您使用的环境,因为有些人会在不询问是否需要的情况下提示每个结果)


编辑: 您可以采取以下措施限制结果:

sibling(X,Y):-
    parent(Z,X),
    parent(Z,Y),
    parent(A,X),
    parent(A,Y),
    not(X=Y),
    Z @< A.
同级(X,Y):-
父(Z,X),
父(Z,Y),
母公司(A,X),
父母(A,Y),
不是(X=Y),
Z@
让我解释一下:在您当前的实现中,您得到了4个结果,因为

  • 儿子和女儿有相同的妈妈
  • 女儿和儿子有同一个妈妈
  • 儿子和女儿有相同的父亲
  • 女儿和儿子有同样的父亲
在前面的实现中,要使兄弟(X,Y)为真,X和Y需要具有相同的两个父级,因此您只能得到:

  • 儿子和女儿有相同的双亲
  • 女儿和儿子有同样的双亲

据我所知,如果你希望兄弟姐妹(儿子,女儿)
&
兄弟姐妹(女儿,儿子)
都是真的,这是你能得到的至少两个结果。

X的问题@碳形式你读过我的全部答案了吗?好的,我可能有倒置的女儿和儿子,但我指出,
X@I如果我们彼此误解,我希望谓词列出true,如果值是兄弟,但我也希望每对只列出一次。所以如果有三个兄弟姐妹,a,b和c,它显示:X=a,Y=b;X=b,Y=c;X=a,Y=c,或类似的输出。据我所知,这是不可能的,好像
兄弟姐妹(安娜,彼得)
是真的,那么
兄弟姐妹(彼得,安娜)
也是真的,所以每对都将至少列出两次(
X=anna Y=peter
X=peter Y=anna
)。这仍然比你从一开始就有的要好:四次。
sibling(X,Y):-
    parent(Z,X),
    parent(Z,Y),
    parent(A,X),
    parent(A,Y),
    not(X=Y),
    Z @< A.