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

私の質問に答えるために、コード スニペットは必要ないかもしれません。

ルールを呼び出すたびに、空白の「listofQuestions」にアサートしたいと考えています。これは、プロローグ ウィンドウを閉じて再起動した場合にのみ発生します。

助言がありますか?

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 フラグが true に設定されていない限り、静的プロシージャで機能しisoます。動的述語のみを削除する場合は、 を試してください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 に答える