【问题标题】:Persistence of facts in PrologProlog中事实的持久性
【发布时间】:2014-04-05 22:01:56
【问题描述】:

我是 Prolog 的新手,我正在使用 SWI-Prolog v6.6 将断言存储在 *.pl 文件中。

:- dynamic fact/2.

assert(fact(fact1,fact2)).

使用上面的代码,我可以进行断言并且工作正常,但问题是当我关闭 SWI-Prolog 并再次打开 *.pl 文件时,我所做的断言消失了......

有没有办法做出断言,即使我退出 Prolog 进程,这些断言也会被存储?

抱歉我的英语不好,谢谢! (:

【问题讨论】:

  • 您必须明确地将它们写入文件。它们在内存中持久存在,但是当 Prolog 关闭时,除非写入文件,否则一切都消失了。
  • 参见,例如,stackoverflow.com/questions/2921937/…,它使用爱丁堡风格的 I/O。
  • 哇,谢谢@mbratch,它就像我想要的那样工作。 :D

标签: prolog persistence


【解决方案1】:

保存状态有一定的limitations,另见SWI-Prolog邮件列表中的recent discussion

我认为在 SWI-Prolog 上持久存储事实的最简单方法是使用 persistency 库。为此,我将通过以下方式重写您的代码:

:- use_module(library(persistency)).

:- persistent fact(fact1:any, fact2:any).

:- initialization(init).

init:-
  absolute_file_name('fact.db', File, [access(write)]),
  db_attach(File, []).

您现在可以使用assert_fact/2retract_fact/2retractall_fact/2 添加/删除事实。

退出 Prolog 后,断言的事实会自动保存到 fact.db

示例用法:

$ swipl my_facts.pl
?- assert_fact(some(fact), some(other,fact)).
true.
?- halt.
$ swipl my_facts.pl
?- fact(X, Y).
X = some(fact),
Y = some(other, fact).

【讨论】:

    【解决方案2】:

    如果您所追求的只是获得一个用谓词断言的某些事实的列表,那么 mbratch 的建议就可以了。但是您可能还希望保存程序的一般状态,在这种情况下您可以使用qsave_program/2。根据 swi 文档,qsave_program(+File, +Options)

    将程序的当前状态保存到文件File。结果是一个包含保存状态的资源存档,该状态表示来自正在运行的程序的所有 Prolog 数据和所有用户定义的资源。

    这里有文档http://www.swi-prolog.org/pldoc/man?section=runtime

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多