在我的程序中,我有一个动态的子句,它们工作正常,但当我关闭我的程序时,它们就消失了。
我试过了
saveState :-
write_pl_state_file('backup.dat').
loadState :-
file_exists('backup.dat'),
read_pl_state_file('backup.dat'); !.
但这不起作用。
有没有办法将此数据库保存到文件中?
答案 0 :(得分:1)
谓词 write_pl_state_file / 1 和 read_pl_state_file / 1 与影响术语解析的信息/状态相关联,即运算符定义,字符转换Prolog标志等。
因此,这是您的解决方案的一部分(可能),但更基本上您希望保存动态子句定义,可能采用允许您通过查阅文件来恢复它们的形式。
谓词 listing / 0 执行类似的操作,但它会向“控制台”显示动态子句,而不是文件。您可能希望使用the underlying predicate portray_clause / 2 ,这允许将输出重定向到文件(流)。
作者Daniel Diaz noted a slight change(在输出结尾添加换行符)for portray_clause / 2 在1.4.4版的最新发行说明中,所以您可能需要确保为了易读起见,我们得到了最新版本。
<强>加了:强>
似乎从版本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 - &gt; Consult ...菜单等效)的问题。编译工作在命令行并产生一个 load / 1 可以在控制台中正确处理的字节码文件,因此在设置方法方面存在一些小问题。我发送了一个错误报告后,我会发布另一个注意事项。我还没在Linux下试过它。
答案 1 :(得分:0)
您可以使用current_predicate/1
或predicate_property/2
来访问谓词,并使用clause/2
来访问谓词的子句。
然后您可以使用该信息编写保存实用程序。