我写了这个小程序:
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.
答案 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。 :)我们承诺第一个条款,第二个没有机会工作。