在我的程序中我有一个动态的子句,它们工作正常,但是当我关闭程序时,它们正在消失。保存GProlog数据库
我tryed这
saveState :-
write_pl_state_file('backup.dat').
loadState :-
file_exists('backup.dat'),
read_pl_state_file('backup.dat'); !.
但这不是作品。
有没有办法将这个数据库保存到文件?
在我的程序中我有一个动态的子句,它们工作正常,但是当我关闭程序时,它们正在消失。保存GProlog数据库
我tryed这
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标志连接等
所以这是其一部分你的解决方案(可能),但更根本的是,你希望保存动态子句定义,可能采用允许你通过查阅文件来恢复它们的形式。
谓词列表/ 0做了这样的事情,但它显示了“控制台”的动态子句,而不是文件。可能您想要使用the underlying predicateportray_clause/2,它允许将输出重定向到文件(流)。
作者丹尼尔·迪亚斯noted a slight change(添加换行符结束的输出)为portray_clause/2在最近发行说明1.4.0版本,所以你可能要确保你有最新版本的为了易读。
补充:
看来,首先是版本1.3.2 GNU Prolog的支持发送上市/ 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 ...菜单相当于)的问题。编译工作从命令行生成一个字节码文件,其中加载/ 1可以在控制台中正确处理,所以在设置事件方面存在一些小问题。当我得到这个消息时,我会发布进一步的注释,并发送了一个错误报告。我还没有在Linux下尝试过。
您可以使用current_predicate/1
或predicate_property/2
来访问谓词,并使用clause/2
来访问谓词的子句。
然后,您可以使用该信息编写保存实用程序。
所以我可以加载这个条款*咨询*? – skayred
你能提供一些保存的例子吗? – skayred
@skayred:它确实创建了一个普通的Prolog源文件(当然没有注释,并且对变量名称进行了一些重构)。我添加了上面的代码片段来说明这个想法,尽管我一般会遇到一个咨询文件的问题。当我明白这一点时,我会再发表一篇文章。 – hardmath