Skip to content

算法Algorithm

SAT 的逐变量见证恢复

SAT self-reduction · SAT search-to-decision · SAT 自归约

只调用返回是或否的SAT判定器,用逐变量限制恢复总赋值,并分开计算查询次数、查询位长、外层成本与无解终止。

形式陈述 ​

输入是一份 CNF 公式 F,以及显式列出的有序变量表 x1,…,xn。所有文字必须引用表内变量;表中允许有不出现在子句里的变量,输出也要给这些变量赋值。输入位长 N 包括变量表、子句边界、文字符号与编号,因而 n≤O(N)。这排除了“只用二进制写一个巨大 n,却要求输出 n 位”的另一种简洁编码任务。

给定部分赋值 a,限制公式 F↾a 的步骤是:删去已有真文字的整条子句,再从其余子句删除已被赋为假的文字。没有被赋值的文字保留。留下空子句表示矛盾;没有子句则表示真。它满足关键等价式:

b⊨F↾a⟺a∪b⊨F,

其中 b 给未固定变量赋值。原因是每条原子句要么已经由 a 满足,要么必须由剩余文字满足;逐子句合取后得到等价。

假定有准确的 SAT 判定 oracle D,只返回一个真或假值,不附赋值或反驳。恢复算法如下:

  1. 询问 D(F)。若否,返回 UNSAT 并停止
  2. 置当前公式 G=F、赋值表 a 为空
  3. 对 i=1,…,n,构造 H=G↾(xi=0),询问 D(H)。若是,记录 ai=0 并置 G=H;若否,记录 ai=1 并置 G=G↾(xi=1)
  4. 返回长度为 n 的完整赋值 a

这里特意每个变量都询问一次,包括已经不在当前子句中出现的变量,使查询数口径完全固定:可满足输入恰为 n+1,不可满足输入为 1。实现可以在真公式上直接填充剩余零以减少询问,但那是另一份查询计数。

直觉

判定器像只会回答“这条路后面还有出口吗”的向导。恢复算法每次先试 0 分支;如果没有出口,就走 1 分支。但这一动作之所以可靠,是因为走到当前节点之前已知这里至少有一个出口。没有初次 SAT 检查,两个分支都失败时仍盲选 1,就会把任意比特串错当答案。

SAT 不变量保持下的三次前缀选择
例子与边界

三个变量,四次询问 ​

取变量表 (x1,x2,x3),以及

F=(x1∨x2)∧(¬x1∨x3)∧(¬x2∨¬x3).

初次询问回答是。例如 (0,1,0) 满足三条子句。算法自身还不知道这个赋值,随后才逐项恢复:

轮次 试零后的公式 oracle 回答 固定结果 保留的当前公式
x1 (x2)∧(¬x2∨¬x3) 是 x1=0 同试零公式
x2 含空子句,另一子句已真 否 x2=1 (¬x3)
x3 空子句集,即真 是 x3=0 真

输出是 010。逐项检查原式:第一条由 x2 满足,第二条由 ¬x1 满足,第三条由 ¬x3 满足。先试 0 的规则还保证它是给定变量次序下的字典序最小满足赋值:每次舍弃的 0 分支确实没有答案,任何更小总赋值都会在某个首次分歧处落进这种被排除分支。

一般正确性与终止 ​

第 i 轮开始时的 不变量是:已经记录 a1,…,ai−1,当前 G=F↾a,并且 G 可满足。初次查询为真时建立它。若试零可满足,限制等价式直接保持不变量;若试零不可满足,当前 G 的任何满足赋值只能给 xi 取 1,所以限制为 1 后仍可满足。

每轮固定一个之前未固定的变量,因此恰好 n 轮后结束。此时没有自由变量,而当前公式仍可满足,只能是真公式;限制等价式于是证明完整的 a 满足原式。证明使用准确判定器。若把超时、未知或概率性猜测当成“否”,维持可满足性的推导立即失效。

空输入、空子句和无关变量 ​

对 (x1)∧(¬x1),初次询问为否,算法返回 UNSAT,不进入恢复。这个字符串是对所信任 oracle 回答的转述,并非一个可独立检查的归结反驳。

n=0 且无子句时,初次询问为是,零次循环后返回空赋值;空赋值是有效答案,不能拿它表示无解。n=0 且含空子句时,初次询问为否。空子句集即使带三个声明变量,也让算法依次选择 000,仍有四次询问。不出现在公式里的变量可任选,而本算法的确定规则总选 0。

线性查询数不等于线性总时间 ​

限制操作不增添文字或子句,变量表保持原样,因此每条查询的编码长度为 O(N)。按顺序扫描编码、比较编号并复制剩余文字,可给出保守的 O(Nlog⁡(n+2)) 位处理界;一次有效性检查另付多项式成本,例如直接检查编号与表的朴素实现为 O(N2)。每轮至多构造两个限制公式,加上写出 n 位答案,外层成本可界为

O(N2+nNlog⁡(n+2)+n).

这里使用顺序扫描的有限编码实现,没有假设任意长整数比较免费。若一个实际 SAT 判定器在长度不超过 cN 的输入上用时至多 T(cN),整套程序的保守时间上界为

O(N2+nNlog⁡(n+2)+n+(n+1)T(cN)).

n+1 仅是调用次数;oracle 内部可能耗费指数时间。位复杂度还要求把查询写入、解析与赋值输出一起记账。只保留当前公式与一个临时公式、原变量表及输出,外层工作存储可控制为 O(N+n) 位;判定器内部空间单列。

推论与应用

这一构造说明 SAT 搜索可多项式 Turing 归约到 SAT 判定,不声称 SAT 已有多项式求解算法。与 Karp 归约一次写出一个目标实例不同,这里后续查询依赖之前的回答;它也不同于 DPLL 在没有 oracle 时自行探索和回溯。

一般 FNP 关系可经 NP 前缀语言,再归约到一个 NP 完全判定器来恢复。SAT 更便利之处是前缀限制自然仍为 CNF,直接保留了原问题的接口。优化见证可在先确定最优阈值后使用同样的前缀思路,但所询问的必须是“满足阈值且兼容前缀”的语言。

共同终点与可运行检查器把判定黑箱明确实现为独立的暴力真值表,只为小输入复核这份恢复程序。有限穷举是实现证据;本页的不变量证明才覆盖任意有限输入。

参考资料
  • Boaz Barak,Introduction to Theoretical Computer Science, Chapter 16,§16.1,Theorem 16.1 与 Algorithm 16.2:搜索—判定恢复;本页采用初次存在性检查加单分支查询,并独立给出 CNF 限制与编码账本
  • Michael Sipser,Introduction to the Theory of Computation,3rd ed.,2013,§7.4,SAT 与多项式归约
关系图谱7 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系