是否有內置的謂詞或簡單的方法從prolog的知識庫中刪除已經查閱過的源文件?我閱讀了參考手冊,沒有找到任何可以做到的事情。Swi Prolog,卸載源文件
回答
您可以使用這些程序,它們使用source_file/1
和source_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
將檢索上次諮詢的文件名並將其卸載。
在查閱了一個文件後,它與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) ;
...
請注意,取消不需要文件名的工作,你可以刪除從其他源文件加載的謂詞。
clause,clause_property和erase應該給予更多的控制權,但我得到一個錯誤,我不明白(這是無證)試圖使用擦除時:如果你知道謂詞的名字
?- clause(strip_spaces(_G297, _G298),X,Y),erase(Y).
ERROR: erase/1: No permission to clause erase `<clause>(0x29acc30)'
,例如fact/2,你可以使用:
retractall(fact(_,_)).
僅適用於動態謂詞,即使用'assert'設置的動作謂詞,對嗎? –
事實上,它只適用於動態謂詞,但它們不必在運行時斷言,也可以在源文件中聲明。 – Ihmahr
- 1. SWI-Prolog的寫入文件
- 2. SWI Prolog:諮詢文件
- 3. SWI Prolog - 條件NOT?
- 4. 如何在swi-prolog中的prolog文件內運行prolog查詢?
- 5. swi-prolog [列表]
- 6. SWI-Prolog謂詞
- 7. swi prolog solve
- 8. SWI Prolog等價
- 9. SWI-Prolog規則
- 10. SWI Prolog查詢
- 11. swi prolog mysql + web
- 12. SWI-Prolog條件語句
- 13. Swi Prolog,閱讀文件示例
- 14. 如何在SWI Prolog中讀取文件?
- 15. 通過Java執行的SWI-Prolog文件
- 16. 寫入文件| Swi-Prolog |視窗
- 17. SWI-Prolog的時間/ 1到文件
- 18. SWI Prolog的FUNC包
- 19. SWI Prolog數據庫
- 20. SWI Prolog ensure_loaded錯誤
- 21. Swi Prolog的關係
- 22. SWI-Prolog的否定
- 23. SWI-Prolog的益智
- 24. 列表在SWI-Prolog
- 25. Interprolog和SWI-Prolog的
- 26. 在SWI-Prolog中編寫格式文本
- 27. 在SWI-Prolog中關閉XPCE
- 28. SWI-Prolog的:在列表中
- 29. SWI-Prolog xml_write到變量
- 30. SWI-Prolog的怪遞歸寫
有幾種Prolog的實現。 OP沒有提到他正在使用的Prolog系統。該解決方案適用於SWI-Prolog。它不適用於大多數其他Prolog編譯器,它們不提供source_file/1-2內置謂詞和/或允許取消靜態謂詞。依賴於特定Prolog實現的解決方案最好明確地標記爲這樣。 –
@Paulo Moura:OP將問題標記爲SWI-Prolog特定的問題。答案卻沒有注意到廢除作品時沒有記錄源文件... – CapelliC