看懂本文需要提前有哪些知识?
- 知道什么是图灵机,非确定图灵机
- 知道什么是SAT问题
什么是NP问题?
首先我们要知道,NP一般都是针对决定性问题(Decision problem)的。比如今天我们要讨论的SAT问题,我们要知道一个布尔表达式能不能被满足,只有Yes和No两种情况。NP问题的定义有以下两种:
- 问题解能在多项式时间内被验证的问题
- 能被非确定图灵机在多项式时间内解决的问题
很容易证明这两个定义是等价的。由于我们没有详细定义什么是“验证”“解”,在这里不展开详细证明。粗略地说,如果我们有一个多项式时间的确定图灵机验证问题的解,那就可以构造出一个非确定图灵机去“猜”这个解,然后用那个机器去检验猜的对不对。如果我们有一个非确定图灵机解决这个问题,那么对于每一个(可能的)解,它只会有一个分支在跑(验证)这个解。所以我们只需要模拟这个非确定图灵机在确定的一个分支上的行为,就可以得到一个多项式时间的“验证机”。
对于SAT来说,如果有人告诉你一个布尔表达式是可以被满足的,然后他给出了一组解,你很容易能验证这组解是不是能满足这个布尔表达式。但如果有个人告诉你一个布尔表达式是不能被满足的,你就没有办法很容易地验证他说得对不对。如果定义coSAT为所有不能被满足的布尔表达式的集合,那么验证一个布尔表达式在不在coSAT里,这个问题就是coNP(且是coNP-complete)的。
证明SAT是NP-complete的
以下证明来自于Michael Sipser的《Introduction to the Theory of Computation》。个人认为是相当精彩的证明。所有名词的翻译来源于这本书的中文版或维基百科。
定义一个图灵机的格局(configuration)为图灵机当前的纸带上的字符串,图灵机的读写头的位置,以及图灵机当前所处的状态,这三个组成的集合。我们通常用
我们现在要证明所有NP问题都能在多项式时间内被转化到SAT问题。显然枚举所有NP问题是不现实的。我们从NP问题的定义出发。假设有一个NP问题,叫它
![11311ce932e0dd93182d9654e37bd11e.png](https://i-blog.csdnimg.cn/blog_migrate/61757cda70f5229ae09302b197170358.jpeg)
如图1。(暂时不要管window是什么)方便起见,我们让每个格局的第一个和最后一个字符都是#。第一行一定是起始格局(即包含其实状态和输入字符串,且读写头在最左端)。我们要求每一行都能从上一行的格局中合法地转移而来(根据转移函数)。如果其中有一行的格局是接受格局(即状态是接受状态
别忘了我们的目标:将问题A转化成SAT问题。也就是说,对于一个
我们首先定义
我们将要构造的布尔表达式
这个表达式的意思是,对于每个单元,都至少有一个字符
其中
举个例子:假设a, b, c是纸带字母表中的字符,
- 写下c,进入状态
,读写头左移
- 写下a,进入状态
,读写头右移
那么图2里的窗口就全都是合法的窗口。
![13758e97a8fa713169bf2334559eb04c.png](https://i-blog.csdnimg.cn/blog_migrate/14ed7bf94cae7a5fa261648c88dc6294.jpeg)
图3里的都是非法的窗口。
![d238ff7ea97d7d3dfd30421e277653e1.png](https://i-blog.csdnimg.cn/blog_migrate/789c406723ce4cb1084db397d59b5127.jpeg)
(关于这些窗口为什么合法或者非法,应该很好懂,所以我这就不做解释了。如果有疑问可以在评论区提问)
Claim:如果画面中每个这样的2x3的窗口都是合法的,那么每一行的格局都是从上一行的格局合法转移来的。
证明:对于上一行的格局来说,如果一个字符不与状态字符相邻,那它就不应该变。我们考虑当这个字符处在我们2x3的窗口的第一行正中间时,这是它不管怎么变都是不合法的(参考图2(d),图3(a))。这里我们在最开始和最后加的#号就有了作用,因为有了它们才能保证每个字符都可以在窗口正中间。现在我们考虑第一行正中间是一个状态字符的情况。根据转移函数,我们很容易就能判断出一个窗口是否合法(参考图2(b),图3(b)(c)),且只要这个窗口合法,这个格局的转移部分就是合法的。合法的转移部分+其他字符都不变,保证了格局的转移合法。
现在我们要构造
其中
目前为止,我们已经构造出了
后记
到这里我们就完成了SAT的NP完全性的证明。其实定理的证明并不复杂,难点在于
既然都看完了,点个赞再走吧~
参考文献
[1] Sipser, Michael. Introduction to the Theory of Computation (3rd edition). 2015.