多事实数据库逻辑编程:寻求支持一致性子集的原生语言机制
多事实/规则集的一致性验证与多数据库支持的逻辑编程语言
确实有不少逻辑编程语言原生支持这类需求,不用靠给事实加额外参数这种“技巧”来实现,下面分两类介绍:
一、内置一致性验证或多知识库管理能力的语言
SWI-Prolog(模块与断言数据库)
SWI-Prolog的模块系统可以把不同的事实/规则集隔离在独立命名空间里,每个模块有自己的谓词集合,还能直接跨模块查询并验证一致性。
示例代码:
% 定义数据库1的模块 :- module(db1, [is/2]). is(X, mammal) :- is(X, elephant). % 定义数据库2的模块 :- module(db2, [is/2]). is(X, mammal) :- is(X, elephant). % 定义数据库3的模块 :- module(db3, [is/2]). is(X, fish) :- is(X, elephant). % 验证两个模块是否逻辑一致的谓词 consistent(Mod1, Mod2) :- forall((Mod1:is(X,Y), Mod2:is(X,Z)), Y = Z).
调用consistent(db1, db2)会返回true,consistent(db1, db3)返回false,全程不用给事实加额外标记。
Clingo(Answer Set Programming)
ASP(回答集编程)天生适合处理多知识库的一致性问题,你可以把每个事实/规则集写成独立的逻辑程序,通过合并程序后是否存在合法回答集来判断一致性——有回答集说明无矛盾,反之则不一致。
示例:
分别创建三个规则集文件:
db1.lp:
is(X,mammal) :- is(X,elephant).
db2.lp:
is(X,mammal) :- is(X,elephant).
db3.lp:
is(X,fish) :- is(X,elephant).
验证db1和db3的一致性时,合并两者并添加事实is(elephant,elephant).,运行Clingo会发现没有可行的回答集,说明两者矛盾;合并db1和db2则会生成合法的回答集,证明一致。
二、原生支持多数据库操作的逻辑编程语言
Mercury
作为强类型逻辑编程语言,Mercury支持**多状态(multiple state)**机制,你可以把每个事实集封装成独立的状态(相当于独立数据库),程序中可以直接切换或操作多个状态,完全不需要手动标记事实归属。
XSB Prolog
XSB的表空间(tabling space)和模块系统结合,支持把不同事实集放在独立的命名空间中,原生支持多数据库的并行查询和一致性验证,不用额外修改事实结构。
内容的提问来源于stack exchange,提问作者Paul Jurczak
相关产品推荐
相关产品推荐

