談談庫克定理的證明
堵丁柱 • 葛可一
談到庫克定理, 凡是懂點計算複雜性理 論的人都知道它。 它是該理論中最重要, 最基 礎的定理之一。 因此, 凡是含有計算複雜性內 容的專著和教科書都會講解庫克定理。 各本 書中的證明也不盡相同。 其花樣翻新, 恰似八 仙過海, 各顯其能。 這中間溶入了許多人的智 慧。 不過, 其中也有不小心, 含有失誤者。 讓 我們就從這樣一個含有失誤的相當流行的證 明開始, 到這座百花園中走一走, 學一學。 學 習不就是去偽存真, 去粗取精的過程嗎?
首先, 讓我們簡略解釋一下什麼是庫克 定理。 如下是個趣味邏輯問題: 三個好朋友苗 苗, 壯壯, 山山告訴人們, 他們三個之中誰大 誰小。 苗苗說:“如果山山不是最小的, 那麼我 就是”。 壯壯說: “如果我不是最小的, 那麼苗 苗就是最大的”。 你能知道誰大誰小嗎?
解它的方法之一是列邏輯方程。 以 A, B, C 分別記苗苗, 壯壯, 山山三人。 以 X0
記命題 “X 是最大的”, 以 Xy記命題 “X 是 最小的”。 這樣一來, 命題“如果山山不是最小 的, 那麼苗苗就是”。 可以表達為 Cy+Ay, 而 命題“如果壯壯不是最小的, 那麼苗苗就是最 大的”。 可以表達為 By+ Ao。 由於這兩個命
題為真, 因此我們得到兩個等式:
Cy + Ay = 1 By+ Ao = 1 將這兩個等式相乘, 得
(Cy+ Ay)(By + Ao) = 1.
亦即,
CyBy+ CyAo+ AyBy+ AyAo = 1.
注意, 不可能有兩人最小, 也不可能有一人既 最小也最大。 因此,
CyBy = AyBy = AyAo= 0.
這樣, 我們得到
CyAo = 1,
也就是說, 苗苗最大, 山山最小, 壯壯居中。
給出一個邏輯方程, 判斷它是否有解。
或者, 給出一個邏輯函數, 判斷它是否有使 函數值等於 1 的變量賦值。 這稱為 SAT 問 題。 具有使函數值等於1的變量賦值的邏輯函 數稱為可滿足的, 該變量賦值稱為真賦值。
庫克定理: SAT問題是 NP 完全的。
22
現在, 來看看一個相當流行的教科書 [4]中的證明。 為避免太繁瑣, 我們將概述該證 明, 只將值得注意的地方詳細列出。 尤其, 無 法詳細解釋有關概念。 誠請讀者諒解。 如果有 不懂的術語, 請對照原書。
首先證明, SAT 問題屬於 NP 類。 這很 容易, 對給出函數, 猜一組變量賦值, 檢驗它 是否是真賦值。 這過程可以由 NTM (Non- deterministic Turing Machine) 在多項式 時間內實現。
其次證明, NP 類中任何語言 L, 均有 L ≤pm SAT, 也就是說, 存在一個多項式時 間可計算的映射 g 使得, x ∈ L 若且唯若 g[x](·) ∈ SAT , 其中 g[x](·) ∈ SAT 的意 思是說, g[x](·) 是可滿足的邏輯函數。
語言 L 屬於 NP 類, 這意味著存在多項 式時間單帶 NTM M 接受 L。(單帶 NTM 由三部份組成: 一條記憶帶, 帶上一個讀寫頭 和與其連接的有限控制器。) 設多項式 p(n) (p(n) ≥ n) 是 M 的時間上界。 這意味著, x ∈ L 若且唯若, 在輸入 x 之後, M 有一 條計算道路, 最多經過 p(n) 次移動, 就會進 入終止狀態, 其中, n 是符號行 x 的長度, 即 n= |x|.
設 #β0#β1· · · #βp(n) 是 M 的一條 計算道路。 其中, 每個 βi 是 M 的一個 ID。
ID是瞬間像 (Instantaneous Description) 的縮寫。 它含 M 在瞬間具有的如下三個數 據: 帶上符號行, 讀寫頭位置, 有限控制器的 狀態。 由於讀寫頭最初停在帶的最左格處, 而 每次只向左或右移動一格, 因此諸 βi 最多 有 p(n) + 1 格非空。 讀寫頭位置也一定在
最左邊的這 p(n) + 1 格之中。 這樣一來, 每 個 ID βi 可以只含這個 p(n) + 1 格。 為 使 ID 更簡捷, 不妨把有限控制器的狀態也 放到讀寫頭所在的格里。 這也就是說, 每個 ID βi 含p(n) + 1 格。 其中, p(n) 格含 Γ 中符號, 恰有一格含 Q#Γ 中元素 (稱為複 合符合)。 這裡, Γ 是M 的帶上可用符號字 母表, Q 是 M 的有限控制器的狀態集合。
值得注意, 當 x ∈ L 時, M 可能只移動 k < p(n) 次就進入終止狀態。 這時, 我們令 βk= · · · = βp(n)。
記 ID βi 的第 j 格為格 (i, j), 0 ≤ i ≤ p(n), 1 ≤ j ≤ p(n) + 1。 對每個 a ∈ Γ ∪ Q#Γ 和每個格 (i, j), 定義一個 邏輯變量 ci,j,a : ci,j,a = 1 若且唯若格 (i, j) 所含的是 a。
下面, 需要構造四個邏輯函數 gi, i = 1, 2, 3, 4, 使得, gi = 1 若且唯若下面的 (i) 真。
(1) 對每格 (i, j), 有且僅有一 a ∈ Γ ∪Q#Γ 使得 ci,j,a = 1。
(2) β0 是 M 的初始 ID。
(3) βp(n) 含終止狀態。
(4) 對每個 i, βi+1 是由 βi 經一次移動而得 到。
如果這四個邏輯函數構造好了, 那麼令 g[x] = g1g2g3g4, 就會有 x ∈ L 若且唯若 g[x] 可滿足。 事實上, 若 x ∈ L, 則對輸入 x, M 有一條計算道路 #β0#β1· · · #βp(n) 滿足 (2)(3)(4)。 考慮如下變量賦值
ci,j,a =
1 若 βi 的第 j格所含的是 a 0 否則。
這賦值可使 gi = 1, i = 1, 2, 3, 4, 因 此使 g[x] = 1。 反之, 若 g[x] 可滿 足, 則有變量賦值使 g[x] = 1。 這意味著, (1)(2)(3)(4) 真。 由於 (1) 真, 可以構造
#β0#β1· · · βp(n) 使得, ci,j,a = 1 若且唯 若格 (i, j) 所含的是 a。 由於 (2)(3)(4) 真, 可知 #β0#β1· · · #βp(n) 是接受 x 的一條 計算道路。 於是, x ∈ L。
現在, 所剩工作是構造四個邏輯函數 gi, i = 1, 2, 3, 4 了。 對三個邏輯函數 g1, g2 和 g3 的構造, 我們沒有異議。 可是, 對於 g4
的構造, 我們就不敢茍同了。
事實上, 該書首先“定義一個邏輯判據 f(W, X, Y, Z) 使得, f (W, X, Y, Z) = 1 若 且唯若, 當某個 ID 的第 j − 1, j, j + 1 格 所含的分別是 W, X, Y 時, Z 允許出現在緊 跟其後的 ID 的第 j 格中 [若 j = 1, 則 W = #; 若 j = p(n) + 1, 則 Y = #]。”然 後定義 g4 為
Y
(i,j)
X
f(w,x,y,z)=1
(ci,j−1,Wci,j,Xci,j+1,Yci+1,j,Z) .
為什麼這樣定義 g4? 有一段解釋:
“為了弄清怎樣寫第四個公式, 其表達每 個 ID βi, i ≥ 1, 是由 βi−1 通過 βi−1 中複 合符號的移動而得, 要注意, 我們基本上可以 從 βi−1 的相應符號以及它兩邊的符號 (其中 之一可能是 # ) 導出 βi 的符號。 亦即, βi 中符號與 βi−1 中相應符號相同, 除非後者或 者它的相鄰者是複合符號, 並且讀寫頭移動 到了那個 βi 的符號”。
這個聽起來挺順耳的定義真能保證“若 g4 = 1 則 (4) 真”嗎? 其實, 不能。 讓我 們舉一個反例, 讀者就會很快明白。
設 δ 是 M 的轉換函數。 由於 M 是個 NTM, δ 從 Q × Γ 映射到 2Q×Γ×{R,L}; 亦 即, 對每個狀態 q ∈ Q 和每個符號 a ∈ Γ, δ(q, a) 是 Q × Γ × {R, L} 的一個子集 合。(p, b, R) ∈ δ(q, a)((p, b, L) ∈ δ(q, a)) 的意思是說, 當 M 在狀態 q 下, 讀寫頭讀到 符號 a 時, M 可以進入狀態 p, 同時, 讀寫 頭將所讀格中符號 a 塗掉, 寫上符號 b 並且 向右 (左) 移動一格。
現在, 讓我們把 p(n) + 1 個 ID 排列 成一個 (p(n) + 1) × (p(n) + 1) 矩陣; 第 i 行是第 i 個 ID βi。 這時, g4 的上述定義意 味著, 我們用四個格 (i, j − 1), (i, j), (i, j + 1), (i + 1, j) 所形成的如下窗口 (記為窗口 A) 來檢驗這矩陣。
(i, j − 1) (i, j) (i, j + 1) (i + 1, j)
考慮一個轉換函數δ(q, a) = {(p, b, R), (p, b, L)}。 對此轉換函數來說, 下面兩種移 動都是合理的:
c q#a d
c b p#d
c q#a d
p#c b d
現在, 我們用四格窗口 A 來觀察如下所定義 的 βi 和 βi+1。
c q#a d
p#c b p#d
不難看出, 每個窗口景象都與前面的合理移 動中的某個窗口景象相同。 這就是說, 所定義 之 βi 和 βi+1 滿足 g4 = 1。 可是, 顯然 (4) 不真。 βi+1 含兩個複合符號, 不是 ID, 怎麼 能自 βi 通過一次移動而得到呢。
應該指出, 使用四個函數是較勇敢的做 法, 多數作者在證明庫克定理中構造六個邏 輯函數。 除前述之四個以外, 還有兩個勿庸置 疑、 容易構造的 g5 和 g6 , 分別表述下面兩 個條件:
(5) 每個 βi 恰含一個狀態。
(6) 每個 βi 恰含一個獨寫頭所讀之格。
這實質上來說, 每個 βi 恰含一個複合符 號。 這種條件的簡單增加是否可以補救 [4]中 的過失呢? 答案是否定的, 雖然所加的條件 使先前反例不再成立, 可是我們可以再造一 個稍微苦澀一點的。
考慮一下轉換函數δ(q, a) = {(p, b, R), (r, e, R)}, 其中 p 6= r 和 b 6= e。 對此種轉 換函數來說, 下面兩種移動都是合理的:
c q#a d
c b p#d
c q#a d
c e r#d
現在, 我們用四格窗口 A 來觀察如下所定義 的 βi 和 βi+1。
c q#a d
c b r#d
不難看出, 每個窗口景象都與前面的合理移 動中的某個窗口景象相同。 這就是說, 所定義 的 βi 和 βi+1 滿足 g4 = 1。 可是 (4) 不真。
事實上, (r, b, R) 6∈ δ(q, a)。
那麼, 如何彌補這項失誤呢? 第一種是 改變檢驗窗口。
先考慮像 [4]那樣用四個條件的情況。 有 兩種基本方法:
(a) 採用兩個窗口。 除開由四格 (i, j − 1), (i, j), (i, j + 1), (i + 1, j) 組成的窗口 A 外, 再由四格 (i, j), (i + 1, j − 1), (i + 1, j), (i + 1, j + 1) 組成另外一個窗口 B。 這 就是說, 再定義一個邏輯判據 h(W, X, Y, Z) 使得, h(W, X, Y, Z) = 1 若且唯若, 當某 個 ID 的第 j − 1, j, j + 1 格所含的分別是 W, X, Y 時, Z 允許出現在緊排其前的 ID 的第 j 格中。 然後定義
g4= Y
(i,j)
X
f(W,X,Y,Z)=1
(ci,j−1,Wci,j,Xci,j+1,Yci+1,j,Z)
!
· Y
(i,j)
X
h(W,X,Y,Z)=1
(ci+1,j−1,Wci+1,j,Xci+1,j+1,Yci,j,Z)
! .
這實質上就是分別用兩個窗口檢察那個由 g[x] 的真賦值所造出的 #β0#β1· · · #βp(n)
是否是條計算道路。 難道用兩個窗口就會充 分了嗎? 沒錯, 如果它能通得過兩個窗口的 檢查, 那麼我們就能證明它是條計算道路。
首先, 讓我們用數學歸納法證明, 每個 βi 恰含一個複合符號。 由條件 (2), β0 是
M 的初始 ID, 因此它恰有一個複合符號。
現在, 假設 βi 恰有一個複合符號, 不妨說在 格 (i, j) 之中, 那麼兩格 (i + 1, j − 1) 和 (i + 1, j + 1) 之中, 恰有一個含複合符號; 否 則, 無法通過窗口 B 的檢查。 βi+1 在其餘之 處沒有複合符號; 否則, 無法通過窗口 A 的 檢查。
其次, 如果格 (i, j) 所含是複合符號 q#a, 格 (i + 1, j) 所含符號是 b, 格 (i + 1, j − 1) (格(i + 1, j + 1)) 所含複 合符號是 p#c, 那麼一定會有 (p, b, L) ∈ δ(q, a)((p, b, R) ∈ δ(q, a)); 否則, 無法通 過窗口 B 的檢查。 如果格 (i, j) 所含是符號 a, 那麼格 (i + 1, j) 所含一定是符號 a 或者 複合符號 p#a 否則, 無法通過窗口 B 的檢 查。 這意味著, 條件 (4) 已滿足。
(b) 採用一個大窗口。 最容易想到的就 是把窗口 A 和窗口 B 合併成一個六格組成 的大窗口。 [6]和 [1]採用的就是這種窗口, 它 由六格 (i, j −1), (i, j), (i, j +1), (i+1, j − 1), (i+1, j), (i+1, j+1) 所組成。 不過, 這不 是唯一的可以承擔檢驗責任的六格窗口。 還 有兩種, 讀者可以自己找找試試。 有趣的是, 不存在少於六格的窗口有能力承擔檢驗責任。
對每種少於六格的窗口, 舉個反例, 這是個挺 好的練習題。
現在, 考慮像 [3]那樣用六個條件的情 況。 由於有了兩個額外條件, 因此, 我們不再 需要證明, 每個 βi 恰含一個複合符號。 這樣 一來, 只要通過窗口 B 的檢驗, 條件 (4) 已滿 足。 這就是說, 四格窗口 B 足有能力承擔檢 驗責任。 這就是 [2]採用的證明。 有趣的是, 有
能力承擔檢驗責任四格窗口只有這一種。 這 證明也是道挺好的的練習題。
第二種是改變圖靈機 (Turing Ma- chine) 的定義。 在書 [5]中, 讀寫頭不能同時 改變所讀的符號和左右移動; 亦即, 在圖靈機 的一次移動中, 讀寫頭若改變所讀符號就不 能移動, 若移動就不能改變所讀符號。 當採用 這種圖靈機定義時, 如果使用六個條件, 那麼 四格窗口 A 照樣能承擔責任。 有興趣的讀者 可以證證看。
第三種是將 NTM 改為 DTM。 這是相 當有趣, 而技巧特異的方法, 只有在 [3]中可 以看到。 它利用 NP 類的一個性質: L 屬於 NP 類, 若且唯若存在一個多項式 q和一 P 類中語言 A, 使得
x∈ L ⇔ ∃y(|y| ≤ q(|x|)) : x#y ∈ A.
這性質將所討論的接受 L 的 NTM 轉化成 了接受 A 的 DTM。 由於 DTM 的轉移函 數是單值的, 因此, 在採用六條件時, 無論使 用四格窗口 A 還是四格窗口 B 都無關緊要。
可是, 如果像 [3]那樣選用四格窗口 A, 那麼 四個條件就夠了。 如果選用四格窗口 B, 那麼 四個條件不行。 這事實的嚴格證明是非常好 的練習題。 需要說明, 這種技巧有一定的局限 性。 例如說, 如果像有些書籍 (例如 [4]) 那樣 採用 log-space reduction, 那麼我們就得考 慮 log-space NTM。 對這種 NTM, 上述轉 化就有點問題了。 事實上, NTM 不能有足夠 的記憶空間把所有猜測都執行完, 非得猜猜, 用用, 塗掉, 再猜不可。
最後指出, [2]是筆者近著。 本文內容是 該書的一個小部分。 那裡匯集了許多筆者多 年學習、 研究、 教書的心得、 體會。 如果你想
了解更多一些, 歡迎您將來讀原書, 並批評指 正。
參考文獻
1. D. -Z. Du and Ker-I Ko, Theory of Computational Complexity, (John Wi- ley & Sons, New York, 2000).
2. D. -Z. Du and Ker-I Ko, Problem Solv- ing in Automata and Languages, to ap- pear.
3. M. R. Garey and D. S. Johnson, Com- puters and Intractability, a Guide to the Theory of NP-Computation, (W.
H. Freeman, San Francisco, 1979).
4. J. E. Hopcraft and J. D. Ullman, In- troduction to Automata Theory, Lan- guages, and Computation, (Addison- Wesley, 1979).
5. H. R. Lewis and C. H. Papadimitriou, Elements of the Theory of Compu- tation (2nd Edition), (Prentical-Hall, 1998).
6. M. Sipser, Introduction to the Theory of Computation, (PWS, 1997).
—本文作者堵丁柱為明尼蘇達大學計算機科 學系教授, 葛可一為紐約州立大學石溪分校 計算機科學系教授—