0

在我的程序中,我有一个动态子句,它们工作正常,但是当我关闭我的程序时,它们就消失了。

我试过了

saveState :-
  write_pl_state_file('backup.dat').

loadState :-
  file_exists('backup.dat'),
  read_pl_state_file('backup.dat'); !.

但这行不通。

有没有办法将此数据库保存到文件中?

4

2 回答 2

1

谓词write_pl_state_file/1read_pl_state_file/1与影响术语解析的信息/状态相关联,即运算符定义、字符转换 Prolog 标志等。

所以这是您的解决方案的一部分(也许),但更根本的是,您希望保存动态子句定义,可能是以允许您通过查阅文件来恢复它们的形式。

谓词listing/0做了类似的事情,但是它将动态子句显示到“控制台”,而不是文件。可能您想使用底层谓词 describe_clause/2,它允许将输出重定向到文件(流)。

作者 Daniel Diaz在最近的 1.4.0 版本的发行说明中注意到了一个轻微的变化(在输出的末尾添加了一个换行符),因此您可能需要确保您拥有最新的版本以确保易读性.

添加:

从版本 1.3.2 开始,GNU Prolog 似乎支持将Listing/0输出发送到当前流(而不是像 1.3.1 和更早版本那样仅发送到控制台)。

这是一个测试用例:

| ?- assertz(whoami(i)).
| ?- assertz(whoami(me)).
| ?- assertz(whoami(myself)).

它为动态谓词whoami/1创建了三个子句(事实)。

然后,我使用以下查询创建了一个文件 myClauses.pl:

| ?- open('myClauses.pl',write,S), set_output(S), listing, close(S).

一旦流 S 关闭,当前输出将重置到控制台。

您会发现文件 myClauses.pl 包含一个空行,后跟三个子句,因此源代码具有可供查阅的正确格式。但是,我在 Windows 下新安装的 GNU Prolog 1.4.0 中的 Consult /1谓词(及其 File -> Consult... 菜单等效项)存在问题。编译从命令行进行,并生成一个load/1可以在控制台中正确处理的字节码文件,因此在如何设置方面存在一些小问题。当我解决这个问题时,我会发布进一步的说明,并发送错误报告。我还没有在Linux下尝试过。

于 2011-11-13T15:51:27.600 回答
0

您可以使用current_predicate/1orpredicate_property/2访问谓词,以及访问谓词clause/2的子句。

然后,您可以使用该信息编写保存实用程序。

于 2011-11-15T18:15:34.867 回答