首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >独家解决方案?

独家解决方案?
EN

Stack Overflow用户
提问于 2020-05-21 05:00:42
回答 2查看 58关注 0票数 1

假设我们有:

代码语言:javascript
复制
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获得解,两者都不可能同时得到:

代码语言:javascript
复制
f(A,B) is true IF: 
  g(A,B) is true, or
  h(A,B) is true and g(A,B) is false).
代码语言:javascript
复制
?- f(0, X).
X=0 ;    % solution from g
X=1 .    % solution from g
?- f(1, X).
X=2 .    % solution from h

是否有更好的版本:

  • 不需要否定操作符,当h匹配时,
  • 不需要冗余地尝试第二次反驳g,这可能会带来其他不必要的副作用(例如IO)。

好的..。这不是完全异或,应该是

代码语言:javascript
复制
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).

..。但也有一个类似的问题:我们能否避免否定。我们能避免多余的指责吗?

EN

回答 2

Stack Overflow用户

发布于 2020-05-21 06:58:11

这是错误的:

代码语言:javascript
复制
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)”。

观察:

代码语言:javascript
复制
?- 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]].

程序不一致.

另一方面:

代码语言:javascript
复制
g(0,0).
g(0,1).
h(1,2).

f(Z,X):- g(Z,X).
f(Z,X):- h(Z,X), \+ g(Z,X).
代码语言:javascript
复制
?- 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]].

宇宙已从全面毁灭中拯救出来了!

话虽如此:

  1. Negation-as-failure并不坏,事实上它是必不可少的。不要无缘无故地回避它。它也是非单调的,那又怎样!我们不是在一阶-经典-逻辑建模,我们只是假装在一阶-经典-逻辑中工作,以完成一些编程。
  2. 如果您有“其他不想要的副作用”,则程序存在设计问题。命令式代码是否有“其他不必要的副作用”?我希望不是!
  3. 没有“冗余匹配”。如果你在这个子句的那个点已经知道了g(Z,X)的真值,那么你就可以避免在那个时候“冗余地证明”g(Z,X) (或否定),但你不知道。人们也不担心for循环中的“冗余比较”。
  4. 是“昂贵的”吗?仅是一个肯定的查询.
票数 2
EN

Stack Overflow用户

发布于 2020-05-21 05:12:49

你喜欢用刀子吗?

代码语言:javascript
复制
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).
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61927594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档