假设我们有:
g(0,0).
g(0,1).
h(1,2).
f(Z,X):- g(Z,X).
% Match h IFF g does not match
f(Z,X):- \+ g(Z,X), h(Z,X).
因此,我们有一个规则f,它可以决定从g或h中排他地取解决方案,而决不能从两者中取回:
f(A,B) is true IF:
g(A,B) is true, or
h(A,B) is true and g(A,B) is false).
?- f(0, X).
X=0 ; % solution from g
X=1 . % solution from g
?- f(1, X).
X=2 . % solution from h
是否有更好的版本:
g
a
第二次,这可能会带来其他不必要的副作用(例如IO),这可能会很昂贵。好的...这不是完全的XOR,应该是
f(A,B) is true IFF:
g(A,B) is true and h(A,B) is false, or
h(A,B) is true and g(A,B) is false).
...但是存在类似的问题:我们可以避免否定。我们可以避免多余的重新证明吗?
答案 0 :(得分:2)
这是错误的:
g(0,0).
g(0,1).
h(1,2).
f(Z,X):- g(Z,X).
f(Z,X):- \+ g(Z,X), h(Z,X).
如果Z
和Y
在最后一行是新鲜的,则查询为““如果有g(_,_)
,则失败,否则h(Z,X)
”。
观察:
?- f(0,1),f(0,0),f(1,2). % f(1,2) is TRUE
true ;
false.
?- bagof([X,Y],f(X,Y),Bag). % f(1,2) is NOT TRUE
Bag = [[0, 0], [0, 1]].
程序不一致。
另一方面:
g(0,0).
g(0,1).
h(1,2).
f(Z,X):- g(Z,X).
f(Z,X):- h(Z,X), \+ g(Z,X).
?- f(0,1),f(0,0),f(1,2).
true ;
false.
?- bagof([X,Y],f(X,Y),Bag).
Bag = [[0, 0], [0, 1], [1, 2]].
已从完全an灭中拯救了宇宙!
话虽这么说
g(Z,X)
的真值了,那么您就可以避免在这一点上“冗余证明” g(Z,X)
(或否定) ,但您没有。人们也不必担心for循环中的“与限制进行冗余比较”。答案 1 :(得分:0)
您喜欢剪吗?
g(0,0).
g(0,1).
h(1,2).
f(Z,X):- g(Z,X), !.
% Match h IFF g does not match
f(Z,X):- h(Z,X).