您可以创建所需的事实并将它们写入(同一)文件中,也可以修改数据库然后将其保存在文件中。
不同之处在于,使用第一种方法,您将加载旧文件的数据库,而第二种方法将在执行过程中更改它。
从你提出问题的方式来看,我假设你想做第二个;为此,您应该:
1)将所有要更改的谓词声明为dynamic2)执行过程中的断言、撤消等
3)将新数据库写入文件。您可以使用清单/1
要编写,您可以执行以下操作:
tell(knowledge),
.....
told.
或者你可以使用其他一些io 谓词。也许使用set_prolog_IO/3将是最简单的方法。
现在,如果您想要第一个,您应该构造谓词(可能使用大学运营商) 或其他字符串操作谓词,然后将它们写入文件
EDIT:
有listing/0,但这将列出所有加载的谓词(您可能不想要的东西)。
经过一番搜索我发现源文件/2;所以你可以做类似的事情
findall(X,source_file(X,FileName),L).
请注意,source_file/2 需要absolute文件名。您可以使用绝对文件名/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.
另一方面,您始终可以拥有一个包含要存储在文件中某处的谓词的列表