3

我想找到一种方法来分析我在 prolog 中编写的谓词(一个巨大的)的内存使用情况。我目前正在使用swiyap运行它,我可以从这些进程的内存消耗中看到分配了大量内存。

问题是当谓词终止时它不会被释放/释放/垃圾收集(我必须停止解释器才能看到它)加上内存量只会在谓词运行时不断增长(无论它是否应该因为尾巴我猜,递归优化应该在每次迭代时缓解这个问题)。

有没有办法发现增加使用的内存的子谓词/调用并检查是否有效地调用了尾递归优化?

任何其他关于如何优化问题的建议将不胜感激。如果有必要,我将提供有关谓词正在做什么的更多详细信息。

4

1 回答 1

3

在 SWI-Prolog 中,查看递归谓词是否实际上正在进行尾部优化的一种简单方法是使用prolog_current_frame看这里):

foo :-
    prolog_current_frame(F), format('~d~n',[F]),
    do_something,
    foo.

如果执行了尾部优化,每次您通过递归调用输入谓词时,它将返回相同的整数。我遇到的问题是我没有意识到我正在使用的谓词正在创建选择点并阻止尾部优化。

如果没有尾部优化是实际问题,那么您可以做的其他事情就是在递归调用之前简单地进行切割:

foo :-
    do_something,
    !, foo.

这将删除由创建的任何选择点do_something。如果您的内存使用量仍在增长,那么问题可能出在其他地方。您的谓词是否创建了大型数据结构?还是使用很多中间列表?

于 2013-04-04T13:12:36.743 回答