Skip to content

CNF 可满足性问题

CNF satisfiability · CNF-SAT

给定有限个命题子句的合取,判定是否存在同时满足全部子句的布尔赋值。

条目类型
模型

形式陈述

CNF 可满足性问题的输入是一份合取范式

F=C1Cm,

其中每个子句 Ci 是有限个文字的析取,文字为变量 x 或其否定 ¬x。问题询问 F 是否为可满足公式;若是,输出一个总赋值 α:Var(F){0,1},使每个子句至少有一个真文字。空子句没有真文字,故使实例立即不可满足;空子句集没有约束,由任意赋值满足。这两项约定让求解器的终止状态无需例外补丁。

求解过程通常维护部分赋值 M。相对于 M,子句有四种互斥状态:已有真文字时为已满足;所有文字均假时为冲突;没有真文字且恰有一个未赋值文字时为单位子句;其余情形尚未决定。这里的“未决定”不表示该子句将来一定可满足,只表示当前信息还不足以判定。总赋值是模型时,每个子句都必须落在第一种状态。

输入规模应按变量数、子句数和总文字出现次数分别记录。给定候选模型,逐子句扫描即可在线性于总文字数的时间核验;相反,求解器没有找到模型并不构成 UNSAT 证书。不可满足结论需要穷尽一个可靠搜索,或给出归结、DRAT、LRAT 等可独立检查的反驳对象。

直觉

CNF 把一个布尔任务写成“全部约束都要通过”的清单,而每条约束又允许若干文字任选其一为真。部分赋值不是残缺模型,而是一张不断收紧的工作表:一个真文字足以关闭整条子句;一个假文字只删除一个出口;直到最后一个出口也被关闭才产生冲突。单位子句恰处在二者之间——只剩一个出口,因此它把下一步赋值逻辑地强制出来。

这种局部状态使大型公式能够增量处理。求解器无须在每次赋值后重新计算整份公式,只需访问可能因该赋值而改变状态的子句。局部处理并没有改变全局目标:所有传播、分支和学习最终都必须保持“存在一个共同赋值满足全部子句”这一量词,不能把分别满足各子句的若干赋值拼成模型。

例子与边界

考虑

F=(xy)(¬xz)(¬yz)(¬zw).

从部分赋值 M=(x=0) 出发,第一子句只剩 y,所以必须取 y=1;第三子句继而只剩 z,强制 z=1;最后一子句再强制 w=1。所得总赋值 (x,y,z,w)=(0,1,1,1) 可逐项核对:四个子句分别由 y,¬x,z,w 满足。若起始工作表却是 x=0,y=0,第一子句的两个文字都假,它已经冲突,后续怎样选择 z,w 都不能修复。

这个例子展示了可满足分支,但不能据此断言传播总会解决 CNF-SAT。公式

(ab)(a¬b)(¬ab)(¬a¬b)

在空赋值下没有单位子句,却不可满足;要暴露矛盾,必须作决策或使用更强推理。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。
关系图谱13 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

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