我有以下Prolog代码,修改自维基百科:
mother_child(trude, sally).
father_child(tom, sally).
father_child(tom, erica).
father_child(mike, tom).
different(X, Y) :- X \== Y.
sibling(X, Y) :- parent_child(Z, X), parent_child(Z, Y), different(X, Y).
parent_child(X, Y) :- father_child(X, Y).
parent_child(X, Y) :- mother_child(X, Y).
我得到以下内容:
?- sibling(X, Y).
X = sally,
Y = erica ;
X = erica,
Y = sally ;
false.
是否可以修改我的代码,以便?- sibling(X, Y)
仅返回 :X = sally, y = erica ; false.
?也就是说,我想要消除X = Y和Y = X(相反)的实例。
答案 0 :(得分:2)
@lurker的评论说明了一切。问问自己这个问题是什么问题:
在您当前的数据库中,一个孩子最多只能有一个母亲和一个父亲,所以parent_child/2
的两个条款恰好对于一个孩子来说是互斥的。
但是parent_child/2
中的子目标sibling/2
两次,所以对于每对兄弟姐妹,你可以两个中的任何一个在第一个,然后在第二个中的另一个,所以你有两个证明每对。说X @< Y
代替X \== Y
将确保X和Y的两种可能组合中只有一种能够成功证明。