Конъюнкция, дизъюнкция и инверсия: and, or, not в Python и задачах

Информатикаобновлено 07.10.20269 мин чтенияесть тренажёр

Логические операции соединяют простые утверждения в сложные: «И» требует, чтобы были верны оба, «ИЛИ» — хотя бы одно, «НЕ» меняет истину на ложь. В Python они пишутся словами and, or и not. Ниже — таблицы истинности, порядок действий, примеры кода и генератор таблиц для любого выражения.

Загружаем…

Что такое логические операции

Логическая операция — это действие над высказываниями, у которых только 2 возможных значения: истина или ложь. Результат операции тоже всегда истина или ложь.

Высказывание — это утверждение, про которое можно сказать, верно оно или нет. «7 больше 3» — истинное высказывание, «Москва — столица Франции» — ложное. А вопрос «Который час?» или приказ «Закрой окно» высказываниями не являются: про них нельзя сказать «верно» или «неверно». В информатике истину часто обозначают 1, а ложь — 0, и это не случайно: компьютер хранит всё в виде нулей и единиц, а логика работает с теми же двумя значениями.

По федеральной образовательной программе основного общего образования логические операции «и», «или», «не» изучают в 8 классе[1]. Там же их используют в составных условиях: именно они позволяют в программе проверить сразу несколько требований.

Высказывания и переменные A, B, C

Чтобы не писать длинные фразы, высказывания обозначают буквами: A, B, C. Каждая буква — логическая переменная, которая может быть равна 1 (истина) или 0 (ложь).

Пусть A — «на улице дождь», B — «есть зонт». Тогда «на улице дождь и есть зонт» записывается как A И B, а «нет дождя» — НЕ A. Такая запись короче и точнее обычной речи. В русском языке «или» бывает разным: «чай или кофе?» обычно значит «что-то одно», а в логике ИЛИ истинно и тогда, когда верны оба варианта. Эта разница — источник частых ошибок, поэтому её стоит проговорить сразу. Сеймур Пейперт (Papert) описывал компьютер как среду, где ребёнок сам проверяет свои идеи и сразу видит результат[4], — генератор таблиц ниже работает именно так.

Операция НЕ (инверсия)

НЕ, или инверсия, — это операция над одним высказыванием, которая меняет его значение на противоположное: истина становится ложью, а ложь — истиной.

AНЕ A
01
10

Если A — «число чётное», то НЕ A — «число нечётное». Двойное отрицание возвращает исходное значение: НЕ (НЕ A) = A. В учебниках инверсию обозначают чертой над буквой или знаком ¬, в Python — словом not.

Операция И (конъюнкция)

И, или конъюнкция, — это операция над 2 высказываниями, которая истинна только тогда, когда истинны оба. Если хотя бы одно ложно, результат ложен.

ABA И B
000
010
100
111

Конъюнкцию называют логическим умножением: если подставить 0 и 1, результат совпадает с обычным произведением. Пример из жизни: «в кино пускают, если есть билет И зрителю больше 12 лет». Без любого из условий войти не получится. В учебниках И обозначают знаком ∧ или &, в Python — словом and.

Операция ИЛИ (дизъюнкция)

ИЛИ, или дизъюнкция, — это операция над 2 высказываниями, которая ложна только тогда, когда ложны оба. Достаточно одного истинного высказывания, чтобы результат стал истинным.

ABA ИЛИ B
000
011
101
111

Дизъюнкцию называют логическим сложением, но с поправкой: 1 ИЛИ 1 = 1, а не 2. Пример: «в выходной идём гулять, если суббота ИЛИ воскресенье». В учебниках ИЛИ обозначают знаком ∨, в Python — словом or.

Порядок выполнения логических операций и скобки

Если в выражении нет скобок, логические операции выполняются в 3 этапа: сначала НЕ, затем И, последним ИЛИ. Скобки меняют этот порядок, как в арифметике.

Вычислим A ИЛИ B И НЕ C при A = 1, B = 0, C = 1. Сначала НЕ C = 0. Затем B И 0 = 0. Последним A ИЛИ 0 = 1. Ответ: 1. Теперь со скобками: (A ИЛИ B) И НЕ C. Сначала скобка: 1 ИЛИ 0 = 1. Потом НЕ C = 0. И наконец 1 И 0 = 0. Одно и то же выражение со скобками и без дало разные ответы.

Полезно запомнить аналогию: И похоже на умножение, ИЛИ — на сложение, поэтому И выполняется раньше. Если сомневаетесь, ставьте скобки: лишние скобки не меняют результат, а читать выражение становится проще. Руководство PEP 8 тоже советует писать код так, чтобы его было легко прочитать[2].

and, or, not в Python

В Python логические операции записывают словами: not, and, or, а истину и ложь — значениями True и False. Порядок выполнения тот же: not, затем and, затем or.

A = True
B = False
C = True
print(not A)
print(A and B)
print(A or B)
print(A or B and not C)
print((A or B) and not C)
False
False
True
True
False

Последние две строки повторяют пример из предыдущего раздела — и результат тот же. Чаще всего and и or нужны в условиях. Проверим, попадает ли число в промежуток от 10 до 20:

x = int(input("Введите число: "))
if x >= 10 and x <= 20:
    print("В промежутке")
else:
    print("Вне промежутка")

