Эта статья не столько о трёх логических операторах and, or, not сколько о том, как ими эффективно пользоваться. И здесь без таблиц истинности и минтермов и макстермов не обойтись.
Среди трёх логических операторов Python один унарный – это оператор not и два бинарных and и or. Оператор not меняет значение своего единственного операнда на противоположное:
>>> not True
False
>>> not False
True
Действие операторов and и or, для наглядности, рассмотрим по таблице истинности:
№ | A | B | A and B | A or B |
---|---|---|---|---|
0 | False | False | False | False |
1 | False | True | False | True |
2 | True | False | False | True |
3 | True | True | True | True |
А как в Python можно построить другие, так же часто востребованные логические функции как, например, «исключающее ИЛИ»?
Проще всего, записать логическую функцию F(A,B) в виде таблицы истинности. Напомним, функция «исключающее ИЛИ» истинна (True) только тогда, когда только один из её аргументов True.
№ | A | B | f(A,B) | минтерм | макстерм |
---|---|---|---|---|---|
0 | False | False | False | A or B | |
1 | False | True | True | not A and B | |
2 | True | False | True | A and not B | |
3 | True | True | False | not A or not B |
В этой таблице, в колонке f(A,B) вы видите значение функции «исключающее ИЛИ» при заданных аргументах. В эту же таблицу мы добавили две колонки минтерм и макстерм.
Минтерм составляем по следующим правилам:
- Функция минтерма имеет смысл для тех значений аргументов при которых f(A,B) равно True.
- К аргументам применяем оператор and.
- Инвертируем с помощью оператора not аргументы, значение которых в данной строке равно False.
Макстерм составляем по следующим правилам:
- Функция макстерма имеет смысл для тех значений аргументов при которых f(A,B) равно False.
- К аргументам применяем оператор or.
- Инвертируем с помощью оператора not аргументы, значение которых в данной строке равно True.
Искомая логическая функция F(A,B) равна всем минтермам объединённым оператором or или всем макстермам объединённым оператором and:
(not A and B) or (A and not B)
или
(A or B) and (not A or not B)
Проверяем в Pyton первую функцию СДНФ (совершенная дизъюнктивная нормальная форма).
A = False
B = False
print (A, B, (not A and B) or (A and not B))
A = False
B = True
print (A, B, (not A and B) or(A and not B))
A = True
B = False
print (A, B, (not A and B) or (A and not B))
A = True
B = True
print (A, B, (not A and B) or (A and not B))
False False False
False True True
True False True
True True False
>>>
Проверяем в Pyton вторую функцию СКНФ (совершенная конъюктивная нормальная форма).
A = False
B = False
print (A, B, (A or B) and (not A or not B))
A = False
B = True
print (A, B, (A or B) and (not A or not B))
A = True
B = False
print (A, B, (A or B) and (not A or not B))
A = True
B = True
print (A, B, (A or B) and (not A or not B))
False False False
False True True
True False True
True True False
>>>
Мы видим – обе функции тождественны.
Следует отметить, что выше изложенный метод применим для поиска любой логической функции.
Далее немного законов из алгебры логики позволяющих упрощать и преобразовывать логические выражения:
Закон противоречия
A and not A == 0
Законисключенного третьего
A or not A == 1
Законы де Моргана
not (A or B) == not A and not B
not (A and B) == not A or not B
Законы повторения
A and A == A
A or A == A
Законы исключения констант
A and 1 == A
A and 0 == 0
Законы склеивания
(A and B) or (not A and B) == B
(A or B) and (not A or B) == B
Коммутативный закон
A and B == B and A
Ассоциативный закон
A and (B and C) == (A and B) and C
В Python так мало встроенных логических операторов. Нам доступны только and, or и not. Но оказывается и это количество избыточно. Обратите внимание на законы Де Моргана. Оказывается для выражения любой логической функции можно обойтись всего двумя логическими операторами and и not или or и not:
A or B == not (not A and not B)
A and B == not (not A or not B)