我是 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()必须全部通过。
在 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)
你仍然需要检查一些退化的情况,所以你永远不会宣布一个人是他们自己的堂兄。