3

所以 Prolog 解释器实现了 Last Call Optimization - 就像......

length([], Acc, Acc).
length([_|T], Acc, X) :- NewAcc is Acc+1, length(T, NewAcc, X).

可以在 O(1) 空间中调用。

但是,如果我进入调试模式 - 这将被禁用。

我的问题只是“为什么?”。这肯定会破坏调试的全部意义吗?我们再也看不到程序正在正确执行的操作...?

4

1 回答 1

1

它宁可选择点消除而不是最后调用优化。如果调试器要服务于 Byrds box 模型的所有端口,即:

          +--------+
   Call ->|        |-> Exit
          |        |
   Fail <-|        |<- Redo
          +--------+

他需要额外的选择点。所以我想这不仅是最后一次调用优化,还有选择点优化,在调试过程中会落空。

在 length/2 示例中,当您在实例化第一个参数的情况下调用 length/2 时,可以通过索引消除选择点。

有一些调试器,例如 SWI-Prologs 调试器,它在某种程度上遵循普通解释器的选择点消除。所以在 SWI-Prolog 中你不会总是看到所有的端口。

再见

于 2015-08-18T09:15:19.620 回答