Database Prolog在单独的数据库文本文件中插入、修改和删除事实

Database Prolog在单独的数据库文本文件中插入、修改和删除事实,database,prolog,Database,Prolog,我有一个prolog数据库文件,其中包含大量事实knowledge.pl。例如: father_of(joe,paul). father_of(joe,mary). mother_of(jane,paul). mother_of(jane,mary). male(paul). male(joe). female(mary). female(jane). % and so on. 每次再次执行我的程序时,都会查阅此文件(consult/1) 我希望能够通过在此数据库文本文件中直接写入或删除来插入

我有一个prolog数据库文件,其中包含大量事实
knowledge.pl
。例如:

father_of(joe,paul).
father_of(joe,mary).
mother_of(jane,paul).
mother_of(jane,mary).
male(paul).
male(joe).
female(mary).
female(jane). % and so on.
每次再次执行我的程序时,都会查阅此文件(consult/1)

我希望能够通过在此数据库文本文件中直接写入或删除来插入、修改和删除我想要的事实(其中一些是直接插入的,另一些是满足某些特定条件的)

类似于assertz的东西,收回和收回除了修改这个文本文件之外的所有内容,以使更改永久保留在那里


如何操作?

您可以创建所需事实并将其写入(同一)文件,也可以修改数据库,然后将其保存在文件中

不同之处在于,第一种方法将加载旧文件的db,而第二种方法将在执行期间更改它

从你对问题的措辞来看,我认为你想做第二件事;为此,您应该:

1) 将所有要更改的谓词声明为 2) 执行期间断言、收回等 3) 将新数据库写入该文件。你可以用

要写作,您可以做如下操作:

tell(knowledge),
.....
told.
save(FileName):-
    absolute_file_name(FileName,Abs),
    findall(X,source_file(X,Abs),L),
    tell(FileName),
    maplist(listing,L),
    told.
或者你可以用其他的。也许使用是最简单的方法

现在,如果您想要第一个,您应该构造谓词(可能使用)或其他字符串操作谓词,然后将它们写入文件

编辑:

这里有清单/0,但它将列出所有加载的谓词(您可能不希望看到)。 经过一番搜寻,我发现;所以你可以做一些像

findall(X,source_file(X,FileName),L).
请注意,source_file/2需要绝对文件名。你可以用它来得到它 source_file/2格式化谓词的方式有点奇怪(我希望类似于foo/1),但看起来您可以将其交给清单/1,它工作正常,因此您可以执行以下操作:

tell(knowledge),
.....
told.
save(FileName):-
    absolute_file_name(FileName,Abs),
    findall(X,source_file(X,Abs),L),
    tell(FileName),
    maplist(listing,L),
    told.

另一方面,如果使用SWI Prolog,则始终可以在文件中的某个位置存储一个包含谓词的列表

,有几种选择:

搜索prolog持久性时,我陷入了困境:一个乍一看可能有用的模块

然后是“”的库,即存储在文件中并编制索引。如果内存中有不适合的数据,或者加载/保存整个数据集的时间过长,则应使用该选项


否则,thanosQR的答案建议使用“老式”的方法来处理持久性。

必须执行清单/1中的所有谓词并不理想,但无论如何它都会起作用,谢谢。有没有什么方法可以像列表一样使用整个文本文件?仅针对一个特定文件,而不是针对运行时中加载的所有文件。以防万一,我在文件中有不止一个谓词,比如规则、模块或库导入。无论如何,由于你的问题,我“发现”了persistency.pl,我想我会立即投入使用。谢谢你!是的,看起来很有趣!