3.3. Выполнимость КНФ 123
Существует ли (булевский) набор переменных x
j
, обраща-
ющий эту форму в 1 (т. е. в «Истину»)?
Задаче 16 «SAT» выпала честь быть первой задачей, для ко-
торой была установлена N P-полнота (cм. раздел 6.2). И хотя
N P-полнота задачи, по сути, определяет «переборность» лю-
бого алгоритма для ее решения
3
, одни виды перебора могут
быть перспективнее других.
Итак, как можно организовать решение этой задачи?
Самым простым решением будет перебор всех входных на-
боров x = {x
1
, . . . , x
n
}, пока CNF (x) не станет равна единице.
Однако в худшем случае, например, если CNF невыполнима,
надо перебрать 2
n
наборов x.
Для некоторых формул этот перебор можно сократить, ес-
ли обеспечить подсчет размера множества невыполнимых на-
боров — |X
0
|, где X
0
= {x : CNF (x) = 0}. CNF невыполнима
тогда и только тогда, когда |X
0
| = 2
n
.
Остается вопрос: как подсчитать |X
0
| более эффективно,
нежели перебором x?
Введем (или напомним) несколько обозначений.
Определение 3.3.1. Литерал — каждое вхождение пе-
ременной x
i
(или ее отрицания) в скобку. Например, для
(x
1
∨ x
2
) ∧ (x
1
∨ x
3
) литералами будут x
1
, x
2
, x
1
, x
3
.
Для некоторого подмножества из k скобок S = {C
j
1
, . . . , C
j
k
}
мы обозначим через Lit
S
все литералы S, т. е. все литералы
lit ∈ {x
i
, x
i
}, входящие в S.
Рассмотрим некоторую КНФ (обозначим ее CN F (x)). На
каких наборах она равна нулю? Очевидно, если CNF (x) = 0,
то одна или несколько скобок-дизъюнкций C
j
(x) = 0.
Возьмем некоторое подмножество S = {C
j
1
, . . . , C
j
k
} из k
скобок и зададимся вопросом: когда все скобки в S будут рав-
ны нулю? Обозначим это утверждение предикатом Z
S
(x) = 1
3
Разумеется, при гипотезе P 6= NP