动态数据库 - 包括和排除文件

时间:2014-01-07 20:23:56

标签: database dynamic include prolog

prolog是否有内置谓词,可以在运行时导入和导出完整的文件?

我需要像“断言”和“撤回”这样的谓词。问题是“断言”和“收回”只能操纵动态列表,而不是完整的文件。

我知道如何将文件包含到另一个文件中的两种方法:

:- include('file.pl').
:- consult('file.pl').

这主要发生在代码的开头。

我可以在代码中间使用这些谓词吗? (我认为咨询谓词有效,但我对include谓词有问题...)
有没有机会再次排除/“删除”包含的文件? (更重要的问题)

我找到了内置的谓词“delete_file / 1”,它实际上删除了文件(来自你的内存) - 这不是我想要的。但是文件仍然没有从当前程序中删除,只是从内存中删除,这真的很奇怪......

我希望有人可以帮助我,因为除了上面解释的谓词之外我找不到任何其他内容。谢谢!

2 个答案:

答案 0 :(得分:2)

并非所有的序言都承认consult(例如,GNU Prolog没有)。但include/1consult/1似乎在SWI Prolog的中间文件和GNU Prolog的include/1中工作。

撤消文件咨询是另一个问题。 Prolog查阅文件,处理所有事实和谓词,并且在操作完成时忘记了它来自特定文件的事实。就好像你手动输入它们一样。它没有记录任何特定的谓词或事实来自特定的咨询文件。要“撤消”任何此类事实或谓词,您必须对由retract/1retractall/1声明的项目执行includeconsult。如果您咨询的仿函数是唯一的,那么这可能很简单,因为那样您可能会使用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的术语 - 扩展机制,用于优化命名数据库谓词的使用。