我正在.pl 文件中开发一种算法,并在命令窗口中使用查询对其进行检查。我使用动态变量和撤回/断言谓词。当我修改 pl 文件并单击“重新加载修改的文件”时,我有额外的事实,我不想要。
例如,一开始我有计数器(0)。
我做了一些事情,收回并断言这个计数器,它变成了 counter(7)。然后,当我重新加载修改后的 pl 文件时,我有两个 counter(0)。和计数器(7)。
我怎样才能防止这种情况并且只有计数器(0)。在一开始的时候?
提前致谢。
我正在.pl 文件中开发一种算法,并在命令窗口中使用查询对其进行检查。我使用动态变量和撤回/断言谓词。当我修改 pl 文件并单击“重新加载修改的文件”时,我有额外的事实,我不想要。
例如,一开始我有计数器(0)。
我做了一些事情,收回并断言这个计数器,它变成了 counter(7)。然后,当我重新加载修改后的 pl 文件时,我有两个 counter(0)。和计数器(7)。
我怎样才能防止这种情况并且只有计数器(0)。在一开始的时候?
提前致谢。
如果您只使用这些动态事实来实现计数器,您应该考虑这是否是最好的方法。使用assert/1
并retract/1
编写相当慢的代码。
您可以使计数器变量成为您在代码中传递的另一个谓词参数(您可能需要区分输入和输出,因此有两个额外的参数),或者使用全局变量(不过,它们是非逻辑特性,有时是不行的)。
这取决于您使用的是什么系统。在 YAP、B、GNU、SICStus 中,该指令:- dynamic(counter/1).
具有此效果。也就是说,重新加载后仅存在文件中的事实。
在 SWI 中,动态谓词将按照您的描述保留。您需要直接删除它们,retractall/1
从而保留谓词是动态的信息。
插入
:- abolish(counter/1).
在文件的开头。完成测试后,将其删除。