“本页的完整求解接口允许在 SAT 时返回模型。若手头黑箱只回答一个真假位,逐变量自归约说明怎样补上模型输出:先确认可满足,再每次固定一个变量;该页同时给出无解、空变量、空子句及查询位长的完整…”
形式陈述
输入是一份 CNF 公式
给定部分赋值
其中
假定有准确的 SAT 判定 oracle
- 询问
。若否,返回UNSAT并停止 - 置当前公式
、赋值表 为空 - 对
,构造 ,询问 。若是,记录 并置 ;若否,记录 并置 - 返回长度为
的完整赋值
这里特意每个变量都询问一次,包括已经不在当前子句中出现的变量,使查询数口径完全固定:可满足输入恰为
直觉
判定器像只会回答“这条路后面还有出口吗”的向导。恢复算法每次先试 0 分支;如果没有出口,就走 1 分支。但这一动作之所以可靠,是因为走到当前节点之前已知这里至少有一个出口。没有初次 SAT 检查,两个分支都失败时仍盲选 1,就会把任意比特串错当答案。
例子与边界
三个变量,四次询问
取变量表
初次询问回答是。例如
| 轮次 | 试零后的公式 | oracle 回答 | 固定结果 | 保留的当前公式 |
|---|---|---|---|---|
| 是 | 同试零公式 | |||
| 含空子句,另一子句已真 | 否 | |||
| 空子句集,即真 | 是 | 真 |
输出是 010。逐项检查原式:第一条由
一般正确性与终止
第
每轮固定一个之前未固定的变量,因此恰好
空输入、空子句和无关变量
对 UNSAT,不进入恢复。这个字符串是对所信任 oracle 回答的转述,并非一个可独立检查的归结反驳。
000,仍有四次询问。不出现在公式里的变量可任选,而本算法的确定规则总选 0。
线性查询数不等于线性总时间
限制操作不增添文字或子句,变量表保持原样,因此每条查询的编码长度为
这里使用顺序扫描的有限编码实现,没有假设任意长整数比较免费。若一个实际 SAT 判定器在长度不超过
推论与应用
这一构造说明 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 与多项式归约