如何在写入.pl文件的pyswip中进行断言

时间:2019-04-22 07:08:40

标签: swi-prolog

我有一个预填充的'.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子句字符串添加为新行,作为文本文件处理。

1 个答案:

答案 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文件)。但是,一旦您还希望支持删除事实,共享访问权限等,这将变得棘手。