Алгебра логики позволяет легко преобразовывать логические выражения, что бывает очень полезно. В этой заметке я хочу максимально просто, без математических обозначений, которые непривычны большинству людей, рассказать об этих простых и мощных правилах.
Я буду придерживаться обозначений, ясных большинству людей и привычных для программистов.
Порядок операций я буду обозначать скобками и буду предполагать, что отрицание имеет наибольший приоритет. То есть выражение
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 = A
A 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)