Python разрешает и короткую запись 10 <= x <= 20, она означает то же самое. Подробнее о составных условиях — в уроке про условия if в Python, а полная таблица операторов с приоритетами — в справочнике об операторах Python. Официальная документация Python описывает и одну тонкость: and и or возвращают не обязательно True или False, а одно из значений операндов[3]. Например, 3 and 5 даёт 5. В школьных задачах это почти не встречается, но знать полезно.

Генератор таблиц истинности

Генератор вверху страницы строит таблицу истинности для выражения с переменными A, B, C и словами and, or, not: введите выражение, и тренажёр переберёт все наборы значений.

Для двух переменных в таблице 4 строки, для трёх — 8: каждая новая переменная удваивает число наборов. Попробуйте ввести not (A and B) и not A or not B — таблицы совпадут. Это закон де Моргана: отрицание И равно ИЛИ отрицаний. Аналогично not (A or B) совпадает с not A and not B. Такие совпадения удобно проверять генератором, а не перебирать строки вручную. Исследования самопроверки показывают, что ответ, найденный самостоятельно, запоминается лучше прочитанного, поэтому сначала постройте таблицу на бумаге, а потом сверьтесь.

Ту же таблицу можно построить своей программой: два вложенных цикла перебирают все значения A и B.

print("A B | A and B | A or B")
for a in (0, 1):
    for b in (0, 1):
        print(a, b, "|", int(a and b), "      |", int(a or b))

Логические задачи из школьного курса

Чтобы решить задачу на логику, переведите условие на язык A, B, C, постройте выражение и вычислите его по таблицам. Вот 3 типичных вида.

  1. Вычислить значение. Найти результат НЕ (X > 5) И (X < 10) при X = 7. НЕ (истина) = ложь, значит, всё выражение ложно.
  2. Найти число. При каком наименьшем целом X истинно (X > 3) И НЕ (X чётное)? Перебираем: 4 — чётное, 5 — подходит.
  3. Посчитать строки. Сколько единиц в таблице A ИЛИ B ИЛИ C? Ноль только в одной строке из 8, значит, единиц 7.

Задачи второго вида удобно проверять программой: цикл перебирает числа, а условие на Python записывается почти дословно. Это хороший мостик от логики к программированию: в ФОП ООО составные условия и циклы стоят в одном 8 классе. Как перебирать числа в цикле, объясняет урок о цикле for в Python.

Когда обычная логика не подходит

Если в задаче «или» означает «ровно одно из двух», обычное ИЛИ не подходит: нужна другая операция. Вот 4 похожие ловушки.

  • «Либо чай, либо кофе» — ровно 1 из 2. Это исключающее ИЛИ; в Python для логических значений его записывают как A != B.
  • Высказывание с 3 вариантами ответа, например «может быть». Двузначная логика работает только с истиной и ложью.
  • Выражение с 5 и более переменными. Таблица из 32 строк уже неудобна на бумаге — используйте генератор или программу.
  • Сравнение чисел через 1 знак & в Python. Это побитовая операция, а не and, и у неё другой приоритет.

«ИЛИ в логике означает, что верно только одно». Это миф: логическое ИЛИ истинно и тогда, когда верны оба высказывания.

«Порядок операций не важен, логика всегда читается слева направо». Это не подтверждается ни учебниками, ни Python: И выполняется раньше ИЛИ, и без скобок результат может измениться.

Чего делать нельзя

Нельзя вычислять выражение строго слева направо, не глядя на приоритет: сначала НЕ, потом И, потом ИЛИ. Вот 6 правил.

  • Нельзя писать x > 5 and < 10 — у каждой части должно быть своё полное сравнение.
  • Не следует путать and и & в условиях Python.
  • Не стоит писать if x == 1 or 2: — такое условие истинно всегда; нужно x == 1 or x == 2.
  • Нельзя забывать строки таблицы: для трёх переменных их ровно 8.
  • Не допускается писать True и False с маленькой буквы — Python их не узнает.
  • Не стоит экономить на скобках в длинных выражениях — их легко прочитать неправильно.

Источники

[1] Приказ Минпросвещения России от 18.05.2023 № 370 «Об утверждении федеральной образовательной программы основного общего образования».

[2] van Rossum G., Warsaw B., Coghlan N. PEP 8 — Style Guide for Python Code. Python Software Foundation, 2001.

[3] The Python Tutorial (официальная документация Python 3). Python Software Foundation.

[4] Papert S. Mindstorms: Children, Computers, and Powerful Ideas. New York: Basic Books, 1980.

Вопросы и ответы

Почему И называют умножением, а ИЛИ — сложением?

Если подставить 0 и 1, И даёт тот же результат, что произведение. ИЛИ похоже на сумму, только 1 + 1 здесь равно 1, потому что значение не может быть больше единицы.

Что вернёт Python, если сложить True и True?

Получится 2: в арифметике True ведёт себя как 1, а False как 0. Но для логики так делать не стоит, используйте and и or.

Сколько строк в таблице для четырёх переменных?

Шестнадцать: каждая переменная удваивает число наборов, 2 · 2 · 2 · 2 = 16. Для пяти будет 32.

Есть ли такие операции в Scratch?

Да, в категории «Операторы» есть блоки «и», «или», «не». Их вставляют в «если», так же как and и or в условия Python.

Что такое закон де Моргана простыми словами?

«Неверно, что оба» — то же самое, что «хотя бы один неверен». И наоборот: «неверно, что хотя бы один» — то же, что «оба неверны».

Как проверить себя без генератора?

Подставьте все наборы значений по порядку: 00, 01, 10, 11 и запишите результат для каждого. Если строк 4 и ни одна не пропущена, проверка полная.