СДНФ и СКНФ

Нормальные формы

Начнём с пары терминов. Предположим, что есть некий набор правил преобразования формул. Например:

  • \(\lnot\lnot x\) разрешается заменить на \(x\)
  • \(\lnot(x\land y)\) разрешается заменить на \(x\lor y\)
  • \(\lnot(x\lor y)\) разрешается заменить на \(x\land y\)

Нормализацией формулы при помощи набора правил называется последовательное применение этих правил к подформулам этой формулы.

Нормальной формой называется формула, ни к одной подформуле которой нельзя применить ни одно из правил набора.

Например, формула \(x\land\lnot y\) является нормальной формой относительно вышеприведённого набора правил.

А вот формула \(\lnot(x\land\lnot y)\) не является. При этом её можно нормализовать, получив нормальную форму \(\lnot x\lor y\).

Отметим несколько важных моментов:

  • поскольку процесс нормализации зачастую определён неоднозначно, потенциально из одной и той же формулы можно получить несколько разных нормальных форм
  • конкретно вышеприведённая тройка правил гарантирует завершение процесса нормализации и единственность результирующей нормальной формы

Совершенная дизъюнктивная нормальная форма

Рассмотрим следующую задачу: имея некий набор операций, научиться выражать произвольную операцию в виде комбинации имеющихся. Оказывается, для набора \(\land,\lor,\lnot\) эта задача решается особенно легко: если \(f(x) = 1\) только для \(x=(x_1,x_2,\ldots,x_n)=(a_1,a_2,\ldots,a_n)\), то

\[ f(x_1,x_2,\ldots,x_n)= (\lnot^{\lnot a_1} x_1)(\lnot^{\lnot a_2} x_2)\ldots (\lnot^{\lnot a_n} x_n) \]

В общем случае достаточно взять дизъюнкцию таких выражений для всех \(a\), для которых \(f(a)=1\).

Говоря русским языком, достаточно найти все наборы входов, на которых исследуемая операция даёт единицу, и для каждого такого набора составить (единственную возможную) конъюнкцию входов и их отрицаний, которая на этом наборе обращается в 1. После чего достаточно просто взять дизъюнкцию всех таких конъюнкций.

Результатом такой манипуляции является штуковина (дизъюнкция конъюнкций), называемая совершенной дизъюнктивной нормальной формой (коротко СДНФ) операции \(f\). Например, импликация имеет СДНФ

\[ x\Rightarrow y = \overline{x}\,\overline{y}\lor \overline{x}y\lor xy \]

Нетрудно заметить, что СДНФ определена с точностью до перестановки конъюнктов внутри дизъюнктов и перестановки самих дизъюнктов.

Совершенная конъюнктивная нормальная форма

Аналогичным образом можно построить «двойственный» объект — СКНФ.

Для этого нужно рассмотреть все наборы входов, на которых рассматриваемая операция имеет нулевое значение, и для каждого написать дизъюнкцию входов и/или их отрицаний, дающую 0 только на этом наборе.

Написанные дизъюнкции следует соединить операциями конъюнкции.

Например, для XOR СКНФ имеет вид

\[ x\oplus y = (\overline{x}\lor\overline{y})\land (x\lor y) \]

А для импликации СКНФ следует запомнить наизусть:

\[ x\Rightarrow y = \overline{x}\lor y \]

И опять NAND

Наличие СДНФ и СКНФ у произвольной зависимости показывает, что любую зависимость можно реализовать лишь комбинируя дизъюнкции с отрицаниями (или конъюнкции с отрицаниями).

Тем не менее, при некотором желании можно обойтись и одной операцией. К таким универсальным операциям относятся, например, NAND (и заодно его двойственная операция — NOR).

Это следует из (тривиально проверяемых) соотношений

  • \(\lnot x = x\,|\,x\)
  • \(x\land y = \lnot(x\,|\,y) = (x\,|\,y)\,|\,(x\,|\,y)\)