Теорема Кука — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Доказательство: часть 2)
Строка 56: Строка 56:
 
Каждый элемент таблицы <tex>q_{i, j}\in \Sigma \cup Q</tex>. И для каждого такого элемента заведём <tex>|\Sigma| + |Q|\,\!</tex> переменных <tex>Y_{i, j, c} = [q_{i, j} = c]\ \forall c \in \Sigma \cup Q\,\!</tex>
 
Каждый элемент таблицы <tex>q_{i, j}\in \Sigma \cup Q</tex>. И для каждого такого элемента заведём <tex>|\Sigma| + |Q|\,\!</tex> переменных <tex>Y_{i, j, c} = [q_{i, j} = c]\ \forall c \in \Sigma \cup Q\,\!</tex>
  
Общий вид формулы : <tex>\phi = S \land T \land N \land C</tex>
+
Общий вид формулы : <tex>\phi = S \land T \land N \land C</tex>.
 +
 
 +
<tex>S</tex> отвечает за правильный старт, то есть символ <tex>q_{0,0}</tex> должен быть начальным состоянием <tex>q_0\,\!</tex> машины <tex>m\,\!</tex>, символы с <tex>q_{0,1}\,\!</tex> по <tex>q_{0,|x|}\,\!</tex> &mdash; образовывать цепочку <tex>x\,\!</tex>, а оставшиеся <tex>q_{0,i}\,\!</tex> &mdash; быть пробелами <tex>B\,\!</tex>. Таким образом, <tex>S = Y_{0,0,\#_s} \land Y_{0,1,x_1} \land \ldots \land Y_{0,|x|+1,B} \land \ldots \land Y_{0,t,B}</tex>.
 +
 
 +
<tex>T</tex> отвечает за правильный финиш, то есть в <tex>q_t</tex> должно присутствовать допускающее состояние <tex>\#_y\,\!</tex>, следовательно <tex>T = Y_{t,0,\#_y} \lor Y_{t,1,\#_y} \lor \ldots \lor Y_{t,t,\#_y}</tex>.
 +
 
 +
<tex>N</tex> отвечает за то, что машина <tex>m\,\!</tex> делает правильные переходы. <tex>q_{i,j}</tex> зависит только от четырех символов над ним, то есть от <tex>q_{i-1,j-1}</tex>, <tex>q_{i-1,j}</tex>, <tex>q_{i-1,j+1}</tex> и <tex>q_{i-1,j+2}</tex>. Тогда для проверки корректности переходов требуется перебрать все четверки символов <tex>q_{i-1,j-1}</tex>, <tex>q_{i-1,j}</tex>, <tex>q_{i-1,j+1}</tex> и <tex>q_{i-1,j+2}</tex> из таблицы и проверить, что из них возможно получить символ <tex>q_{i,j}</tex>. Следовательно <tex>N = \land_{i=0..t,j=0..t} \land_{c_1 \ldots c_4} (( Y_{i-1,j-1,c_1} \land Y_{i-1,j,c_2} \land Y_{i-1,j+1,c_3} \land Y_{i-1,j+2,c_4} ) \to (Y_{i,j,c_1^`} \lor Y_{i,j,c_2^`} \lor \ldots \lor Y_{i,j,c_{|\Sigma|-1}^`}))</tex>.
 +
 
 +
<tex>C</tex> отвечает за то, что в каждой ячейке находится ровно один символ. <tex>C = \land_{i=0..t,j=0..t} ((Y_{i,j,c_1} \land \lnot Y_{i,j,c_2} \land \ldots \land \lnot Y_{i,j,c_{|\Sigma|-1}}) \lor \ldots \lor (Y_{i,j,c_{|\Sigma|-1}} \land \lnot Y_{i,j,c_1} \land \ldots \land \lnot Y_{i,j,c_{|\Sigma|-2}}))</tex>.

Версия 00:43, 16 марта 2010

Определение

Проблема [math]SAT = \{\phi(x_1, ..., x_n)\ |\ \exists \{y_1, ..., y_n\} : \phi(y_1, ..., y_n) = 1\}[/math] — проблема выполнимости булевых формул.

Докажем, что эта проблема [math]NP\,\![/math]-полна.

Формулировка

Теорема Кука гласит, что [math]SAT \in NPC.[/math]

Доказательство

[math]SAT \in NPC[/math], если

  • [math]SAT \in NP[/math]
  • [math]SAT \in NPH[/math]

Прежде всего докажем, что [math]SAT \in NP.[/math]

Так как [math]NP = \Sigma_1\,\![/math], то достаточно показать, что [math]SAT \in \Sigma_1[/math]

В качестве сертификата берём набор нулей и единиц в количестве [math]n\,\![/math] штук, соответствующих значениям аргументов функции [math]\phi\,\![/math]. Длина этого сертификата явно будет меньше или равна, чем полином от длины строки, кодирующей формулу [math]\phi\,\![/math].

Верификатор просто подставит эти значения в формулу [math]\phi\,\![/math] и выдаст значение формулы на данном входе. Таким образом, если формула действительно удовлетворима, то для неё найдётся такой сертификат, на котором она, и, соответственно, верификатор, выдадут единицу.

Если же у нас существует такой сертификат [math]y\,\![/math], на котором верификатор выдаёт единицу, то, значит, и формула является удовлетворимой.

Теперь докажем, что [math]SAT \in NPH.[/math] Для этого сведём проблему [math]BH_{1N}\,\![/math], которая, как нам известно, [math]NP\,\![/math]-полна, к проблеме [math]SAT.\,\![/math] Тогда получится, что любая проблема из [math]NP\,\![/math] может быть сведена по Карпу к проблеме [math]BH_{1N}\,\![/math], и, по транзитивности сведения по Карпу, к [math]SAT.\,\![/math]

По условию проблемы [math]BH_{1N}\,\![/math], у нас есть недетерминированная машина Тьюринга [math]m\,\![/math], причём можно считать, что её лента односторонняя и что машина не пишет на ленту пробелы, входное слово [math]x\,\![/math] и время [math]t\,\![/math], заданное в унарной системе счисления. Нам же надо построить такую булеву формулу [math]\phi\,\![/math], что она выполнима тогда, и только тогда, когда [math]m\,\![/math], получив на вход [math]x\,\![/math], делает не более [math]t\,\![/math] шагов и допускает это слово.

В любой момент времени мгновенное описание (МО) [math]m\,\![/math] есть строка [math]z\#_qyb[/math], где [math]b\,\![/math] — строка, состоящая из такого количества пробелов, чтобы длина всего МО была [math]t + 1.\,\![/math] Соответственно, начальное МО задаётся так : [math]\#_sxb\,\![/math]. Если же [math]|x| \gt t\,\![/math], то будем считать, что на ленту записаны лишь первые [math]t\,\![/math] символов, ведь [math]m\,\![/math] не может обработать большее количество символов за [math]t\,\![/math] шагов.

Также нам удобно считать, что все вычисления проходят ровно за [math]t + 1\,\![/math] шагов, даже если мы попали в допускающее состояние раньше. То есть, мы разрешим переход [math]q \vdash q[/math], если в МО [math]q\,\![/math] есть допускающее состояние, так что, чтобы проверить, допустила ли машина слово, надо лишь проверить наличие допускающего состояния в МО [math]q_t\,\![/math].

Тогда процесс работы машины [math]m\,\![/math] на входе [math]x\,\![/math], то есть цепочка переходов [math]q_0 \vdash q_1 \vdash ... \vdash q_t[/math] может быть представлен следующей таблицей :

Процесс работы машины [math]m\,\![/math] на входе [math]x\,\![/math]
MO 0 1 ... ... t
[math]q_0\,\![/math] [math]q_{0, 0}\,\![/math] [math]q_{0, 1}\,\![/math] [math]q_{0, t}\,\![/math]
[math]q_1\,\![/math] [math]q_{1, 0}\,\![/math] [math]q_{1, 1}\,\![/math] [math]q_{1, t}\,\![/math]
...
[math]q_i\,\![/math] [math]q_{i, j - 1}\,\![/math] [math]q_{i, j}\,\![/math] [math]q_{i, j + 1\,\!}[/math] [math]q_{i, j + 2\,\!}[/math]
[math]q_{i + 1}\,\![/math] [math]q_{i, j - 1}\,\![/math] [math]q_{i, j}\,\![/math] [math]q_{i, j + 1\,\!}[/math]
...
[math]q_t\,\![/math] [math]q_{t, 0}\,\![/math] [math]q_{t, 1}\,\![/math] [math]q_{t, t}\,\![/math]

Каждый элемент таблицы [math]q_{i, j}\in \Sigma \cup Q[/math]. И для каждого такого элемента заведём [math]|\Sigma| + |Q|\,\![/math] переменных [math]Y_{i, j, c} = [q_{i, j} = c]\ \forall c \in \Sigma \cup Q\,\![/math]

Общий вид формулы : [math]\phi = S \land T \land N \land C[/math].

[math]S[/math] отвечает за правильный старт, то есть символ [math]q_{0,0}[/math] должен быть начальным состоянием [math]q_0\,\![/math] машины [math]m\,\![/math], символы с [math]q_{0,1}\,\![/math] по [math]q_{0,|x|}\,\![/math] — образовывать цепочку [math]x\,\![/math], а оставшиеся [math]q_{0,i}\,\![/math] — быть пробелами [math]B\,\![/math]. Таким образом, [math]S = Y_{0,0,\#_s} \land Y_{0,1,x_1} \land \ldots \land Y_{0,|x|+1,B} \land \ldots \land Y_{0,t,B}[/math].

[math]T[/math] отвечает за правильный финиш, то есть в [math]q_t[/math] должно присутствовать допускающее состояние [math]\#_y\,\![/math], следовательно [math]T = Y_{t,0,\#_y} \lor Y_{t,1,\#_y} \lor \ldots \lor Y_{t,t,\#_y}[/math].

[math]N[/math] отвечает за то, что машина [math]m\,\![/math] делает правильные переходы. [math]q_{i,j}[/math] зависит только от четырех символов над ним, то есть от [math]q_{i-1,j-1}[/math], [math]q_{i-1,j}[/math], [math]q_{i-1,j+1}[/math] и [math]q_{i-1,j+2}[/math]. Тогда для проверки корректности переходов требуется перебрать все четверки символов [math]q_{i-1,j-1}[/math], [math]q_{i-1,j}[/math], [math]q_{i-1,j+1}[/math] и [math]q_{i-1,j+2}[/math] из таблицы и проверить, что из них возможно получить символ [math]q_{i,j}[/math]. Следовательно [math]N = \land_{i=0..t,j=0..t} \land_{c_1 \ldots c_4} (( Y_{i-1,j-1,c_1} \land Y_{i-1,j,c_2} \land Y_{i-1,j+1,c_3} \land Y_{i-1,j+2,c_4} ) \to (Y_{i,j,c_1^`} \lor Y_{i,j,c_2^`} \lor \ldots \lor Y_{i,j,c_{|\Sigma|-1}^`}))[/math].

[math]C[/math] отвечает за то, что в каждой ячейке находится ровно один символ. [math]C = \land_{i=0..t,j=0..t} ((Y_{i,j,c_1} \land \lnot Y_{i,j,c_2} \land \ldots \land \lnot Y_{i,j,c_{|\Sigma|-1}}) \lor \ldots \lor (Y_{i,j,c_{|\Sigma|-1}} \land \lnot Y_{i,j,c_1} \land \ldots \land \lnot Y_{i,j,c_{|\Sigma|-2}}))[/math].