Мне кажется, вы просто не поняли, что такое КНФ.
Вот пусть у нас есть булева функция f. Она зависит от n переменных x1, x2, ..., xn. Переменным можно сделать 2^n различных подстановок. На одних подстановках функция возвращает 1, на других -- 0. Хотим это как-то закодировать булевой формулой.
Есть два типичных способа это сделать. Первый -- описать все подстановки, дающие 1 -- ДНФ. Второй -- описать все подстановки, дающие 0 -- КНФ. Нам нужно второе.
Посмотрим на КНФ. Это конъюнкция дизъюнкций, например такая:
(not x1 or x2) and (x1 or not x2 or x3).
То, что записано в скобках можно переписать чуть понятней:
(x1 = 0 or x2 = 1) and (x1 = 1 or x2 = 0 or x3 = 1).
Теперь, можно воспользоваться логикой, математической =), и еще раз переписать:
(not (x1 = 1 and x2 = 0)) and (not (x1 = 0 and x2 = 1 and x3 = 0)).
Что говорит последняя формула? Что функция дает единицу, если подстановка не содержит паттерна (x1 = 1 и x2 = 0) или (x1 = 0 и x2 = 1 и x3 = 0).
Итого, перебираем все подстановки, на которых функция дает 0, записываем такие подстановки в заперещенные паттерны, а потом просто записываем их в КНФ, как я описал выше.