Prolog的插入,在分离的数据库文本文件,修改和删除的事实(Prolog insert, modi

2019-06-25 02:30发布

我有很多事实的序言数据库文件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.

此文件咨询(咨询/ 1)每次我再次执行程序的时间。

我想是能够插入,修改和删除我想事实(其中一些直接,其他一些符合某些特定条件)写或该数据库文本文件中直接删除。

像assertz,收回和retractall但修改这个文本文件,这样的变化保持永久存在。

我该怎么做?

Answer 1:

您可以创建你想要的事实,并将其写入到(同)文件或修改数据库,然后将其保存在文件中。

所不同的是第一种方法,你将有装载,而第二种方法将在执行过程中改变了旧文件的分贝。

从你的措辞我假设你想要做的第二个问题的方式; 要做到这一点,你应该:

1)申报所有你想要改变作为谓词动态 2)断言,执行3时收回等)写入新的数据库文件。 你可以使用上市/ 1

要写出你可以这样做:

tell(knowledge),
.....
told.

或者你可以使用一些其他的IO谓词 。 也许使用set_prolog_IO / 3是最简单的方式。

现在,如果你想第一个,你应该构建谓词(可能使用的大学运营商 )或其他字符串操作谓词,然后将它们写入文件

编辑:

有上市/ 0,但将列出所有的谓词加载(你可能不希望)。 经过一番搜索,我发现SOURCE_FILE / 2 ; 所以你可以这样做

findall(X,source_file(X,FileName),L).

注意,SOURCE_FILE / 2,需要绝对的文件名。 您可以使用absolute_file_name / 2来获得它的方式SOURCE_FILE / 2格式的谓词是有点怪异(我期待像富/ 1),但它看起来像你可以把它给上市/ 1和它工作得很好,所以你可以这样做:

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

在另一方面,你可以随时与你想不想找个地方存放在文件中的谓词列表



Answer 2:

如果您正在使用SWI-Prolog的有几种选择:

搜索序言执着我难倒到持续性 :乍一看可能是有用的模块。

再有就是对“图书馆外部表 ”,即存储在文件和索引。 您应该使用,如果你有不适合在内存中,或者加载/保存整个数据集,时间太长的数据。

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



文章来源: Prolog insert, modify and delete facts on a separated database text file