【问题标题】:Prolog - how to clear the memory and start from scratch?Prolog - 如何清除内存并从头开始?
【发布时间】:2011-12-07 15:05:01
【问题描述】:

我正在开发一个 .pl 文件中的算法,并在命令窗口上通过查询对其进行检查。 我使用动态变量和撤回/断言谓词。当我修改 pl 文件并单击“重新加载修改的文件”时,我有额外的事实,我不想要。

例如,一开始我有 计数器(0)。

我做了一些事情,收回并断言这个计数器,它变成了 counter(7)。然后,当我重新加载修改后的 pl 文件时,我都有 计数器(0)。和 计数器(7)。

我怎样才能防止这种情况并且只有计数器(0)。一开始?

提前致谢。

【问题讨论】:

    标签: memory prolog reset prolog-assert


    【解决方案1】:

    如果您只使用这些动态事实来实现计数器,您应该考虑这是否是最好的方法。使用assert/1retract/1 会产生相当慢的代码。

    您可以将计数器变量作为您在代码中传递的另一个谓词参数(您可能需要区分输入和输出,因此有两个额外的参数),或者使用全局变量(它们是非逻辑特征,不过,这有时是不行的)。

    【讨论】:

      【解决方案2】:

      这取决于您使用的系统。在 YAP、B、GNU、SICStus、 指令:- dynamic(counter/1). 具有此效果。也就是说,只有 文件中的事实在重新加载后存在。

      在 SWI 中,动态谓词按照您的描述保留。您需要直接使用retractall/1 删除它们,它保留了谓词是动态的信息。

      【讨论】:

        【解决方案3】:

        插入

        :- abolish(counter/1).
        

        在文件的开头。完成测试后,将其移除。

        【讨论】:

        • 谢谢,我试过了,但现在它给出了错误:retract/1: No permission to modify static_procedure counter/1。虽然我有:- 动态计数器/1。一开始。
        • 你有没有把废除的东西放在动态的东西上面?
        • 顺便说一句,如果您是 prolog 的初学者,请尽量避免断言/撤回和全局变量,直到您了解得更好,这通常是一种旧的命令式反射,无助于您获得该语言。
        猜你喜欢
        • 2015-10-02
        • 2014-12-04
        • 1970-01-01
        • 1970-01-01
        • 2017-03-11
        • 2019-05-08
        • 1970-01-01
        • 2017-01-15
        • 2011-05-10
        相关资源
        最近更新 更多