在我的程序中,我有一个动态子句,它们工作正常,但是当我关闭我的程序时,它们就消失了。
我试过了
saveState :-
write_pl_state_file('backup.dat').
loadState :-
file_exists('backup.dat'),
read_pl_state_file('backup.dat'); !.
但这行不通。
有没有办法将此数据库保存到文件中?
在我的程序中,我有一个动态子句,它们工作正常,但是当我关闭我的程序时,它们就消失了。
我试过了
saveState :-
write_pl_state_file('backup.dat').
loadState :-
file_exists('backup.dat'),
read_pl_state_file('backup.dat'); !.
但这行不通。
有没有办法将此数据库保存到文件中?
谓词write_pl_state_file/1和read_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下尝试过。
您可以使用current_predicate/1
orpredicate_property/2
访问谓词,以及访问谓词clause/2
的子句。
然后,您可以使用该信息编写保存实用程序。