Prolog中的典型循环代码如下:
loop_test :-
format('loop...~n'),
loop_test.
如另一个问题所述: How Can I simulate a while loop in Prolog with unchangeable conditions?
这是我的问题:这种递归形式是否可以安全地防止溢出?通常这样的C,C ++,Python的递归代码会溢出,因为在每个函数调用中添加了一个新的堆栈。我在loop_test
下trace
以上执行了。它类似于:
?- trace.
?- loop_test.
Call: (6) loop_test2 ? creep
Call: (7) format('loop...~n') ? creep
loop...
Exit: (7) format('loop...~n') ? creep
Call: (7) loop_test2 ? creep
Call: (8) format('loop...~n') ? creep
...
loop...
Exit: (158) format('loop...~n') ? creep
Call: (158) loop_test2 ? creep
Call: (159) format('loop...~n') ? creep
...
显然,数字正在增加。
有了这个简单的代码,我找不到内存增加;我执行loop_test
超过5分钟并跟踪写入/ proc / xxx / status的VmPeak(虚拟内存的峰值大小),但没有观察到任何变化。
我想了解上述代码(loop_test
)是否真的安全吗?为什么安全? (或者在Prolog中实现循环的更安全的方法)。
非常感谢。