СДНФ: совершенная дизъюнктивная нормальная форма
Любую булеву функцию, которая не равна тождественно нулю, можно записать в единственном каноническом виде - совершенной дизъюнктивной нормальной форме (СДНФ). Эта форма нужна не только в курсе дискретной математики: на ней строятся минимизация логических схем, синтез комбинационных устройств и проверка эквивалентности двух разных записей одной и той же функции. Разберём, как по таблице истинности выделить нужные строки, превратить каждую в элементарную конъюнкцию и собрать из них СДНФ, а заодно - какие ошибки при этом чаще всего допускают. Ниже интерактивный калькулятор: переключай функцию или отдельные строки таблицы и сразу смотри, как меняется формула.
Что такое СДНФ и чем она отличается от обычной ДНФ
Дизъюнктивная нормальная форма (ДНФ) - это просто дизъюнкция каких-то конъюнкций, без жёстких требований к их составу: в одной конъюнкции переменной может не быть вовсе, в другой - быть с отрицанием, в третьей - без. Такую запись легко подобрать вручную, но у неё нет единственности: одну и ту же функцию можно записать разными ДНФ.
Совершенная ДНФ жёстче: каждая конъюнкция обязана быть полной - содержать все переменных функции ровно по одному разу, либо саму переменную, либо её отрицание, и ни разу не повторяться среди других конъюнкций. Такую элементарную конъюнкцию ранга называют минтермом. Именно требование «каждая переменная присутствует всегда» и даёт совершенной форме единственность: для функции, не равной тождественно нулю, СДНФ ровно одна с точностью до порядка минтермов и порядка литералов внутри минтерма.
Как построить СДНФ по таблице истинности
Алгоритм не требует никаких преобразований формулы - только чтение таблицы истинности:
- Найти в таблице истинности все строки, где функция равна единице.
- Для каждой такой строки построить минтерм - конъюнкцию всех переменных, где переменная берётся без отрицания, если в этой строке она равна 1, и с отрицанием , если равна 0.
- Соединить все построенные минтермы знаком дизъюнкции .
Возьмём мажоритарную функцию трёх переменных: , если хотя бы две из трёх переменных равны единице. Таблица истинности даёт единицу на наборах , , и - ровно четыре строки из восьми. Переводим каждую в минтерм и собираем дизъюнкцию:
Обратите внимание на закономерность: в наборе переменная равна 0, поэтому в минтерм она входит с отрицанием, а и равны 1 - входят без отрицания. Это правило работает одинаково для любого числа переменных и для любой строки.
Правило одной строки: откуда берётся отрицание
Частая путаница - забыть, что отрицание ставится именно там, где в строке стоит 0, а не там, где «кажется логичнее». Правило строго механическое и не зависит от смысла функции:

Для набора (то есть , , ) минтерм - это : единственная переменная с нулём в строке () получает отрицание, обе единичные переменные входят как есть. Если перепутать правило и ставить отрицание на переменных со значением 1, минтерм окажется равен нулю ровно на своём же наборе - и вся формула перестанет описывать исходную функцию.
Общая формула СДНФ для n переменных
Для функции переменных , не равной тождественно нулю, СДНФ записывается как дизъюнкция по всем наборам, на которых функция равна единице:
где , а . Число минтермов в СДНФ равно числу единиц в столбце значений функции - это называют весом функции. У функции трёх переменных всего строк, поэтому минтермов не больше восьми; у функции переменных строк , а различных булевых функций от переменных существует - для трёх переменных это 256 разных функций, и у каждой (кроме тождественного нуля) есть своя, единственная СДНФ.
Если функция задана формулой, а не таблицей
Если исходное выражение уже дано формулой, например , самый надёжный путь - построить таблицу истинности подстановкой всех наборов переменных, а затем применить тот же алгоритм. Это работает всегда и не требует эквивалентных преобразований. Есть и альтернативный путь: раскрыть импликации и отрицания по законам де Моргана, распределить конъюнкции по дизъюнкциям, а затем довести каждую неполную конъюнкцию до полной, домножив на тождественно истинное выражение вида для каждой отсутствующей переменной и раскрыв скобки. Оба способа дают один и тот же результат - таблица истинности проще считается вручную, а метод с показывает, откуда СДНФ берётся алгебраически, если функция уже дана в виде ДНФ без части переменных.
СДНФ и СКНФ: зеркальное правило
У СДНФ есть парная конструкция для строк, где функция равна нулю, - совершенная конъюнктивная нормальная форма (СКНФ). Правило построения там зеркальное:

