gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:55:05 25 4
gpt4 key购买 nike

我有一个包含大量事实的序言数据库文件 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、retract 和 retractall 但修改此文本文件以便更改永久保留在那里。

我该怎么做?

最佳答案

您可以创建所需的事实并将它们写入(相同的)文件或修改数据库,然后将其保存在文件中。

不同之处在于,使用第一种方法,您将加载旧文件的数据库,而第二种方法将在执行期间更改它。

从你表述问题的方式来看,我假设你想做第二个;为此,您应该:

1) 将所有要更改的谓词声明为 dynamic2)执行期间断言,撤回等3)将新数据库写入文件。你可以使用 listing/1

要写你可以这样做:

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

或者您可以使用其他一些 io predicates .也许使用 set_prolog_IO/3将是最简单的方法。

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

编辑:

有 listing/0 但它会列出所有加载的谓词(你可能不想要的东西)。经过一番搜索,我找到了 source_file/2 ;所以你可以做类似的事情

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

请注意,source_file/2 需要绝对 文件名。你可以使用 absolute_file_name/2为拿到它,为实现它source_file/2 格式化谓词的方式有点奇怪(我期待像 foo/1 这样的东西)但看起来你可以把它给 listing/1 并且它工作正常所以你可以做这样的事情:

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

另一方面,您始终可以拥有一个包含要存储在文件中某处的谓词的列表

关于database - Prolog 在单独的数据库文本文件上插入、修改和删除事实,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10857202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com