【发布时间】:2012-08-30 07:38:34
【问题描述】:
我在 Prolog 中做一个非常简单的练习,在跟踪中有一些我不明白的东西。该程序是对表示为后继的整数的“大于”(>):
greater_than(succ(_), 0).
greater_than(succ(A), succ(B)) :-
greater_than(A, B).
我的问题:我不明白为什么请求 greater_than(succ(succ(succ(0))),succ(0)) 在以下跟踪中生成 redo:
[trace] ?- greater_than(succ(succ(succ(0))),succ(0)).
Call: (6) greater_than(succ(succ(succ(0))), succ(0)) ? creep
Call: (7) greater_than(succ(succ(0)), 0) ? creep
Exit: (7) greater_than(succ(succ(0)), 0) ? creep
Exit: (6) greater_than(succ(succ(succ(0))), succ(0)) ? creep
true ;
Redo: (7) greater_than(succ(succ(0)), 0) ? creep
Fail: (7) greater_than(succ(succ(0)), 0) ? creep
Fail: (6) greater_than(succ(succ(succ(0))), succ(0)) ? creep
false.
为什么这里有redo?我怎样才能避免它(当然,没有削减)?
顺便说一句,在你问之前:不,这不是某种家庭作业......
【问题讨论】:
-
这只是您要询问的优化,给定的编译器可能有也可能没有。
-
好吧,一般来说,我认为优化一个人的代码是一个合法的编程问题,即使一个人只在一种编译器上编码(这里是 SWI)。但是,我刚刚更新了 SWI,我什至再也看不到这种行为了,所以它确实是 SWI 内部的,我想这个问题真的不感兴趣。抱歉吵了。
-
我在我的 SWI 安装上尝试了您的代码,但它确实没有尝试任何重做。它不仅是编译器,也是它的版本。我看到你更新了它;也许这是一个非常旧的版本。
-
是的,这绝对是版本问题(我不知道是哪一个,但从 5.10.4 开始已解决)。我会尽快发布答案并接受(由于我的声誉,我必须等待 8 小时),或者您可以这样做。
标签: prolog backtracking successor-arithmetics