Prolog 后续算术和的最佳绿色切割是什么?

Prolog 后续算术和的最佳绿色切割是什么?,prolog,swi-prolog,successor-arithmetics,prolog-cut,Prolog,Swi Prolog,Successor Arithmetics,Prolog Cut,为了探索Prolog中的green切割,我试图将它们添加到后续算术中的sum的标准定义中(参见中的谓词plus)。其思想是通过消除所有无用的回溯(即,no…;false)来尽可能地“清理”输出,同时在所有可能的参数实例化组合下保持相同的行为-所有实例化的、一/二/三个完全未实例化的,以及包括部分实例化的参数在内的所有变体 这就是我在尽可能接近这一理想时所能做到的(我承认false的回答是一个来源): 在SWI下,这似乎适用于所有查询,但形状为?-plus(+X,-Y,+Z)的查询除外。例如,?-

为了探索Prolog中的green切割,我试图将它们添加到后续算术中的sum的标准定义中(参见中的谓词
plus
)。其思想是通过消除所有无用的回溯(即,no
…;false
)来尽可能地“清理”输出,同时在所有可能的参数实例化组合下保持相同的行为-所有实例化的、一/二/三个完全未实例化的,以及包括部分实例化的参数在内的所有变体

这就是我在尽可能接近这一理想时所能做到的(我承认false的回答是一个来源):

在SWI下,这似乎适用于所有查询,但形状为
?-plus(+X,-Y,+Z)的查询除外。例如,
?-plus(s(s(0)),Y,s(s(s(0))。
产生
Y=s(0);错误。
。我的问题是:

  • 我们如何证明上述削减是(或不是)绿色的
  • 我们是否可以做得比上述计划更好,并通过添加一些其他绿色削减来消除最后的倒退
  • 如果是,如何进行

首先是一个小问题:
plus/3
的通用定义交换了第一个和第二个参数,允许利用第一个参数索引。参见Prolog艺术的程序3.3。这也应该在你的生活中改变。我将调用您交换的定义
plusp/3
和您优化的定义
pluspo/3
。因此,给定

plusp(X, 0, X) :- natural_number(X). plusp(X, s(Y), s(Z)) :- plusp(X, Y, Z). 因此,您的程序是不完整的,任何关于进一步优化它的问题都是不相关的。但我们可以做得更好,让我重申一下我们想要优化的实际定义:

plus(0, X, X) :- natural_number(X). plus(s(X), Y, s(Z)) :- plus(X, Y, Z). 到目前为止,优化只依赖于调查这两个子句的开头。他们没有考虑递归规则。因此,它们可以合并到Prolog编译器中,而无需任何全局分析。在奥基夫的术语中,这些绿色削减可能被视为蓝色削减。引用第3.12节:

蓝色剪切是为了提醒Prolog系统它本应该注意到但不会注意到的确定性。蓝色切割不会改变程序的可见行为:它们所做的只是使其可行

绿色削减是为了删掉那些可能成功或不相关,或注定失败的尝试性证明,但你不会期望Prolog系统能够分辨出这一点

然而,关键是这些切口确实需要一些防护装置才能正常工作

现在,您考虑了另一个查询:

?- pluso(X, s(s(0)), s(s(s(0)))). X = s(0) ; false. 我(目前)认为
plus2/3
是绿色/蓝色切割w.r.t.剩余选粉点的最佳使用。你要求证据。好吧,我认为这远远超出了一个简单的答案

目标
接地(Z)
是确保非端接特性所必需的。目标
plus(s(u),Z,Z)
不终止,该属性由
ground(Z)
保留。也许你认为删除无限失败分支也是个好主意?根据我的经验,这是相当有问题的。特别是,如果这些分支被自动删除。乍一看,这似乎是一个好主意,但它使程序开发变得更加脆弱:原本良性的程序更改现在可能会禁用优化,从而“导致”不终止。但不管怎样,我们走吧:

除了简单的绿色削减 pluso3(X,Y,Z):- %第一部分:绿色切割 (X==0->!%第一个参数索引 ;Z==0->!%3参数索引,例如Jekejeke、ECLiPSe ;Y==Z->! ;变量(Z),非变量(Y),\+Unified\U with\U occurs\U check(Z,Y)->!失败 ;变量(Z),非变量(X),\+Unified\U与发生的\U检查(Z,X)->!失败 ;是的 ), %第二部分:原始统一 X=0, Y=Z, 自然_数(Z)。 pluso3(s(X),Y,s(Z)):-pluso3(X,Y,Z)。
你能找到一个例子,当有有限多个答案时,
pluso3/3
没有终止吗?

plus/3
的第一句读作
(Y==0->;Y=0)
,这没有多大意义,因为
Y
是一个新的变量。@gusbro:谢谢你的错误报告。不,我不能,但是我会一直学习到:)谢谢你的详细解释。我在写:只有当你在上面滚动光标时,“我发现了下面”后面的两个片段才可见-至少,我在最新的Chrome和Firefox下有这种效果。@Pietro:这就是
>用于。又称“扰流器”。以这种方式,它保持隐藏状态,因此在阅读之前的文本时,您无法“预取”它。毕竟,你应该独自“看”这些东西。
plus(0, X, X) :- natural_number(X).
plus(s(X), Y, s(Z)) :- plus(X, Y, Z).
?- plus(s(0),0,X).
X = s(0).
?- plus(X, Y, 0).
X = Y, Y = 0 ;
false.
pluso(X, Y, Z) :-
   % Part one: green cuts
   (  X == 0 -> !  % first-argument indexing
   ;  Z == 0 -> !  % 3rd-argument indexing, e.g. Jekejeke, ECLiPSe
   ;  true
   ),
   % Part two: the original unifications
   X = 0,
   Y = Z,
   natural_number(Z).
pluso(s(X), Y, s(Z)) :- pluso(X, Y, Z).
?- pluso(X, Y, 0).
X = Y, Y = 0.
?- pluso(X, s(s(0)), s(s(s(0)))).
X = s(0) ;
false.
?- pluso(X, s(0), s(0)).
X = 0 ;
false.
pluso2(X, Y, Z) :-
   % Part one: green cuts
   (  X == 0 -> !  % first-argument indexing
   ;  Z == 0 -> !  % 3rd-argument indexing, e.g. Jekejeke, ECLiPSe
   ;  Y == Z, ground(Z) -> !
   ;  true
   ),
   % Part two: the original unifications
   X = 0,
   Y = Z,
   natural_number(Z).
pluso2(s(X), Y, s(Z)) :- pluso2(X, Y, Z).
pluso3(X, Y, Z) :-
   % Part one: green cuts
   (  X == 0 -> !  % first-argument indexing
   ;  Z == 0 -> !  % 3rd-argument indexing, e.g. Jekejeke, ECLiPSe
   ;  Y == Z -> !
   ; var(Z), nonvar(Y), \+ unify_with_occurs_check(Z, Y) -> !, fail
   ; var(Z), nonvar(X), \+ unify_with_occurs_check(Z, X) -> !, fail
   ;  true
   ),
   % Part two: the original unifications
   X = 0,
   Y = Z,
   natural_number(Z).
pluso3(s(X), Y, s(Z)) :- pluso3(X, Y, Z).