形式陈述
正规则、输入与派生关系
本页讨论正的、无函数符号的 Datalog。程序 是有限规则集,每条规则形如
项只能是变量或常量;所有头变量必须出现在至少一个正关系体原子中。规则体是合取查询公理库合取查询Conjunctive query · CQ · Select-project-join query用关系事实的匹配定义集合答案,并以规范数据库与反向同态判定所有有限实例上的查询包含。式的匹配条件,多个规则可以产生同一个头关系。所有变量按全称量化理解:每次体原子同时成立,头事实就必须成立。允许空体,但此时头不能有变量,规则只声明一个基事实。
关系符号分成两类。EDB 是给定的输入关系,只出现在规则体中,整个计算期间不变;IDB 是由规则定义的关系,可以出现在头和体中,从空关系开始计算。头原子恰有一个,所以规则对应确定子句(definite clause);一般 Horn 子句只要求至多一个正文字,还包括没有正文字的约束,不能全部当作这里的事实生成规则。
固定有限输入 ,以
作为求值所需的有限值集合。常量表示固定值,不同常量名表示不同值。令 为所有 IDB 符号在 上能组成的带关系名的事实集合,则
零元关系采用 ,包括 时;因而这里 按空元组的数量取 。若 为空,正元事实不存在,零元事实仍可能为真。例如 可以推出 ,却不引入任何值。外部一阶论域仍可非空;范围限制保证向其中添加未使用的值不会产生新的匹配。
后承算子与有限最小模型
把全部 IDB 事实合记为 。定义一次头后承与保留旧事实的算子:
这里 枚举规则变量到 的赋值;无变量规则有唯一的空赋值。正体保证 单调,但它在任意 上未必包含 :例如只有 、 时,常量 属于 ,但 。本页显式加入并集,使 同时单调且扩张。
从 开始令 。每次严格变化至少加入一个事实,至多发生 次;最终存在 使 。这个稳定值 是固定 EDB 为 时的最小规则闭合 IDB 扩展,即 Datalog 的最小模型语义。最小指包含在所有其他模型中,比“删不掉任何事实的极小模型”更强。
直觉
非递归合取查询只对现有表做一次匹配。Datalog 允许把刚得到的答案放回规则体,再为后续匹配提供见证。例如先知道 能到 ,又知道 有一条边到 ,便把“ 能到 ”存成新事实;下一轮可以继续使用它。
最小性排除了凭空添加的结论。规则 允许任意 成为闭合关系,但空输入时最小答案仍为空:循环引用本身没有提供证据。每个实际推导出的事实都有一棵有限证明树,叶子来自输入或空体规则,内部节点是一条规则的成功应用。按轮数和树高分别归纳,就能在迭代语义与有限证明树之间来回转换。
终止也不依赖图是否有环。环能提供无限多条游走,却只能反复证明有限个有序节点对。关系按集合存储,重复证明不会增加新的事实;算法计算的是哪些事实成立,而不是共有多少条证明。
例子与边界
四条边推出九个可达对
令 ,定义
是固定 EDB, 是唯一 IDB。用 简写 ,令 。从 开始,完整计算为:
| 轮次 | 新事实 | 累计 |
|---|---|---😐
| 1 | | 4 |
| 2 | | 8 |
| 3 | | 9 |
| 4 | | 9 |
第二轮的四条见证依次是 、、、。第三轮把 接到 得到 ;把 接到 只重新得到 ,其余延伸也已出现。第四轮唯一待延伸的新对以 结束,而 没有出边,因此停止。最终答案恰为
归纳可得, 包含且仅包含长度在 到 之间的游走端点对。正向由每次只追加一条边得到;反向把长度至少为二的游走拆成前缀与最后一条边。因此稳定结果是正长度可达关系。 来自环;没有 。若需要反身传递闭包,应提供节点关系并增加 。孤立节点尤其需要显式列入 ,仅有边表无法表达它存在。
线性递归的半朴素求值
定义关系连接 ,这里明确按“先 后 ”的次序使用符号。朴素迭代反复计算 ,其中旧事实与 的连接已经做过。初始化 ,以后只计算
它与朴素算法逐轮相同。因为 ,连接分配为旧连接与增量连接,而 :旧连接结果上一轮已加入。减去 后,只剩增量连接可能贡献新事实。对 , 同样成立,于是归纳建立每轮相等。
去重仍然必要。新输入事实可以产生旧输出,也可以有多个新见证产生同一输出;上例的 就再次产生 。半朴素求值减少重复的规则匹配,不承诺每个程序、每种索引和输入规模都得到相同比例的加速。
非线性递归需要旧、新交叉项
若把递归规则改成 ,体中出现两个递归关系,不能只算 。保留种子规则 ,初始化仍为 。正确增量为
证明先按两个体原子的来源展开 。旧—旧项已经包含于 ;剩下新—旧、旧—新、新—新三项。公式的第一项覆盖新—旧,第二项同时覆盖旧—新与新—新,因而没有遗漏。这是一般半朴素方法的要点:每个尚未处理的成功匹配至少使用一个新增体事实,不要求全部体事实都新增。
在链 上,第一轮是四条边,第二轮新增 。第三轮正确新增 ;若只连接两个第二轮增量,只能得到 ,漏掉长度三的 。下一轮错误算法的增量只有 ,也无法补回遗漏。这同时说明非线性程序的轮次不再对应“每轮多一条边”:它可以把两段已知游走直接拼接。
哪些扩展改变证明
加入否定后,增大 可能使原本成立的规则体失效。例如 在加入 后不再支持 ,所以原来的单调性论证失效;仅靠保留旧事实也不能解释预期的否定语义。分层否定需要另行规定计算次序与语义。
函数项、生成新值的算术、存在量化的头变量会破坏固定有限事实空间。比如允许 后,从 可生成无限项。本文的有限终止论证因此不能直接覆盖这类语言、一般事实生成 chase、聚合或含 NULL 与重复行的 SQL。
推论与应用
为什么稳定值恰是最小模型
先证单调性:若 ,每个在 中成功的正体匹配,在 中仍成功,所以 ,继而 。加上 ,迭代是一条有限升链,必定稳定。
稳定时 ,意味着所有成功匹配的规则头已经存在,所以 满足每一条规则。为证最小性,任取另一个规则闭合扩展 。初值 ;若 ,由单调性与闭合性得到
归纳给出 。这证明的是所有模型共同包含的最少事实,而不仅是某次运行恰好停住。也可把整个过程放入Knaster–Tarski 不动点定理公理库Knaster–Tarski 不动点定理Knaster-Tarski fixed-point theorem · Tarski fixed-point theorem完备格上的单调自映射之全部不动点构成完备格,并具有规范的最小与最大不动点。: 是有限完备格, 是单调映射;本页的有限归纳进一步给出可执行的终止理由。
关系运算与复杂度
每条正规则可用关系代数公理库关系代数Relational algebra · Set relational algebra用选择、投影、积、重命名与集合运算组合有限关系查询,并在集合语义下解释连接和存在见证。中的重命名、选择、连接与投影实现,多条同头规则取并。递归所增加的是重复执行直到闭合的控制机制;这些单轮运算本身仍是有限表运算。半朴素算法中的差集只用于排除已知输出,不是在规则语言中加入语义否定。
设程序固定,最多有 个变量出现在一条规则中,令 ,并写 。一轮至多枚举 个赋值;固定程序使每次需检查的体原子数为常数。用可常数时间查询成员的关系表,最多 轮可得 的直接上界。这里 ;元数、符号数与程序常量数均固定,加入程序常量只使输入活跃域大小增加一个有界量,所以这仍是输入规模的多项式。若用顺序扫描,仍是多项式,只是次数更高。它是透明的终止与复杂度上界,并非推荐的物理执行计划。
标准事实成员判定中,正 Datalog 的数据复杂度是 P 完全,含义是每个固定程序都可多项式求值,且存在固定程序达到 P 难;不表示每个程序都 P 难,上面的普通有向可达性就是更受限的任务。若程序也随输入增长,变量数和元数不再是常数,联合复杂度是 EXPTIME 完全。这两个完备性下界使用相应归约,超出了前述枚举上界的证明;可参见 Oxford Lecture 7,第 12–21 张幻灯片。
参考资料
- Serge Abiteboul、Richard Hull、Victor Vianu,Foundations of Databases,第 12 章,1995 在线版,§§12.1–12.3,Definitions 12.1.1–12.1.2、Theorems 12.2.3、12.3.4,pp. 276–286:语法、最小模型与有限迭代。本文显式采用 ,避免混淆后承与扩张。
- 同书第 13 章,§13.1,pp. 312–316,Algorithm 13.1.1:增量展开与半朴素求值。本页线性和非线性两式按集合分配律逐轮证明。
- Oxford,Lecture 7: Datalog,第 12–21 张幻灯片:数据复杂度与联合复杂度、相应下界的构造思路。