2011-11-13 23 views
0

在我的程序中我有一个动态的子句,它们工作正常,但是当我关闭程序时,它们正在消失。保存GProlog数据库

我tryed这

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

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

但这不是作品。

有没有办法将这个数据库保存到文件?

回答

1

谓词write_pl_state_file/1read_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下尝试过。

+0

所以我可以加载这个条款*咨询*? – skayred

+0

你能提供一些保存的例子吗? – skayred

+0

@skayred:它确实创建了一个普通的Prolog源文件(当然没有注释,并且对变量名称进行了一些重构)。我添加了上面的代码片段来说明这个想法,尽管我一般会遇到一个咨询文件的问题。当我明白这一点时,我会再发表一篇文章。 – hardmath