【发布时间】:2018-06-19 21:21:21
【问题描述】:
我是 Prolog 的新手,我正在努力解决使用 SWI-Prolog 的以下问题。
我有几个文件dataBase1.pl,dataBase2.pl,...具有相同的结构
(基于此thread)
:- module(dataBase1,[]).
:- use_module(library(persistency)).
:- persistent
predicate1(A:any, B:any),
predicate2(A:any, B:any).
:- initialization(init).
init :-
absolute_file_name('dataBase1.db', File, [access(write)]),
db_attach(File, []).
predicate1/2, predicate2/2 是所有数据库文件通用的。
然后,我在第三个文件predicates.pl 中定义了几个子句,这些子句利用了以前数据库中的子句,例如testPredicate(A,B) :- predicate1(A,B), predicate2(A,B).
我的问题是我希望上述子句使用与数据库文件对应的所有模块中的predicate1/2, predicate2/2。
在当前状态下,我需要精确上下文模块才能使用
predicate1/2, predicate2/2(即dataBase1:predicate1/2, dataBase2:predicate1/2,....)
我不能使用use_module/1,因为我将动态添加/删除数据库文件。
提前感谢您的任何建议!
编辑:根据 cmets 中的讨论,如何将 head(X,Y) :- body() 形式的可查询谓词定义为持久动态谓词?
【问题讨论】:
-
那么这些谓词是不同的?我敢肯定这在您的脑海中是有道理的,但这在 Prolog 中确实不是一个好的设计。有意义的是将一个谓词分布在多个文件中,这样应该可以正常工作。
-
感谢您的回答。如果我只使用一个数据库文件或几个没有模块的文件,就没有你说的问题。问题是为了能够选择我想在哪个数据库文件中“断言”我的新事实,我必须将每个数据库放在单独的模块中。使用持久性库,我必须定义哪些谓词将被动态添加(通过 persistent/1),麻烦就来了。
-
如果您必须分别调用位于不同模块中的谓词,也许它们不应该具有相同的名称?也许它们应该被称为
db1_predicate1等。或者数据库名称是谓词的一个参数并且谓词确实具有相同的名称。在这里很难说清楚,因为您的用例没有详细说明。 -
我必须从不同的模块调用我的谓词,因为持久性库的工作方式,而不是因为我自己的需要。在每个模块中更改谓词名称是一种可能性,但我必须在我的第三个文件“predicates.pl”中反映它。由于我将动态创建新数据库,因此我还必须使“predicates.pl”持久化并相应地更新它。我检查了文档,但持久性似乎只适用于事实而不适用于谓词定义。 (但我可能错了)
-
如果您认为事实与谓词不同,我不确定我是否遵循“持久性”的含义。在 Prolog 中,谓词只是数据库中的一个术语,就像事实一样。碰巧它是某种可查询形式的事实:
:-( head, body )。
标签: prolog swi-prolog