我有一个预填充的'.pl'文件,其中包含事实和规则。我使用pyswip的 consult()方法打开文件。例如,关于对象的可拾取性,有两个事实:
prolog.assertz('pickable_object(light)')
现在,在我使用pyswip添加新事实之后:
for result in prolog.query('pickable_object(X)'):
print(result)
查询
const originContent = '<div>test</div><h1>test</h1>[youtube id="YOUTUBE_ID" width=650] <p>test</p>'
const content = originContent.replace(/\[youtube id=\"([^"]+)\" width=(\d+)\]/i, '<iframe class="ql-video ql-align-center" frameborder="0" allowfullscreen="true" src="https://www.youtube.com/embed/$1?showinfo=0"></iframe>')
console.log(content)
可以完美工作并打印:
{'X':'pen'} {'X':'paper'} {'X':'light'}
但是,断言不会被写入'.pl'文件。如何启用此功能?
作为一种解决方法,我只是将new子句字符串添加为新行,作为文本文件处理。
答案 0 :(得分:1)
如果您感兴趣的只是保存和还原Prolog运行之间的动态谓词状态,则最简单的方法可能是使用persistency library。对于您的示例,您可能具有以下文件myfacts_db.pl
:
:- module(myfacts_db,
[ attach_myfacts_db/1, % +File
get_myfact/1, % ?Fact
set_myfact/1 % +Fact
]).
:- use_module(library(persistency)).
:- persistent
myfact(fact:any).
attach_myfacts_db(File) :-
db_attach(File, []).
get_myfact(pickable_object(pen)).
get_myfact(pickable_object(paper)).
get_myfact(Fact) :-
myfact(Fact).
set_myfact(Fact) :-
assert_myfact(Fact).
如果我们第一次使用新模块运行Prolog,则会得到:
$ swipl
?- use_module(myfacts_db).
true.
?- attach_myfacts_db('test.pl').
true.
?- findall(X,get_myfact(pickable_object(X)),Objects).
Objects = [pen, paper].
?- set_myfact(pickable_object(light)).
true.
?- findall(X,get_myfact(pickable_object(X)),Objects).
Objects = [pen, paper, light].
?- halt.
将创建数据库文件test.pl
(如果尚不存在)。如果我们随后再次启动Prolog,我们将:
$ swipl
?- use_module(myfacts_db).
true.
?- attach_myfacts_db('test.pl').
true.
?- findall(X,get_myfact(pickable_object(X)),Objects).
Objects = [pen, paper, light].
请注意,这样创建的数据库不仅是事实列表,而且看起来像这样(其他内容用于处理同步):
$ cat test.pl
created(1565656419.9478514).
assert(myfact(pickable_object(light))).
如果您实际上希望最后有一个仅列出“纯”事实pickable_object(light)).
等的文件,则我不知道SWI-Prolog的任何内置方法都支持该方法,因此在那种情况下,您确实必须通过文件I / O来读写文件(或相应地修改DB文件)。但是,一旦您还希望支持删除事实,共享访问权限等,这将变得棘手。