Prolog - 断言进入新数据库

时间:2012-05-03 19:17:24

标签: prolog prolog-assert

:-dynamic listofQuestions/2.
myrule:-
    write('P = '), write(Percent), write('-'),write(X),
    ( listofQuestions(Percent,X) -> true ; assert(listofQuestions(Percent,X)) ),

可能不需要代码片段来回答我的问题。

我想在每次调用我的规则时断言为空白'listofQuestions'。只有关闭我的prolog窗口并重新启动它才会发生这种情况。

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

abolish/1从数据库中删除给定谓词的所有子句。因此,只要您需要删除有关此谓词的信息,只需添加对abolish(PredName/Arity)的调用即可。请注意,在取消对动态谓词的调用后,不会失败,但会报告错误。

12 ?- f(X,Y).
false.

13 ?- assert(f(a,b)).
true.

14 ?- f(X,Y).
X = a,
Y = b.

15 ?- abolish(f/2).
true.

16 ?- f(X,Y).
ERROR: user://2:67:
        toplevel: Undefined procedure: f/2 (DWIM could not correct goal)

在SWI-Prolog中,abolish适用于静态过程,除非prolog标志iso设置为true。如果您只想删除动态谓词,最好先尝试retractall。请注意,在这种情况下,删除不会导致报告错误,但会导致失败。

17 ?- [user].
:- dynamic f/2.
|: 
% user://3 compiled 0.00 sec, 264 bytes
true.

18 ?- f(X,Y).
false.

19 ?- assert(f(a,b)).
true.

20 ?- f(X,Y).
X = a,
Y = b.

21 ?- retractall(f(X,Y)).
true.

22 ?- f(X,Y).
false.