独家解决方案集?

时间:2020-05-21 05:00:42

标签: prolog

假设我们有:

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

是否有更好的版本:

  • 不需要否定运算符,并且
  • 匹配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).

...但是存在类似的问题:我们可以避免否定。我们可以避免多余的重新证明吗?

2 个答案:

答案 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).  

如果ZY在最后一行是新鲜的,则查询为““如果有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灭中拯救了宇宙!

话虽这么说

  1. 否定失败还不错,实际上这是必不可少的。不要无缘无故避免它。它也是非单调的,那又如何!我们不是在First-Order-Classical-Logic中建模,而是假装在First-Order-Classical-Logic中工作以完成一些编程。
  2. 如果您有“其他不良副作用”,则该程序存在设计问题。命令性代码是否还会有“其​​他不良影响”?我希望不会!
  3. 没有“冗余匹配”。如果您在条款的这一点已经已经知道 g(Z,X)的真值了,那么您就可以避免在这一点上“冗余证明” g(Z,X)(或否定) ,但您没有。人们也不必担心for循环中的“与限制进行冗余比较”。
  4. 是“昂贵的”吗?不超过肯定查询。

答案 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).