2012-05-03 58 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)即可。請注意,在廢除對動態謂詞的調用後,不會失敗,但會報告錯誤。

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工程靜態的程序,除非序言標誌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. 
[序言 - 如何斷言/使數據庫只有一次]的
+0

謝謝。得到它與廢除/ 2合作 – HungryCoder