2012-06-13 122 views

回答

4

您可以使用這些程序,它們使用source_file/1source_file/2做到這一點:

unload_last_source:- 
    findall(Source, source_file(Source), LSource), 
    reverse(LSource, [Source|_]), 
    unload_source(Source). 

unload_source(Source):- 
    ground(Source), 
    source_file(Pred, Source), 
    functor(Pred, Functor, Arity), 
    abolish(Functor/Arity), 
    fail. 
unload_source(_). 

unload_source/1廢除由輸入源文件名中定義的所有謂詞。被警告它必須是絕對路徑。

unload_last_source/0將檢索上次諮詢的文件名並將其卸載。

+1

有幾種Prolog的實現。 OP沒有提到他正在使用的Prolog系統。該解決方案適用於SWI-Prolog。它不適用於大多數其他Prolog編譯器,它們不提供source_file/1-2內置謂詞和/或允許取消靜態謂詞。依賴於特定Prolog實現的解決方案最好明確地標記爲這樣。 –

+0

@Paulo Moura:OP將問題標記爲SWI-Prolog特定的問題。答案卻沒有注意到廢除作品時沒有記錄源文件... – CapelliC

1

在查閱了一個文件後,它與Prolog變得「無關緊要」。所以我認爲一般回答應該是沒有。但是SWI-Prolog有一套豐富的內置函數,可以讓你控制你的prolgram。例如

?- [stackoverflow]. 

?- predicate_property(P, file('/home/carlo/prolog/stackoverflow.pl')). 
P = yield(_G297, _G298) ; 
P = now _G297 ; 
P = x(_G297) ; 
... 

?- abolish(yield/2). 
true. 

?- predicate_property(P, file('/home/carlo/prolog/stackoverflow.pl')). 
P = now _G297 ; 
P = x(_G297) ; 
... 

請注意,取消不需要文件名的工作,你可以刪除從其他源文件加載的謂詞。

clauseclause_propertyerase應該給予更多的控制權,但我得到一個錯誤,我不明白(這是無證)試圖使用擦除時:如果你知道謂詞的名字

?- clause(strip_spaces(_G297, _G298),X,Y),erase(Y). 
ERROR: erase/1: No permission to clause erase `<clause>(0x29acc30)' 
0

,例如fact/2,你可以使用:

retractall(fact(_,_)). 
+0

僅適用於動態謂詞,即使用'assert'設置的動作謂詞,對嗎? –

+0

事實上,它只適用於動態謂詞,但它們不必在運行時斷言,也可以在源文件中聲明。 – Ihmahr