Что такое логические операции
Логическая операция — это действие над высказываниями, у которых только 2 возможных значения: истина или ложь. Результат операции тоже всегда истина или ложь.
Высказывание — это утверждение, про которое можно сказать, верно оно или нет. «7 больше 3» — истинное высказывание, «Москва — столица Франции» — ложное. А вопрос «Который час?» или приказ «Закрой окно» высказываниями не являются: про них нельзя сказать «верно» или «неверно». В информатике истину часто обозначают 1, а ложь — 0, и это не случайно: компьютер хранит всё в виде нулей и единиц, а логика работает с теми же двумя значениями.
По федеральной образовательной программе основного общего образования логические операции «и», «или», «не» изучают в 8 классе[1]. Там же их используют в составных условиях: именно они позволяют в программе проверить сразу несколько требований.
Высказывания и переменные A, B, C
Чтобы не писать длинные фразы, высказывания обозначают буквами: A, B, C. Каждая буква — логическая переменная, которая может быть равна 1 (истина) или 0 (ложь).
Пусть A — «на улице дождь», B — «есть зонт». Тогда «на улице дождь и есть зонт» записывается как A И B, а «нет дождя» — НЕ A. Такая запись короче и точнее обычной речи. В русском языке «или» бывает разным: «чай или кофе?» обычно значит «что-то одно», а в логике ИЛИ истинно и тогда, когда верны оба варианта. Эта разница — источник частых ошибок, поэтому её стоит проговорить сразу. Сеймур Пейперт (Papert) описывал компьютер как среду, где ребёнок сам проверяет свои идеи и сразу видит результат[4], — генератор таблиц ниже работает именно так.
Операция НЕ (инверсия)
НЕ, или инверсия, — это операция над одним высказыванием, которая меняет его значение на противоположное: истина становится ложью, а ложь — истиной.
| A | НЕ A |
| 0 | 1 |
| 1 | 0 |
Если A — «число чётное», то НЕ A — «число нечётное». Двойное отрицание возвращает исходное значение: НЕ (НЕ A) = A. В учебниках инверсию обозначают чертой над буквой или знаком ¬, в Python — словом not.
Операция И (конъюнкция)
И, или конъюнкция, — это операция над 2 высказываниями, которая истинна только тогда, когда истинны оба. Если хотя бы одно ложно, результат ложен.
| A | B | A И B |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
Конъюнкцию называют логическим умножением: если подставить 0 и 1, результат совпадает с обычным произведением. Пример из жизни: «в кино пускают, если есть билет И зрителю больше 12 лет». Без любого из условий войти не получится. В учебниках И обозначают знаком ∧ или &, в Python — словом and.
Операция ИЛИ (дизъюнкция)
ИЛИ, или дизъюнкция, — это операция над 2 высказываниями, которая ложна только тогда, когда ложны оба. Достаточно одного истинного высказывания, чтобы результат стал истинным.
| A | B | A ИЛИ B |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
Дизъюнкцию называют логическим сложением, но с поправкой: 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 типичных вида.
- Вычислить значение. Найти результат НЕ (X > 5) И (X < 10) при X = 7. НЕ (истина) = ложь, значит, всё выражение ложно.
- Найти число. При каком наименьшем целом X истинно (X > 3) И НЕ (X чётное)? Перебираем: 4 — чётное, 5 — подходит.
- Посчитать строки. Сколько единиц в таблице 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 и ни одна не пропущена, проверка полная.