只为家谱中的兄弟对获得一个解决方案

时间:2015-01-23 03:35:20

标签: prolog

我有以下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(相反)的实例。

1 个答案:

答案 0 :(得分:2)

@lurker的评论说明了一切。问问自己这个问题是什么问题:

  • 是否有一对X,Y这样:
    • X有父Z:
      • Z是父亲
      • Z是母亲
    • Y有父Z:
      • Z是父亲
      • Z是母亲
    • X和Y不一样

在您当前的数据库中,一个孩子最多只能有一个母亲和一个父亲,所以parent_child/2的两个条款恰好对于一个孩子来说是互斥的。

但是parent_child/2中的子目标sibling/2 两次,所以对于每对兄弟姐妹,你可以两个中的任何一个在第一个,然后在第二个中的另一个,所以你有两个证明每对。说X @< Y代替X \== Y将确保X和Y的两种可能组合中只有一种能够成功证明。