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

私の質問に答えるためにコードスニペットが必要ない場合があります。Prolog - 新しいデータベースにアサートする

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

提案がありますか?

+0

[プロローグ - どのように一度だけのデータベースを作成/主張する]の可能複製(http://stackoverflow.com/questions/10437395/prolog-how-to-assert-make-a-database-only -once) –

+0

多分、その質問は私にも聞いたので。プログラムが終了するたびに保存されたものはすべて消去する必要があります。 PROLOGが終了するたびに、必要なものを満たします。しかし、それは私が必要なものではありません。 :( – HungryCoder

答えて

4

abolish/1は、与えられた述語のすべての句をデータベースから削除します。したがって、この述部に関する情報を削除する必要があるときはいつでも、abolish(PredName/Arity)への呼び出しを追加してください。無効にした後、動的述語への呼び出しは失敗しないが、エラーを報告することに注意してください。プロローグフラグisoがtrueに設定されていない限り、SWI-Prologで

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) 

、静的手順のabolish作品。動的述語のみを削除する場合は、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. 
+0

ありがとうございました。廃止/ 2で作業しました – HungryCoder

関連する問題