所以 Prolog 解释器实现了 Last Call Optimization - 就像......
length([], Acc, Acc).
length([_|T], Acc, X) :- NewAcc is Acc+1, length(T, NewAcc, X).
可以在 O(1) 空间中调用。
但是,如果我进入调试模式 - 这将被禁用。
我的问题只是“为什么?”。这肯定会破坏调试的全部意义吗?我们再也看不到程序正在正确执行的操作...?
它宁可选择点消除而不是最后调用优化。如果调试器要服务于 Byrds box 模型的所有端口,即:
+--------+
Call ->| |-> Exit
| |
Fail <-| |<- Redo
+--------+
他需要额外的选择点。所以我想这不仅是最后一次调用优化,还有选择点优化,在调试过程中会落空。
在 length/2 示例中,当您在实例化第一个参数的情况下调用 length/2 时,可以通过索引消除选择点。
有一些调试器,例如 SWI-Prologs 调试器,它在某种程度上遵循普通解释器的选择点消除。所以在 SWI-Prolog 中你不会总是看到所有的端口。
再见