是否有内置的谓词或简单的方法从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