我是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()
都必须通过。
答案 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).
你仍然需要检查一些堕落案例,所以你永远不会最终宣称一个人是他们自己的堂兄。