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

Jac*_*cob 6 operators prolog

我是 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()必须全部通过。

Wil*_*ess 7

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

让我们看看如果你的第一个选择结果成立会发生什么:

cousins(          E, F):- 
  siblings(A, C), 
  parent(  A,     E), 
  parent(  B,     E), 
  parent(     C,     F), 
  parent(     D,     F).
Run Code Online (Sandbox Code Playgroud)

或者,如果第二个成立会发生什么?

cousins(          E, F) :- 
  siblings(A, D), 
  parent(  A,     E), 
  parent(  B,     E), 
  parent(     C,     F), 
  parent(     D,     F).
Run Code Online (Sandbox Code Playgroud)

第 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).
Run Code Online (Sandbox Code Playgroud)

现在你有了由四个子句表达的“或”条件。

但是你一定遗漏了许多重要的细节。您可能希望有两对父项,因此您需要添加不等式:parent(A, E), parent(B, E), A \= B等。但是,新的第二个子句只是第一个子句的副本,直到一些变量重命名;第 3 条和第 4 条相同。每对只留下一个就足够了。

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

cousins(            E, F):- 
    siblings(A, C), 
    parent  (A,     E), 
    parent(     C,     F).
Run Code Online (Sandbox Code Playgroud)

你仍然需要检查一些退化的情况,所以你永远不会宣布一个人是他们自己的堂兄。