Эта статья не столько о трёх логических операторах 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)