Алгебра логики : правила построения и преобразования логических выражений
Алгебра логики позволяет легко преобразовывать логические выражения, что бывает очень полезно. В этой заметке я хочу максимально просто, без математических обозначений, которые непривычны большинству людей, рассказать об этих простых и мощных правилах.
Обозначения
Я буду придерживаться обозначений, ясных большинству людей и привычных для программистов.
• «Истина» — true
• «Ложь» — false
• Логическое «и» — and
• Логическое «или» — or
• Логическое отрицание — not
Порядок операций я буду обозначать скобками и буду предполагать, что отрицание имеет наибольший приоритет. То есть выражение
A and not B
следует понимать как
A and (not B)
Таблицы истинности
Коротко напомню правила выполнения операций
not true = false
false and false = false
false or false = false
not false = true
true and false = false
true or false = true
false and true = false
false or true = true
true and true = true
true or true = true
Свойства операций
Логические операции во многом аналогичны привычным математическим, но имеют и свою специфику.
Коммутативность — «от перестановки слагаемых сумма не изменяется»
A and B = B and A
A or B = B or A
Идемпотентность
X and X = X
X or X = X
Ассоциативность — порядок выполнения операций не важен
(A and B) and C = A and (B and C)
(A or B) or C = A or (B or C)
Дистрибутивность — раскрытие скобок
C or (A and B) = (C or A) and (C or B)
C and (A or B) = (C and A) or (C and B)
Законы де Моргана (ударение на «о»):
not (A and B) = (not A) or (not B)
not (A or B) = (not A) and (not B)
Законы поглощения:
A and (A or B) = A
A or (A and B) = A
Другие полезные закономерности, в которых фигурируют константы true и false:
A and true = A
A or true = true
A and false = false
A or false = AA and (not A) = false
A or (not A) = true
Пример
Например, вам надо выполнить некое действие с файлом, «если дата его создания T меньше времени L, а если время T больше L, то требуется выполнение дополнительного условия P». Дословно это можно записать так:
T < L or (T > L and P)
Используем дистрибутивность — раскрываем скобки:
(T < L or T > L) and (T < L or P)
Первая скобка всегда «истина», а «истина и что-то — равно что-то». Получаем выражение:
T < L or P
Даже в таком простом выражении нам удалось вдвое уменьшить количество операций.
Про что здесь не рассказано
Строго говоря, алгебра логики рассматривает не только операции «и», «или» и «не». Другие операции не обладают всем перечисленными свойствами и заслуживают отдельного рассказа. Но я не стал здесь их рассматривать, так как в прикладном программировании используются преимущественно только три операции, а любые другие можно выразить через эти три.
Например, «исключающее или» можно выразить так:
A xor B = (A or B) and (not A or not B)
или
A xor B = (A and not B) or (B and not A)