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

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

每次我调用我的规则时,我都想断言一个空白的“问题列表”。仅当我关闭 prolog 窗口并重新启动它时,才会发生这种情况。

有什么建议么?

4

1 回答 1

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.
于 2012-05-03T21:38:36.403 回答