Prolog,规则语句的“或”运算符

时间:2013-04-18 06:55:36

标签: prolog operators

我是prolog的新手,并希望就两个人是否是表兄弟做出规则声明。

这是我当前的代码,我在需要or运算符的地方添加了“或”:

cousins(E, F) :- siblings(A, C) or siblings(A, D) or siblings(B, C) or siblings (B, D), parent(A, E), parent(B, E), parent(C, F), parent(D, F).

我只需要传递siblings()中的一个,但所有parent()都必须通过。

1 个答案:

答案 0 :(得分:2)

在Prolog中,“或”运算符为;。或者可以通过为谓词设置不同的子句来实现。

让我们看看如果您的第一个替代方案成立后会发生什么:

cousins(E,F):- siblings(A, C), 
  parent(A, E), parent(B, E), parent(C, F), parent(D, F).

,如果第二次举办会怎么样?

cousins(E, F) :- siblings(A, D), 
  parent(A, E), parent(B, E), parent(C, F), parent(D, F).

与第3和第4类似:

cousins(E, F) :- siblings(B, C), 
  parent(A, E), parent(B, E), parent(C, F), parent(D, F).

cousins(E, F) :- siblings (B, D), 
  parent(A, E), parent(B, E), parent(C, F), parent(D, F).

现在你有四个条款表达的“或”条件。

但你必须留下许多重要的细节。你可能想要有两对父母,所以你需要添加不等式:parent(A, E), parent(B, E), A \= B等等。但是,新的第二个子句只是第一个副本,一些变量重命名;同样适用于第3和第4条款。只留下每一对中的一个就足够了。

但为什么你需要知道一个人的双亲?你没有,真的。如果它是母亲或父亲,那有什么关系?它没有。所以,最后,只需一个条款就足够了:

cousins(E,F):- siblings(A, C), parent(A, E), parent(C, F).

你仍然需要检查一些堕落案例,所以你永远不会最终宣称一个人是他们自己的堂兄。