prolog是否有内置谓词,可以在运行时导入和导出完整的文件?
我需要像“断言”和“撤回”这样的谓词。问题是“断言”和“收回”只能操纵动态列表,而不是完整的文件。
我知道如何将文件包含到另一个文件中的两种方法:
:- include('file.pl').
:- consult('file.pl').
这主要发生在代码的开头。
我可以在代码中间使用这些谓词吗? (我认为咨询谓词有效,但我对include谓词有问题...)
有没有机会再次排除/“删除”包含的文件? (更重要的问题)
我找到了内置的谓词“delete_file / 1”,它实际上删除了文件(来自你的内存) - 这不是我想要的。但是文件仍然没有从当前程序中删除,只是从内存中删除,这真的很奇怪......
我希望有人可以帮助我,因为除了上面解释的谓词之外我找不到任何其他内容。谢谢!
答案 0 :(得分:2)
并非所有的序言都承认consult
(例如,GNU Prolog没有)。但include/1
和consult/1
似乎在SWI Prolog的中间文件和GNU Prolog的include/1
中工作。
撤消文件咨询是另一个问题。 Prolog查阅文件,处理所有事实和谓词,并且在操作完成时忘记了它来自特定文件的事实。就好像你手动输入它们一样。它没有记录任何特定的谓词或事实来自特定的咨询文件。要“撤消”任何此类事实或谓词,您必须对由retract/1
或retractall/1
声明的项目执行include
或consult
。如果您咨询的仿函数是唯一的,那么这可能很简单,因为那样您可能会使用retractall(my_unique_functor(_,_)).
或retract(foo(_)).
。但是如果你混合它们(现有的和新断言的)并且想要被选中,你将不得不对它们进行排序。
答案 1 :(得分:1)
Logtalk包含一个编程示例“named_databases”,它支持您正在寻找的功能:
https://github.com/LogtalkDotOrg/logtalk3/tree/master/examples/named_databases
此示例支持ECLiPSe,Lean Prolog,SICStus Prolog,SWI-Prolog和YAP,它在其实现中使用模块系统(Lean Prolog除外,它本身提供了大部分功能)用于实际数据库和Logtalk的术语 - 扩展机制,用于优化命名数据库谓词的使用。