Введение

Стандартная форма булевой функции

В булевой логике формула находится в конъюнктивной нормальной форме (CNF) или клаузальной нормальной форме, если она представляет собой конъюнкцию одной или нескольких клауз, где клауза является дизъюнкцией литералов; другими словами, это произведение сумм или логическое И (AND) от логических ИЛИ (OR). Как каноническая нормальная форма, она полезна в автоматическом доказательстве теорем и теории схем. В автоматическом доказательстве теорем понятие "клаузальная нормальная форма" часто используется в более узком смысле, обозначая конкретное представление формулы CNF в виде набора множеств литералов.

Перевод в CNF

В классической логике каждая формула высказывания может быть преобразована в эквивалентную формулу, находящуюся в КНФ. Это преобразование основано на правилах логических эквивалентностей: исключение двойного отрицания, законы Де Моргана и дистрибутивность.

Комплексность вычислений

Важный набор задач в вычислительной сложности включает в себя поиск присвоений переменным булевой формулы, выраженной в конъюнктивной нормальной форме, таких что формула истинна. Проблема k-SAT – это задача поиска удовлетворяющего присвоения булевой формуле, выраженной в КНФ, в которой каждая дизъюнкция содержит не более k переменных. 3-SAT является NP-полной (как и любая другая k-SAT задача при k>2), в то время как для 2-SAT известно решение в полиномиальное время. Как следствие, задача преобразования формулы в ДНФ с сохранением выполнимости является NP-трудной; двойственно, преобразование в КНФ с сохранением истинности также является NP-трудной; следовательно, преобразование в ДНФ или КНФ, сохраняющее эквивалентность, также является NP-трудной. Типичные задачи в этом случае включают формулы в "3КНФ": конъюнктивная нормальная форма с не более чем тремя переменными в каждом конъюнкте. Примеры таких формул, встречающихся на практике, могут быть очень большими, например, с 100 000 переменных и 1 000 000 конъюнктов. Формулу в КНФ можно преобразовать в равноудовлетворительную формулу в "kКНФ" (для k≥3), заменяя каждый конъюнкт, содержащий более k переменных, двумя конъюнктами и вводя Z как новую переменную, и повторяя это столько раз, сколько необходимо.