Prolog 人工智能语言中文论坛---打造优质Prolog学习交流园地
Would you like to react to this message? Create an account in a few clicks or log in to continue.
Prolog 人工智能语言中文论坛---打造优质Prolog学习交流园地

一个供Prolog爱好者学习与交流的地方


您没有登录。 请登录注册

有人知道如何保存动态谓词吗?

2 posters

向下  留言 [第1页/共1页]

1有人知道如何保存动态谓词吗? Empty 有人知道如何保存动态谓词吗? 周二 三月 13, 2012 2:46 pm

Mercury Liao


Admin

想设计一个能让电脑"学习"的机制,
比如一个read(X),电脑发现X这个事实它还不知道,
那就会asserta(X)。

现在问题是,程序结束后,我如何能让X存在电脑里的某个地方,
就像是我们大脑记得这件事情一样。

当然,我可以用write(X)将X写进某个文件里存在系统里,
但我还想要做到的是,如果电脑发现它错了,它会修正自己的记忆,
比如用confidence表示对一件事情的信心程度,如果Y与X矛盾,电脑对Y的信心又比较高,
电脑会从记忆中删除X事实,加入Y事实。
如果刚才用的是write(X)写进文件里,现在要改就不好改了。

总之,数据库的管理最最基本的就是要能方便的实现新增、修改、删除、查询,
而对于动态谓词,Prolog有没有一种方法能方便的做到这些功能,并且当我关掉Prolog时仍然不会消失?

http://prolog.longluntan.net

wdx04



不同的Prolog实现,保存状态的方式不一样,没有统一的方法。

1.SWI-Prolog使用qsave_program谓词来保存当前状态:
assert(friend(sayuri, mai)).
assert(sister(kaori, shiori)).
qsave_program('kanon.sav', [stand_alone=false]).
注意SWI-Prolog没有提供一个qload_program谓词来加载状态,只能用解释器的命令行参数来加载保存的状态,例如:
swipl -x kanon.sav

2.YAP-Prolog使用save或save_program来保存状态,用restore加载状态。
assert(friend(sayuri, mai)).
assert(sister(kaori, shiori)).
save('kanon.sav').
restore('kanon.sav').

3.SICStus Prolog有和Yap类似的save_program和restore谓词,此外还可以保存指定的谓词到二进制文件中。
assert(friend(sayuri, mai)).
assert(sister(kaori, shiori)).
save_predicates([friend/2,sister/2], 'kanon.po').
load_files('kanon.po').

Mercury Liao


Admin

wdx04 写道:不同的Prolog实现,保存状态的方式不一样,没有统一的方法。

1.SWI-Prolog使用qsave_program谓词来保存当前状态:
assert(friend(sayuri, mai)).
assert(sister(kaori, shiori)).
qsave_program('kanon.sav', [stand_alone=false]).
注意SWI-Prolog没有提供一个qload_program谓词来加载状态,只能用解释器的命令行参数来加载保存的状态,例如:
swipl -x kanon.sav

2.YAP-Prolog使用save或save_program来保存状态,用restore加载状态。
assert(friend(sayuri, mai)).
assert(sister(kaori, shiori)).
save('kanon.sav').
restore('kanon.sav').

3.SICStus Prolog有和Yap类似的save_program和restore谓词,此外还可以保存指定的谓词到二进制文件中。
assert(friend(sayuri, mai)).
assert(sister(kaori, shiori)).
save_predicates([friend/2,sister/2], 'kanon.po').
load_files('kanon.po').

以SWI-Prolog来说,如果是用qsave_program来保存,
好像还没有用listing谓词方便,我指的是listing进一个文件:
tell(文件名), listing, told.
而且listing产生的文件,还可以用include谓词把它加载进来。

我主要觉得麻烦的地方是,
修改了一个谓词后,还要把整个文件重新listing一遍,
有点浪费系统资源的感觉。
小一点的程序还好,如果是很大的项目,
几千几万条的谓词,那肯定都是分好几个文件储存动态谓词的吧!
这时候非常需要一个功能让我可以很方便的删除某一个谓词,新增某一个谓词,
(电脑能直接找到储存该谓词的文件,只删除该谓词,增加修改后的谓词,
而不是将该文件整个删除,再将原文件内其他根本没修改的谓词全部重新copy一遍)。

http://prolog.longluntan.net

wdx04



Mercury Liao 写道:以SWI-Prolog来说,如果是用qsave_program来保存,
好像还没有用listing谓词方便,我指的是listing进一个文件:
tell(文件名), listing, told.
而且listing产生的文件,还可以用include谓词把它加载进来。

我主要觉得麻烦的地方是,
修改了一个谓词后,还要把整个文件重新listing一遍,
有点浪费系统资源的感觉。
小一点的程序还好,如果是很大的项目,
几千几万条的谓词,那肯定都是分好几个文件储存动态谓词的吧!
这时候非常需要一个功能让我可以很方便的删除某一个谓词,新增某一个谓词,
(电脑能直接找到储存该谓词的文件,只删除该谓词,增加修改后的谓词,
而不是将该文件整个删除,再将原文件内其他根本没修改的谓词全部重新copy一遍)。
这方面还是SICStus Prolog做得好。另外数据量大的话可以考虑使用外部数据库,SICstus Prolog、Visual Prolog和Yap都有外部数据库系统。

返回页首  留言 [第1页/共1页]

您在这个论坛的权限:
不能在这个论坛回复主题