Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 序言-如何清除内存并从头开始?_Memory_Prolog_Reset_Prolog Assert - Fatal编程技术网

Memory 序言-如何清除内存并从头开始?

Memory 序言-如何清除内存并从头开始?,memory,prolog,reset,prolog-assert,Memory,Prolog,Reset,Prolog Assert,我正在一个.pl文件中开发一个算法,并在命令窗口上用查询检查它。 我使用动态变量和收回/断言谓词。当我修改pl文件并单击“重新加载修改的文件”时,我有我不想要的额外事实 例如,一开始我有 计数器(0) 我做了些什么,收回并断言这个计数器,它变成了计数器(7)。然后,当我重新加载修改后的pl文件时,两个文件都有 计数器(0)。及 柜台(7) 我如何防止这种情况,并且只有计数器(0)。一开始 提前感谢。插入 :- abolish(counter/1). 在文件的开头。当您完成测试时,请将其删除。如

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

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

我做了些什么,收回并断言这个计数器,它变成了计数器(7)。然后,当我重新加载修改后的pl文件时,两个文件都有 计数器(0)。及 柜台(7)

我如何防止这种情况,并且只有计数器(0)。一开始

提前感谢。

插入

:- abolish(counter/1).

在文件的开头。当您完成测试时,请将其删除。

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


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

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


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

谢谢,我尝试过,但现在出现错误:retract/1:没有修改静态\u过程计数器/1的权限。虽然我有:-动态计数器/1。一开始,你是不是把废除的东西放在动态的东西上面了?顺便说一句,如果你是prolog的初学者,试着避免使用assert/retract和全局变量,直到你知道得更清楚为止,这通常是一个古老的命令反射,不能帮助你理解语言。