2

我写了这个小程序:

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.
4

2 回答 2

3

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

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).
于 2014-02-14T09:36:27.817 回答
1

想象一下你有相同的定义married_to(X,Y):- true, !, married(X,Y) ; married(Y,X).。如果true要失败,那么我们会跳到替代方案,但由于它不会,我们坚定地站在(析取的)结果分支上。

IOW 你的代码是

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-15T15:52:27.357 回答