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

Prolog-切割如何与OR运算符结合使用?,prolog,prolog-cut,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. 我的目的是打印已婚夫妇,但每次打印一次。上面的规则对我有效,但我不明白为什么!这是怎么回事 这有什么区别: 已婚(X,Y):-已婚(X,Y);已婚(Y,X)。 这张照片是: X = guy1, Y =

我写了这个小程序:

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

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

X = guy1,
Y = fem1 ;
X = guy2,
Y = fem2.
我的目的是打印已婚夫妇,但每次打印一次。上面的规则对我有效,但我不明白为什么!这是怎么回事

这有什么区别:
已婚(X,Y):-已婚(X,Y);已婚(Y,X)。

这张照片是:

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

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

married_to(X,Y):-!, married(X,Y); married(Y,X).
在操作上与:

married_to(X,Y):-!, married(X,Y).
并且,假设
u to/2
谓词没有其他子句,相当于:

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

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

married_to(X,Y):-!, married(X,Y); married(Y,X).
在操作上与:

married_to(X,Y):-!, married(X,Y).
并且,假设
u to/2
谓词没有其他子句,相当于:

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

假设你有一个与(X,Y)等价的定义
!,已婚(X,Y);已婚(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).

也许有了这个,就更容易对这里发生的事情有一种“感觉”。显然,谓词的第二个从句被截断了。:)我们致力于第一条,第二条根本没有工作的机会。

想象你有与(X,Y)相同的定义:-真的!,已婚(X,Y);已婚(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).
也许有了这个,就更容易对这里发生的事情有一种“感觉”。显然,谓词的第二个从句被截断了。:)我们遵守第一条,第二条根本没有机会工作