9

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

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

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

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

提前致谢。

4

3 回答 3

6

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

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

于 2011-12-07T15:29:59.790 回答
4

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

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

于 2011-12-07T15:30:35.040 回答
3

插入

:- abolish(counter/1).

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

于 2011-12-07T15:17:13.527 回答