Введение в минимизацию булевых функций
Представьте себе инженера, который проектирует микропроцессор для смартфона. В его распоряжении миллионы транзисторов, но каждый из них потребляет энергию, выделяет тепло и занимает физическое место на кремниевом кристалле. Если логическая схема, отвечающая за простое сложение чисел, будет состоять из 1000 элементов вместо 100, смартфон будет перегреваться и разряжаться за час. Именно здесь на помощь приходит математика, а точнее — процесс оптимизации логических выражений.
Общая постановка задачи минимизации
В основе работы любых цифровых устройств лежит булева алгебра. Сигналы в проводах интерпретируются как логический ноль (нет напряжения) и логическая единица (есть напряжение). Любое действие компьютера можно описать как булеву функцию — правило, по которому набору входных нулей и единиц сопоставляется выходной ноль или единица.
Зачастую первоначальное логическое выражение, описывающее нужную функцию, получается громоздким. Минимизация булевых функций — это процесс преобразования сложного логического выражения в эквивалентное, но более простое.
Совершенство достигается не тогда, когда нечего добавить, а тогда, когда нечего отнять.
Под «простотой» в дискретной математике обычно понимают критерий сложности (или цену схемы). Чаще всего это суммарное количество логических операций (И, ИЛИ, НЕ) и количество переменных (входов), участвующих в выражении. Чем меньше операций, тем меньше физических логических вентилей потребуется при сборке схемы.
Таблицы истинности: фундамент логики
Любую булеву функцию можно задать с помощью таблицы истинности. Это таблица, в которой перечислены все возможные комбинации входных переменных и соответствующее им значение функции.
Рассмотрим практический пример. Допустим, мы проектируем систему электронного голосования для трех директоров компании. Решение принимается большинством голосов. У нас есть три переменные: , и (голоса директоров, где 1 — «за», 0 — «против»). Функция должна выдавать 1, если хотя бы две переменные равны 1.
Построим таблицу истинности для функции голосования:
| x | y | z | f (Результат) |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 |
| 0 | 1 | 0 | 0 |
| 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 |
| 1 | 0 | 1 | 1 |
| 1 | 1 | 0 | 1 |
| 1 | 1 | 1 | 1 |
Таблица наглядно показывает, как работает система, но она не дает нам формулу, которую можно превратить в электрическую цепь. Для перехода от таблицы к формуле используются нормальные формы.
Совершенные нормальные формы (СДНФ и СКНФ)
Существуют два универсальных способа записать функцию по её таблице истинности. Они называются совершенными, потому что каждая переменная участвует в каждом слагаемом или множителе ровно один раз (либо в прямом виде, либо с отрицанием).
Совершенная дизъюнктивная нормальная форма (СДНФ)
СДНФ строится по строкам таблицы, где функция равна единице (1).
Алгоритм построения СДНФ:
- Найти все строки в таблице истинности, где результат равен 1.
- Для каждой такой строки составить логическое произведение (конъюнкцию, оператор И, обозначается как ). Если переменная в строке равна 1, берем ее как есть. Если равна 0, берем ее с отрицанием (оператор НЕ, обозначается как ). Такие произведения называются минтермами.
- Соединить все полученные произведения знаком логического сложения (дизъюнкции, оператор ИЛИ, обозначается как ).
Применим алгоритм к нашей таблице голосования. Единицы стоят в четырех строках:
- Строка 4 (): минтерм
- Строка 6 (): минтерм
- Строка 7 (): минтерм
- Строка 8 (): минтерм
Итоговая СДНФ:
Совершенная конъюнктивная нормальная форма (СКНФ)
СКНФ строится по строкам, где функция равна нулю (0). Подход зеркально противоположен.
Алгоритм построения СКНФ:
- Найти все строки, где результат равен 0.
- Для каждой строки составить логическую сумму (дизъюнкцию). Если переменная равна 0, берем ее без изменения. Если 1 — с отрицанием. Это макстермы.
- Соединить все суммы знаком логического умножения (конъюнкции).
Для нашей таблицы нули находятся в первых четырех случаях (строки 1, 2, 3, 5). Итоговая СКНФ будет выглядеть так:
Зачем нужна минимизация?
Посмотрим на полученную СДНФ. Чтобы собрать такую схему на заводе, нам понадобится:
- 3 инвертора (для создания )
- 4 элемента «3-И» (для умножения трех переменных)
- 1 элемент «4-ИЛИ» (для сложения четырех результатов)
Итого 8 логических вентилей и множество соединений. Это дорого и неэффективно.
Суть минимизации заключается в поиске закономерностей. В булевой алгебре есть закон склеивания: . Он означает, что если два выражения отличаются только одной переменной (в одном месте она с отрицанием, в другом без), эту переменную можно исключить, так как она не влияет на результат.
Если применить методы минимизации к нашей СДНФ, мы получим сокращенную форму:
Сравним результаты. Новая схема требует:
- 0 инверторов
- 3 элемента «2-И»
- 1 элемент «3-ИЛИ»
Количество вентилей сократилось вдвое (с 8 до 4), а сами вентили стали проще (у них меньше входов). В масштабах процессора, где таких функций миллиарды, подобная оптимизация экономит колоссальные ресурсы.
Основные методы минимизации
В рамках данного курса мы подробно изучим три основных подхода к минимизации булевых функций. Каждый из них имеет свои преимущества и область применения:
- Метод непосредственных преобразований (алгебраический). Основан на ручном применении законов и аксиом булевой алгебры (законы де Моргана, дистрибутивность, склеивание). Отлично подходит для простых функций от 2-3 переменных, но требует интуиции и не гарантирует нахождение абсолютно минимальной формы, если человек упустит неочевидное преобразование.
- Метод карт Карно (графический). Визуальный способ минимизации. Таблица истинности перерисовывается в виде специальной матрицы, где соседние ячейки отличаются только одной переменной. Это позволяет находить склеивания визуально, обводя единицы в прямоугольники. Идеально работает для функций от 3 до 5 переменных.
- Метод Куайна-Мак-Класки (таблично-алгоритмический). Строгий математический алгоритм, который последовательно сравнивает все минтермы друг с другом. Он лишен наглядности карт Карно, зато легко программируется и может применяться для функций с любым количеством переменных (6, 10, 100 и более). Именно этот алгоритм (и его эвристические модификации) лежит в основе современных систем автоматизированного проектирования электроники (САПР).
Понимание этих методов позволит вам не только успешно сдавать экзамены по дискретной математике, но и заложит базу для понимания архитектуры современных вычислительных систем.
Итоги
- Минимизация булевых функций необходима для снижения аппаратной сложности цифровых схем, что экономит ресурсы, энергию и физическое пространство.
- Любую логическую задачу можно описать с помощью таблицы истинности, которая показывает зависимость выхода от всех комбинаций входов.
- На основе таблицы истинности строятся универсальные формулы: СДНФ (по единицам) и СКНФ (по нулям), которые обычно избыточны и требуют оптимизации.
- Основные инструменты оптимизации, которые будут изучены далее: алгебраические преобразования, карты Карно и алгоритм Куайна-Мак-Класки.