Prolog 有静态存储和动态存储。如果你打开一个文件,说program.pl
然后你在其中添加一些行,如下所示:
foo(tabitha).
foo(darlene).
这些事实最终会被保存在静态存储中。它们不是程序的可变部分(默认情况下)。
The asserta/1
, assertz/1
and retract/1
and retractall/1
过程构成了动态存储的基础。如果您只是坐在控制台前,您可以将一些事实添加到动态存储中,然后通过执行以下操作将其删除:
?- asserta(baz(tabitha)).
true.
?- baz(X).
X = tabitha.
?- retract(baz(tabitha)).
true.
?- baz(X).
false.
但是,如果您在加载后出现提示program.pl
你试图收回foo(tabitha)
您将收到静态过程消息:
?- retract(foo(tabitha)).
ERROR: retract/1: No permission to modify static procedure `foo/1'
ERROR: Defined at /Users/fusion/program.pl:1
原因是因为foo/1
事实被放置在静态存储中而不是动态存储中,因为您没有将它们放在那里asserta/1
or assertz/1
或者将谓词声明为动态,如下所示:
:- dynamic foo/1.
所以有两条路可以前进:
- 直接编辑程序源并重新加载。
- 声明
rules/1
谓词动态如上所述。
顺便说一句,在 SWI-Prolog 中重新加载最好通过运行make.
从提示中。
我会推荐选项#1,否则当你喜欢它正在做的事情时,将很难重建你的工作程序的状态。