Debugging Prolog调试模式-上次调用优化

Debugging Prolog调试模式-上次调用优化,debugging,prolog,Debugging,Prolog,因此,Prolog解释器实现了最后一次调用优化-因此类似于 length([], Acc, Acc). length([_|T], Acc, X) :- NewAcc is Acc+1, length(T, NewAcc, X). 可以在O(1)空间中调用 但是,如果我进入调试模式-这将被禁用 我的问题是“为什么?”。这肯定会破坏调试的全部意义吗?我们再也看不到程序正在正确执行什么…?与其说是最后一次调用优化,不如说是选择点消除。 如果调试器希望为Byrds的所有端口提供服务 箱型,即:

因此,Prolog解释器实现了最后一次调用优化-因此类似于

length([], Acc, Acc).
length([_|T], Acc, X) :- NewAcc is Acc+1, length(T, NewAcc, X).
可以在O(1)空间中调用

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


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

与其说是最后一次调用优化,不如说是选择点消除。 如果调试器希望为Byrds的所有端口提供服务 箱型,即:

          +--------+
   Call ->|        |-> Exit
          |        |
   Fail <-|        |<- Redo
          +--------+
+--------+
呼叫->退出
|        |

失败你可以看到它做什么,你只是看不到它是如何做的。尾部调用优化只是一种优化;从逻辑上讲,您的程序保持不变。@dasblinkenlight从逻辑上讲是这样的-但是如果没有适当的优化,诸如堆栈溢出之类的错误很容易发生。bug不会来自纯粹的逻辑根源。在调试模式下禁用LCO似乎很奇怪,因为LCO可能是某些错误的原因?充其量看起来,如果实际上没有破坏性,那么禁用它就毫无意义了?
length/2
通常是一个预定义的谓词。实际上,它是在。所以也许你甚至没有调试你认为它是什么?在任何情况下,为Prolog使用调试器对初学者都不是很有帮助。