6

我是 prolog 的新手,想就 2 人是否是堂兄弟做一个规则声明。

这是我当前的代码,我在需要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()必须通过。

4

1 回答 1

7

在 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).

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

于 2013-04-18T14:47:32.697 回答