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

Database 动态数据库-包括和排除文件,database,dynamic,include,prolog,Database,Dynamic,Include,Prolog,prolog是否有内置谓词,可以在运行时导入和导出完整的文件 我需要像“assert”和“retract”这样的谓词。问题是“断言”和“收回”只操作动态列表,而不是完整的文件 我知道将一个文件包含到另一个文件中的两种方法: :- include('file.pl'). :- consult('file.pl'). 这通常发生在代码的开头 我能在我的代码中间使用这些谓词吗?(我认为consult谓词有效,但include谓词有问题… 是否有可能再次排除/删除包含的文件?(更重要的问题) 我发现了

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

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

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

:- include('file.pl').
:- consult('file.pl').
这通常发生在代码的开头

<>我能在我的代码中间使用这些谓词吗?(我认为consult谓词有效,但include谓词有问题…
是否有可能再次排除/删除包含的文件?(更重要的问题)

我发现了内置谓词“delete_file/1”,它从字面上删除文件(从内存中)——这不是我想要的。但文件仍然没有从当前程序中删除,只是从内存中删除,这真的很奇怪


我希望有人能帮助我,因为除了上面解释的谓词,我找不到其他任何东西。谢谢

并不是所有的序言都能识别
consult
(例如,GNU序言不能识别)。但是
include/1
consult/1
似乎在SWI-Prolog和GNU-Prolog中的
include/1
文件中间工作


撤消文件查询是另一个问题。Prolog查阅该文件,将所有事实和谓词拖入其中,并且当操作完成时,会忘记它全部来自某个特定文件的事实。就好像你都是手工输入的。它没有任何记录表明任何特定的谓词集或事实都来自特定的参考文件。要“撤消”任何此类事实或谓词,您必须对由于
include
consult
而断言的项目执行
收回/1
收回/1
。如果您正在咨询的functor是唯一的,那么这可能很简单,因为这样您可能会逃脱
retractall(my_unique\u functor(u,u))。
retract(foo(u))。
。但是,如果您混合了它们(现有的和新断言的),并且希望被选中,则必须对它们进行分类。

Logtalk包括一个编程示例,“命名的_数据库”,它支持您正在寻找的功能:

此示例支持ECLiPSe、Lean Prolog、SICStus Prolog、SWI Prolog和YAP,并在其实现中使用模块系统(Lean Prolog除外,它提供了大部分本地功能)用于实际数据库,以及Logtalk的术语扩展机制用于优化命名数据库谓词的使用