我写了一个小程序:
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.发布于 2014-02-15 15:52:27
假设您有等效的定义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).也许有了这种感觉,对这里发生的事情有一种“感觉”就更容易了。显然,谓词的第二个子句被切断了。)我们致力于第一条,第二条根本没有工作的机会。
发布于 2014-02-14 09:36:27
裁剪在断开时将执行提交给第一个分支。因此,你的规则:
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).https://stackoverflow.com/questions/21775220
复制相似问题