gpt4 book ai didi

Prolog内存问题

转载 作者:行者123 更新时间:2023-12-02 00:39:00 25 4
gpt4 key购买 nike

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

问题是,当谓词终止时,它不会被释放/释放/收集垃圾(我必须停止解释器才能看到它回来),而且内存量只会保持增长,而谓词正在运行(我猜,它是否不会运行,因为尾递归优化应该在每次迭代时缓解该问题)。

有没有办法找到增加内存使用的子谓词/调用,并检查尾递归优化是否被有效调用?

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

最佳答案

在 SWI-Prolog 中,查看递归谓词是否真正进行尾部优化的一种简单方法是使用 prolog_current_frame ( look here ):

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

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

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

foo :-
do_something,
!, foo.

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

关于Prolog内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15811951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com