“Tseitin 编码把电路、程序路径条件和验证条件交给CNF SAT,同时保留从模型回读原输入的路径。硬件等价检查常编码“两个输出不同”的 miter 并断言其输出;若 CNF 可满足,投影…”
形式陈述 ​
CNF 可满足性问题的输入是一份合取范式
其中每个子句
求解过程通常维护部分赋值
输入规模应按变量数、子句数和总文字出现次数分别记录。给定候选模型,逐子句扫描即可在线性于总文字数的时间核验;相反,求解器没有找到模型并不构成 UNSAT 证书。不可满足结论需要穷尽一个可靠搜索,或给出归结、DRAT、LRAT 等可独立检查的反驳对象。
直觉
CNF 把一个布尔任务写成“全部约束都要通过”的清单,而每条约束又允许若干文字任选其一为真。部分赋值不是残缺模型,而是一张不断收紧的工作表:一个真文字足以关闭整条子句;一个假文字只删除一个出口;直到最后一个出口也被关闭才产生冲突。单位子句恰处在二者之间——只剩一个出口,因此它把下一步赋值逻辑地强制出来。
这种局部状态使大型公式能够增量处理。求解器无须在每次赋值后重新计算整份公式,只需访问可能因该赋值而改变状态的子句。局部处理并没有改变全局目标:所有传播、分支和学习最终都必须保持“存在一个共同赋值满足全部子句”这一量词,不能把分别满足各子句的若干赋值拼成模型。
例子与边界
考虑
从部分赋值
这个例子展示了可满足分支,但不能据此断言传播总会解决 CNF-SAT。公式
在空赋值下没有单位子句,却不可满足;要暴露矛盾,必须作决策或使用更强推理。Horn-SAT、2-SAT 等受限语法可有多项式算法,一般 CNF-SAT 的 NP 完全性并不意味着每个实例同样困难,也不允许用某次基准的运行时间替代最坏情形结论。
推论与应用
抽象求解接口可由DPLL 算法实现:单位传播收紧工作表,决策与回溯覆盖尚未检查的赋值。现代冲突驱动子句学习还会把一次冲突压缩成由原式蕴涵的新子句,使以后不再进入同类死路。两种算法都只能改变搜索方式,不能改变模型定义。
电路验证、排程、规划和有界模型检查通常先把领域约束编码为 CNF。编码正确性有独立责任:SAT 模型必须能解码成原问题见证,UNSAT 也必须保证没有因漏写约束而得到。带算术、数组或未解释函数的可满足性模理论还要求原子真假能由同一个背景理论模型实现;它与纯 CNF-SAT 易在工具接口上混淆,二者却有不同的模型检查层。
参考资料
- Armin Biere, Marijn Heule, Hans van Maaren, and Toby Walsh, eds., Handbook of Satisfiability, 2nd ed., IOS Press, 2021, Chapters 1–4。
- Donald E. Knuth, The Art of Computer Programming, Vol. 4, Fascicle 6: Satisfiability, Addison-Wesley, 2015, §§7.2.2.2–7.2.2.3。
- Stephen A. Cook, “The Complexity of Theorem-Proving Procedures,” STOC, 1971, pp. 151–158。