在 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).
你仍然需要检查一些退化的情况,所以你永远不会最终宣布一个人是他们自己的表亲。