今天看了网上很多SAT问题规约到3SAT,虽然写的不错,但是过于理论。其实我看到已知半解。
后来无意中发现一个解释这个规约,简单易懂,特此记录。
定义:
首先给出一个比较直观的定义:
假设现在有这么个问题:过年了,正打算烧年夜饭,家里每个人都可以说说自己想吃啥不想吃啥。小C说他要吃牛肉、不吃香菇、不吃内脏,小D说他要吃内脏、吃蔬菜、不吃牛肉。但毕竟众口难调、不一定所有愿望都能实现。因而只要每个人有一个愿望实现,这顿年夜饭就算非常成功了。所以现在问题来了,有没有一桌年夜饭可以让所有人都至少有一个愿望被实现呢?
这就是个很典型的SAT问题
所谓子句(Clause)就是每个人的愿望清单,比如小c说他要吃牛肉、不吃香菇、不吃内脏,“要吃牛肉、不吃香菇、不吃内脏” 就是一个子句。
所谓文字(Literal)就是一个愿望,比如“要吃牛肉”,“不吃香菇”都是所谓的文字。
所谓命题变元(Variable)就是指这个菜会不会出现在餐桌上。
3-CNF formula
包含一堆子句(Clause),这一堆子句每个都包含3个文字(Literal),每个literal表示命题变元集中一个布尔变量(Variable)或它的否定形式3-SAT问题就是判定 一个 3-CNF formula 是不是被满足。
3-CNF formula 被满足 当且仅当 每个 clause 都被满足
clause 被满足 当且仅当 clause中至少有一个literal被满足
literal被满足 当且仅当这个literal所指向的Variable能使得这个literal为TRUE
所以3-SAT formula的自变量就是literal里面出现的这些variable。
3-SAT问题就是问你能不能给这些变量赋上合适的值使得这个formula被满足。
此时,我们再来看下面理论表达,
X就是fomular,C就是clause, C 1 , . . . , C m C_1,...,C_m C