我想找到一种方法来分析我在prolog中写的谓词(一个巨大的谓词)的内存使用情况。我目前正在使用swi和yap运行它,我可以从这些进程的内存消耗中看到分配了一大块内存。
问题是,当谓词终止时,它不会被释放/释放/垃圾收集(我必须停止解释器才能看到它回来),加上内存量只会在谓词运行时保持增长(无论它不应该因为尾部递归优化应该缓解这个问题,我猜,在每次迭代中)。
是否有一种方法可以发现增加内存使用的子谓词/调用,并检查尾部递归优化是否被有效调用?
关于如何优化问题的任何其他建议将非常感谢。如果有必要,我会详细说明谓词的作用。
在SWI-Prolog中,一个简单的方法来查看你的递归谓词是否实际上得到尾部优化是使用prolog_current_frame
(看这里):
foo :-
prolog_current_frame(F), format('~d~n',[F]),
do_something,
foo.
如果执行了尾部优化,则每次通过递归调用输入谓词时,它都会返回相同的整数。我遇到的问题是,我没有意识到我使用的谓词正在创建选择点并阻止尾部优化。
如果没有尾部优化是实际问题,那么您可以做的其他事情是简单地在递归调用之前放一个cut:
foo :-
do_something,
!, foo.
这将删除do_something
创建的任何选择点。如果您的内存使用量仍在增长,那么问题可能出在其他地方。您的谓词是否创建了一个大型数据结构?或者使用大量的中间列表?