Prolog-切割如何与OR运算符结合使用?

时间:2014-02-14 09:17:10

标签: prolog prolog-cut

我写了这个小程序:

married(guy1, fem1).
married(guy2, fem2).

married_to(X,Y):-!, married(X,Y); married(Y,X).

打印:

X = guy1,
Y = fem1 ;
X = guy2,
Y = fem2.

我的目的是打印已婚夫妇,但每人一次。以上规则对我有用,但我不明白为什么!这是如何工作的?

与此有什么不同: married_to(X,Y):- married(X,Y); married(Y,X).

打印:

X = guy1,
Y = fem1 ;
X = guy2,
Y = fem2 ;
X = fem1,
Y = guy1 ;
X = fem2,
Y = guy2.

2 个答案:

答案 0 :(得分:3)

cut将执行提交到析取的第一个分支。因此你的规则:

married_to(X,Y):-!, married(X,Y); married(Y,X).

在操作上与:

相同
married_to(X,Y):-!, married(X,Y).

并且,鉴于married_to /2谓词没有其他条款,相当于:

married_to(X,Y):- married(X,Y).

答案 1 :(得分:1)

假设你有相同的定义married_to(X,Y):- true, !, married(X,Y) ; married(Y,X).。如果true失败,那么我们会跳到替代方案,但由于它不会,我们将坚定地继续进行后续分支(析取)。

我的代码是

married_to(X,Y):- ( !, married(X,Y) ) ; ( married(Y,X) ).

而不是

married_to(X,Y):- !, (  married(X,Y)  ;   married(Y,X) ).

实际上相当于

married_to(X,Y):- !, married(X,Y). 
married_to(X,Y):-    married(Y,X).

也许有了这个,就可以更容易地得到“感觉”来了解这里发生的事情。显然,谓词的第二个子句是 cut off。 :)我们承诺第一个条款,第二个没有机会工作。