您可以创建所需的事实并将它们写入(相同)文件或修改数据库,然后将其保存在文件中。
不同之处在于,第一种方法将加载旧文件的数据库,而第二种方法将在执行期间更改它。
从你提出问题的方式来看,我假设你想做第二个;为此,您应该:
1)将所有要更改的谓词声明为动态
2)在执行期间断言、撤回等 3)将新数据库写入文件。你可以使用Listing/1
要编写,您可以执行以下操作:
tell(knowledge),
.....
told.
或者您可以使用其他一些io 谓词。也许使用set_prolog_IO/3将是最简单的方法。
现在,如果您想要第一个,您应该构造谓词(可能使用univ 运算符)或其他字符串操作谓词,然后将它们写入文件
编辑:
有 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.
另一方面,您始终可以拥有一个包含要存储在文件中某处的谓词的列表