Высказывания и логические операции: НЕ, И, ИЛИ
Учимся отличать высказывание от обычной фразы и собирать из трёх операций НЕ, И, ИЛИ любые логические условия.
Каждый раз, когда вы пишете if в программе или говорите «возьму зонт, если идёт дождь и я выхожу на улицу», вы пользуетесь логикой высказываний. Компьютер не понимает оттенков смысла, зато идеально работает с тем, что либо истинно, либо ложно. Научимся говорить на этом языке.
Высказывание — это повествовательное предложение, про которое можно однозначно сказать, истинно оно или ложно. Третьего не дано: либо «да» (истина,
1), либо «нет» (ложь,0).
Что такое высказывание, а что нет
Высказывание обязано быть проверяемым утверждением. «Дважды два равно четыре» — истинное высказывание. «Москва — столица Франции» — ложное, но всё равно высказывание: мы можем оценить его как ложь.
А вот эти фразы высказываниями не являются, потому что им нельзя присвоить «истину» или «ложь»:
- «Который час?» — вопрос, он ничего не утверждает.
- «Закрой окно!» — приказ.
- «Какой красивый закат!» — восклицание, оценка вкуса.
- «x больше 5» — пока неизвестен
x, это не высказывание, а высказывательная форма; оно станет высказыванием, как только подставим число.
Логические переменные
Чтобы не переписывать длинные фразы, высказывания обозначают буквами: A, B, p, q. Такая буква называется логической переменной и может принимать ровно два значения: 1 (истина) и 0 (ложь). Например, пусть A = «идёт дождь», B = «я на улице». Тогда из A и B можно строить сложные условия с помощью операций.
Операция НЕ — отрицание (инверсия)
Отрицание переворачивает значение высказывания: истину делает ложью, ложь — истиной. Обозначается ¬A, иногда NOT A или чертой сверху. Если A = «идёт дождь» истинно, то ¬A = «дождь не идёт» ложно.
| A | ¬A |
|---|---|
| 0 | 1 |
| 1 | 0 |
Операция И — конъюнкция (AND)
Конъюнкция A ∧ B истинна только тогда, когда оба высказывания истинны. Достаточно одного «нет» — и весь результат «нет». Это как два условия, которые должны выполниться одновременно: «возьму зонт, если идёт дождь И я выхожу».
| A | B | A ∧ B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
Операция ИЛИ — дизъюнкция (OR)
Дизъюнкция A ∨ B истинна, когда истинно хотя бы одно из высказываний (или оба сразу). Ложна она лишь в единственном случае — когда оба ложны. Важно: это «или» не исключающее. «Сдам экзамен, если выучу теорию ИЛИ решу все задачи» — годится любой из вариантов, и оба тоже.
| A | B | A ∨ B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
Считаем таблицы истинности в коде
Чтобы убедиться, что таблицы выше не выдуманы, переберём все комбинации значений a и b в Python. В Python 0 ведёт себя как ложь, 1 — как истина, а операторы называются not, and и or. Запустите код и сравните с таблицами.
print("a b | НЕ a | a И b | a ИЛИ b")
for a in (0, 1):
for b in (0, 1):
ne = int(not a)
i = int(a and b)
ili = int(a or b)
print(f"{a} {b} | {ne} | {i} | {ili}")
Вывод программы совпадает с тремя таблицами выше — строка за строкой:
a b | НЕ a | a И b | a ИЛИ b 0 0 | 1 | 0 | 0 0 1 | 1 | 0 | 1 1 0 | 0 | 0 | 1 1 1 | 0 | 1 | 1
Обратите внимание: столбец «a И b» содержит единицу лишь в последней строке, а «a ИЛИ b» — везде, кроме первой. Ровно об этом и говорят определения операций.
Приоритет операций
Когда в выражении встречаются сразу несколько операций, их выполняют по старшинству, как умножение перед сложением в арифметике:
- НЕ (отрицание) — самый высокий приоритет;
- И (конъюнкция) — средний;
- ИЛИ (дизъюнкция) — самый низкий.
Поэтому выражение ¬A ∧ B ∨ C читается как ((¬A) ∧ B) ∨ C. Сначала отрицаем A, затем «И» с B, и только в конце «ИЛИ» с C. Если нужен другой порядок — ставьте скобки, они переопределяют приоритет: ¬A ∧ (B ∨ C) — это уже совсем другое выражение.
Проверим на числах, что скобки действительно меняют ответ. Возьмём A = 1, B = 0, C = 1. Без скобок приоритет даёт ¬A ∧ B ∨ C = (¬1 ∧ 0) ∨ 1 = (0 ∧ 0) ∨ 1 = 0 ∨ 1 = 1. А со скобками ¬A ∧ (B ∨ C) = 0 ∧ (0 ∨ 1) = 0 ∧ 1 = 0. Результаты разные: 1 против 0. Вот зачем нужны скобки — они меняют то, что́ компьютер посчитает первым, а значит, и итог.
Запустите код ниже: он перебирает все восемь наборов A, B, C и в каждом сравнивает выражение без скобок и со скобками. Ищите строки, где значения в двух последних столбцах расходятся.
print("A B C | без скобок | со скобками")
for A in (0, 1):
for B in (0, 1):
for C in (0, 1):
no_par = int((not A and B) or C)
par = int((not A) and (B or C))
mark = " <-- разные" if no_par != par else ""
print(f"{A} {B} {C} | {no_par} | {par}{mark}")
Вывод покажет, что для A = 1, B = 0, C = 1 (и ещё нескольких наборов) ответы со скобками и без скобок отличаются. Значит, запись без скобок и запись со скобками — это два разных выражения, а не одно и то же.
A B C | без скобок | со скобками 0 0 0 | 0 | 0 0 0 1 | 1 | 1 0 1 0 | 1 | 1 0 1 1 | 1 | 1 1 0 0 | 0 | 0 1 0 1 | 1 | 0 <-- разные 1 1 0 | 0 | 0 1 1 1 | 1 | 0 <-- разные
Частые ошибки
- Считать вопросы и приказы высказываниями. Высказывание только утверждает что-то проверяемое.
- Путать «И» и «ИЛИ»: «И» требует, чтобы выполнились оба условия, «ИЛИ» — хотя бы одно.
- Думать, что «ИЛИ» исключающее. Обычное логическое ИЛИ истинно и тогда, когда оба условия истинны.
- Забывать про приоритет: без скобок «НЕ» применяется раньше «И», а «И» — раньше «ИЛИ».
Коротко
- Высказывание — фраза, которую можно оценить как истину (
1) или ложь (0). - Логическая переменная хранит одно из двух значений:
1или0. - НЕ переворачивает значение; И истинно только при обоих истинных; ИЛИ ложно только при обоих ложных.
- Приоритет: НЕ → И → ИЛИ; скобки меняют порядок.