合取范式
合取范式(conjunctive normal form,简称 CNF)是由若干子句合取而成的命题公式,每个子句是若干文字的析取。文字是命题变量或一个命题变量的否定,例如 与 。CNF 将“所有约束同时成立”写成外层的与,将“一条约束中至少一种选择成立”写成内层的或,是可满足性问题和归结原理的常见输入形式。[1]
考虑公式 。蕴含 只在 真而 假时失败,所以其否定为 。于是 表示:要么 真,要么同时满足 真、 假。将这个“要么”分配到两个条件后,得到 右端有两个子句,每个子句含两个文字。下面解释这个改写的含义和它的代价。
子句、空子句与空合取
一般 CNF 可写为 其中 是文字, 为子句数, 为第 个子句的文字数。一文字子句如 称为单位子句;它直接要求 真。子句 无论如何赋值都真,称为重言子句,可以从外层合取中删除。
把子句视为文字集合时,重复的文字可以删除,因为 。零个文字的析取约定为假,称为空子句,常记为 ;只要 CNF 含有它,整式就不可满足。零个子句的合取约定为真,因而可满足。空子句集和包含空子句的子句集是相反的边界情形,归结程序尤其需要区分它们。
“每个子句至多含三个文字”的公式称为 3-CNF;有的资料将这个名称保留给恰好三个文字的子句,使用时应声明约定。一般 CNF 不要求每个子句列出全部变量;要求每个极大项含所有变量的主合取范式是更特殊的表示。
等价变换的连续步骤
将有限命题公式改成等价 CNF,可以先消去蕴含,再把否定推到变量前,最后使用分配律。原例逐步成为 第一步使用蕴含的真值定义,第二步使用德摩根律与双重否定。第三步需要的规律是 。
这一分配律可以直接证明。若 为真,两边都真;若 为假,左边只剩 ,右边的两个析取项分别只剩 与 ,两边仍相同。这两个情况覆盖了每个赋值,因此证明的是逻辑等价,而不只是两个公式碰巧同为可满足。
读图时先看 的四行。第一子句要求 ,第二子句要求 ,所以只留下 。再看 的四行,两个子句都已经被 满足, 可任意取值。故原式和 CNF 都有五个满足赋值。这里的五不是从公式外形猜出的,而是从每个子句的要求得到的。
变式为 。将否定推入后直接得到 ,它本身就是只有一个子句的 CNF,无需再分配。唯一使它为假的赋值为 ,所以它有七个满足赋值。原例中的否定作用于蕴含,变式中作用于合取,不能照抄同一个结果。
等价 CNF 的长度可能指数增长
分配律保持真值,却可能复制大量子公式。例如 直接分配后,每次从第 对中选择 或 ,构成一个包含 个文字的子句。选择共有 种。 时四个子句是 输入只列了 对变量,这种直接转换却产生指数数量的子句。这个例子说明该转换方法的长度增长,不能仅凭它断言每一种扩充变量的编码也都指数增长。
辅助变量与等可满足编码
SAT 编码常引入新变量代表子公式,以控制长度。若用 代表 ,关系 可写成 前两个子句表达 、;第三个表达 。所以三个子句同时成立,恰好强制 。析取门也可类似编码为
给原式每个二元连接词引入一个变量,加入相应门的子句,再加入要求根变量为真的单位子句,就得到 Tseitin 风格编码。连接词集合和每个门的输入数固定时,每个门只贡献常数个有界长子句,总长度与原公式的语法树大小成线性关系。[2]
正确的对应关系是:原公式的每个满足赋值,都能按子公式的实际真值扩展成新 CNF 的满足赋值;反过来,新 CNF 的满足赋值因门约束而保证根变量等于原式的值,根单位子句又保证该值为真。因此原式 与编码 满足 它们等可满足,但直接把 和 当作同一组自由变量上的等价公式会出错。例如 在 时真;若额外指定根变量 ,编码却为假。忘记根单位子句也会出错:单独的门关系允许把根设成原式的假值,不能强制原式成立。
参考文献
- ↑ Ruben Martins,Lecture Notes on Resolution,Carnegie Mellon University,2024,第2—3节。
- ↑ Ruben Martins,Lecture Notes on Propositional Encodings,Carnegie Mellon University,2024,第2节。