Database Prolog在单独的数据库文本文件中插入、修改和删除事实
我有一个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) 我希望能够通过在此数据库文本文件中直接写入或删除来插入
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,我想我会立即投入使用。谢谢你!是的,看起来很有趣!