Булевы функции выполняют логические операции над значениями истинности — true и false. Этот раздел математики помогает программистам описывать логику алгоритмов

Понятие булевой функции

Булевы функции — это математический способ описания логических операций. Названы по имени британского математика Джорджа Буля, который в середине XIX века создал науку математической логики — булеву алгебру. Если обычные математические операции проводят с действительными числами, то булева алгебра работает со значениями истинности: true — «правда» и false — «ложь». В двоичной системе счисления, которая используется в программировании, их обозначают цифрами 1 и 0.

Простой пример функции булевых переменных: представим программу умного дома, которая управляет освещением. Чтобы понимать, в каком состоянии находится выключатель, программа использует логические значения. Если свет включён, значение состояния выключателя в программе будет равно 1, или true. Если выключен — 0, или false. Получение ответа «правда» или «ложь» по условию «Включён ли свет?» и есть простейшая булева функция.

У булевых функций есть входы — операнды и выход — результат. Например, выключатели света есть в двух комнатах и в прихожей. Чтобы лампа в прихожей выключалась, когда в обеих комнатах свет выключен, программе умного дома нужно применить булеву функцию AND — И. Эта функция берёт значения с выключателей в комнатах — входы: если оба они выключены (false и false), на выходе тоже будет значение false, и тогда свет в прихожей также выключится.

Какие булевы функции часто используют в программировании:

AND — И, конъюнкция. Возвращает true, если оба выхода равны true.

OR — ИЛИ, дизъюнкция. Возвращает true, если хотя бы один из выходов равен true.

NOT — НЕ, отрицание, инверсия. Инвертирует значение входа: если вход был true, возвращает false, и наоборот.

XOR — исключающее ИЛИ. Возвращает true, если только один из выходов был true.

NOR — ИЛИ-НЕ. Инвертирует результат функции OR, то есть возвращает true, только если оба входа равны false.

Таблицы истинности булевых функций

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

1. AND — И, конъюнкция. Возвращает true, если оба выхода равны true. В строках таблицы указывают все возможные комбинации значений входов A и B. В третьем столбце указан результат этих комбинаций с булевой функцией AND, которую также называют конъюнкцией или логическим умножением. Логическое умножение входов A и B обозначают символом ∧.

Из таблицы истинности функции AND видно, что выход 1(true) возможен, только когда оба выхода тоже имеют значение 1 (true). Если хотя бы один вход имеет значение 0 (false), на выходе тоже будет 0 (false).

ABAB
000
010
100
111

2. OR — ИЛИ, дизъюнкция. Возвращает true, если хотя бы один из выходов равен true. Функцию OR в булевой алгебре также называют дизъюнкцией или логическим сложением. Логическое сложение входов A и B обозначают символом ∨.

Выход функции OR имеет значение 1, если хотя бы один из выходов имеет значение 1. Когда значения входа A и входа B равны 0, результат логического сложения тоже будет равен 0.

ABAB
000
011
101
111

3. NOT — НЕ, отрицание, инверсия. Инвертирует значение входа: если вход был true, возвращает false, и наоборот. У булевой функции NOT — она же отрицание, или инверсия, — всего один вход, значение которого функция меняет на противоположное.

A¬A
01
10

Суперпозиции функций

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

Допустим, задана булева функция (A AND B) OR (C AND D). В этой операции есть четыре входа: A, B, С и D. Как и в обычной математике, сначала нужно выполнить операции AND в скобках, получить новые выходы и затем провести с ними операцию OR.

F1 = (0v0) v (1v1) = 1 F2 = (1v1) v (1v0) = 1 F3 = (0&0) & (1&1) = 0 F4 = ¬1 & (1v1) v (¬0&1) = 1 F5 = (¬1v1) & (1v ¬1) & (¬1v 0) = 0 F6 = (1 & 0) v (¬1 & 1) = 0 F7 = ¬(0 v 1) & (1 & ¬0) = 0 F8 = (1 v 1) & (0 v ¬0) v (1 & 0) = 1 F9 = ¬(¬1 v 0) & (1 v 0) = 1 F10 = (0 & 1) v (¬0 & ¬1) v (1 & 1) = 1 F11 = ¬(1 & 1) v ¬(0 v 0) = 1 F12 = (¬0 v 1) & (¬1 v 0) & (1 & 1) = 0
F13 = (1 v 0) & ¬(0 v 0) v 1 = 1 F14 = ¬(¬(1 & 0) v (1 & ¬0)) = 0 F15 = (1 & (0 v 1)) v (¬1 & (1 v 0)) = 1 F16 = ¬(1 v (0 & ¬1)) & 1 = 0 F17 = (¬0 & (1 v 0)) v (0 & ¬(1 v 1)) = 1 F18 = ((1 & 1) v ¬0) & (¬1 v (0 & 1)) = 0 F19 = ¬(¬(¬1 & 0) v (1 & ¬0)) = 0 F20 = (1 v ¬1) & (¬0 v 1) & (0 & 1) = 0 F21 = ¬((0 v 1) & (¬1 v 0)) v 1 = 1 F22 = (¬1 v ¬0) & ((1 & 0) v ¬1) = 0 F23 = ¬(1 & 0) v ¬(0 v ¬1) & 1 = 1 F24 = (1 & ¬1) v (¬0 & 1) v ¬(1 & 1) = 1 F25 = ¬((¬0 v 1) & (1 & ¬(0 v 0))) = 0