SWI-Prolog - 将整个知识库列为文件

时间:2017-10-17 18:15:53

标签: file prolog export

我有一个Prolog文件,我正在咨询知识库并添加我自己的谓词。我希望有一个谓词,将整个更新的知识库保存到文本文件中。

我已尝试使用listing/0执行此操作,但似乎无法更改其输出流。从技术上讲,我可以使用portray_clause/2分别将每个子句写入文件,但我希望以更优雅的方式实现此目的。

是否有谓词/谓词组合可以让我这样做?

编辑:我设法将整个知识库输出到如下文件:

tell('newkb.txt'), listing, told.

这实现了我想要做的事情,但有一点点缺点:新的newkb.txt文件包含一些自动生成的子句,如果可能的话我宁愿不保留。

如果这是唯一/最佳解决方案,那就这样吧。但是,如果有一种方法可以导出知识库,而只是知识库,我真的很想听听它。

谢谢。

1 个答案:

答案 0 :(得分:2)

listing/0列出了知识库(嗯,默认情况下来自全局user模块。user模块中有几个 hook 以某种方式模糊了这个有些是事实上的Prolog实践,有些是SWI-prolog扩展。当然可以从列表中省略它们,但这违反了listing/0最重要的用例:找到知识库中的内容因此可能导致混淆。

你可以使用例如切换到另一个模块(empty只是一个名字)

?- module(empty).

现在listing/0可以按预期工作。

目前尚不清楚如何将其他事实和规则纳入知识库。如果您只是手动添加它们,则可能更容易编辑文件并运行?- make.来重新加载文件。如果使用assert / retract更新它们,您需要一个如上所述的模块或某种方式来枚举您想要保存的部分。

相关问题