Для СКНФ берутся строки, где , из каждой строится макстерм - дизъюнкция переменных, а не конъюнкция, - причём отрицание ставится там, где в строке стоит 1, а не 0. Для мажоритарной функции нулевые строки - это , , , , значит СКНФ:
Обе формы описывают одну и ту же функцию: если строк с единицей меньше половины, обычно короче СДНФ, если меньше половины строк с нулём - короче СКНФ.
Единственность и минимизация
СДНФ функции всегда одна и та же с точностью до порядка минтермов - это удобно для проверки: если два студента получили разные по числу минтермов СДНФ для одной и той же функции, у одного из них ошибка в таблице истинности. Но сама СДНФ почти никогда не минимальна: соседние минтермы, отличающиеся ровно одной переменной, можно склеить по закону , убрав лишнюю переменную. Такое склеивание - основа метода Квайна-Мак-Класки и карт Карно, и его результат называют минимальной ДНФ. Она уже не обязана быть совершенной: часть минтермов в ней объединена в более короткие конъюнкции, где не все переменные присутствуют.
Частые ошибки
- Отрицание ставится не на той переменной. В минтерме отрицание должно стоять там, где в строке 0, а не там, где переменная «кажется» ложной по смыслу задачи.
- Пропущена строка с единицей. Особенно на функциях от 4 и более переменных легко просмотреть одну строку в таблице из 16 или больше - тогда итоговая СДНФ не совпадает с исходной функцией на этом наборе.
- СДНФ путают с произвольной ДНФ. Не каждая дизъюнкция конъюнкций - совершенная форма; проверяйте, что в каждой конъюнкции ровно литералов, по одному на переменную.
- Забывают про тождественно ложную функцию. Если столбец значений весь состоит из нулей, СДНФ не существует - дизъюнкция минтермов была бы пустой.
- Путают правило СДНФ и СКНФ. Для минтерма отрицание ставится на нулях строки, для макстерма СКНФ - наоборот, на единицах.
FAQ
Может ли СДНФ функции содержать все возможные минтермы сразу? Да, если функция тождественно истинна - тогда в СДНФ войдут все минтермов. Формально это допустимо, хотя такая запись избыточна: тождественно истинную функцию проще обозначить константой 1.
Что делать, если в таблице истинности функция равна единице на всех строках, кроме одной? Строить СДНФ по тому же алгоритму - минтермов будет , просто пропущена одна строка с нулём. Никакого особого случая тут нет, кроме тождественно ложной функции.
Обязательно ли СДНФ - самая короткая запись функции? Нет, наоборот: СДНФ обычно избыточна, потому что каждая конъюнкция содержит все переменные. Минимальная ДНФ, полученная склеиванием минтермов, как правило короче и удобнее для построения логической схемы.
Как проверить, что две разные формулы задают одну и ту же функцию? Построить СДНФ для каждой (через таблицу истинности) и сравнить наборы минтермов - благодаря единственности СДНФ они совпадут тогда и только тогда, когда функции равны.
Коротко
СДНФ - единственная каноническая запись булевой функции в виде дизъюнкции полных конъюнкций (минтермов), по одной на каждую строку таблицы истинности, где функция равна единице. Литерал переменной входит в минтерм без отрицания, если в строке 1, и с отрицанием, если 0. Формула по всем наборам с работает для любого числа переменных, а зеркальное правило с макстермами даёт парную СКНФ по нулевым строкам. Сама СДНФ почти никогда не минимальна - для компактной схемы её ещё нужно упростить склеиванием соседних минтермов.
Читайте также

Приоритет логических операций в выражении: порядок и правила
Приоритет логических операций: в каком порядке считаются НЕ, И, ИЛИ, импликация и эквивалентность, как расставлять скобки в выражении, строить таблицу истинности и где чаще всего ошибаются студенты.

Атрибуты сущности в ER-модели: пять типов и примеры
Разбираем пять типов атрибутов сущности в ER-модели: простой, составной, ключевой, многозначный, производный, с примерами и переходом к столбцам и таблицам реляционной схемы.

Циркуляция векторного поля по контуру: формула и смысл
Циркуляция векторного поля по контуру: что это такое, как вычислить линейный интеграл по параметризации и через ротор поля с теоремой Грина, разбор типичных ошибок и примеров расчёта.

Динамическое программирование: основы и идея мемоизации
Что такое динамическое программирование простыми словами: перекрывающиеся подзадачи, оптимальная подструктура, мемоизация и табуляция на примере чисел Фибоначчи, разница с наивной рекурсией.

Кодировка Unicode и UTF-8: как кодируются символы
Кодировка Unicode и UTF-8 простыми словами: как код символа превращается в байты, почему кириллица и эмодзи занимают 2-4 байта и как устроены префиксы 110, 1110, 10.

Начальные и центральные моменты случайной величины: формулы
Разбираем начальные и центральные моменты случайной величины: как выразить дисперсию, асимметрию и эксцесс через ν_k и вычислить их на примере дискретного распределения.