我有一个Prolog文件,我正在咨询知识库并添加我自己的谓词。我希望有一个谓词,将整个更新的知识库保存到文本文件中。
我已尝试使用listing/0
执行此操作,但似乎无法更改其输出流。从技术上讲,我可以使用portray_clause/2
分别将每个子句写入文件,但我希望以更优雅的方式实现此目的。
是否有谓词/谓词组合可以让我这样做?
编辑:我设法将整个知识库输出到如下文件:
tell('newkb.txt'), listing, told.
这实现了我想要做的事情,但有一点点缺点:新的newkb.txt
文件包含一些自动生成的子句,如果可能的话我宁愿不保留。
如果这是唯一/最佳解决方案,那就这样吧。但是,如果有一种方法可以导出知识库,而只是知识库,我真的很想听听它。
谢谢。
答案 0 :(得分:2)
listing/0
列出了知识库(嗯,默认情况下来自全局user
模块。user
模块中有几个 hook 以某种方式模糊了这个有些是事实上的Prolog实践,有些是SWI-prolog扩展。当然可以从列表中省略它们,但这违反了listing/0
最重要的用例:找到知识库中的内容因此可能导致混淆。
你可以使用例如切换到另一个模块(empty
只是一个名字)
?- module(empty).
现在listing/0
可以按预期工作。
目前尚不清楚如何将其他事实和规则纳入知识库。如果您只是手动添加它们,则可能更容易编辑文件并运行?- make.
来重新加载文件。如果使用assert / retract更新它们,您需要一个如上所述的模块或某种方式来枚举您想要保存的部分。