【问题标题】:SWI-Prolog - Listing entire knowledge base to fileSWI-Prolog - 列出整个知识库到文件
【发布时间】:2017-10-18 07:39:46
【问题描述】:

我有一个 Prolog 文件,我在其中查阅知识库并添加我自己的谓词。我想要一个谓词,将整个更新的知识库保存到一个文本文件中。

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

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

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

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

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

如果这是唯一/最好的解决方案,那就这样吧。但是,如果有办法导出知识库,并且导出知识库,我真的很想听听。

谢谢。

【问题讨论】:

  • 我不太清楚你的目标是什么。你能举个例子吗?
  • 我有一个 Prolog 文件,我们称之为Project.pl。在里面我有::- ['knowledgebase.txt'].predicate_1(...) :- ... .predicate_2(...) :- ... .等。我想写一个谓词,它将正在查询的知识库和我在Project.pl文件中编写的谓词输出到另一个文件.实际上,尽管我一直在寻找解决方案将近一个小时,但只要我发布了这个问题,我就设法(几乎完全)通过以下方式做到了这一点:tell('newkb.txt'), listing, told.。但是,这确实添加了许多其他生成的谓词。
  • 您应该编辑您的问题并在此处添加所有信息,而不是在 cmets 中。同时... 您的知识库中有多少谓词?如果不是太多,您可以单独列出它们:tell('newkb.txt'), listing(pred1), listing(pred2), ..., listing(pred-n), told.
  • SWI 包含的东西很奇怪。有趣的是,GNU 默认不包含一堆奇怪的东西。
  • @DanielLyons 哈哈,好吧,我只是在追随 OP 的领导。我同意 SWI 包括在做列表时不属于用户的奇怪(无关)的东西。也许他们需要提供一个listing_of_just_my_stuff 谓词。

标签: file prolog export


【解决方案1】:

listing/0 列出了知识库(嗯,默认情况下来自全局 user 模块。user 模块中有几个 钩子 以某种方式掩盖了这一点。有些是由 de -facto Prolog 实践和一些是 SWI-prolog 扩展。它们当然可以从列表中省略,但这违反了listing/0 最重要的用例:查找知识库中的内容,因此可能导致其混淆自己的权利。

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

?- module(empty).

现在listing/0 将按您的预期工作。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2016-09-03
    • 2011-06-11
    相关资源
    最近更新 更多