Высказывания и логические операции: НЕ, И, ИЛИ

Учимся отличать высказывание от обычной фразы и собирать из трёх операций НЕ, И, ИЛИ любые логические условия.

Каждый раз, когда вы пишете if в программе или говорите «возьму зонт, если идёт дождь и я выхожу на улицу», вы пользуетесь логикой высказываний. Компьютер не понимает оттенков смысла, зато идеально работает с тем, что либо истинно, либо ложно. Научимся говорить на этом языке.

Высказывание — это повествовательное предложение, про которое можно однозначно сказать, истинно оно или ложно. Третьего не дано: либо «да» (истина, 1), либо «нет» (ложь, 0).

Что такое высказывание, а что нет

Высказывание обязано быть проверяемым утверждением. «Дважды два равно четыре» — истинное высказывание. «Москва — столица Франции» — ложное, но всё равно высказывание: мы можем оценить его как ложь.

А вот эти фразы высказываниями не являются, потому что им нельзя присвоить «истину» или «ложь»:

  • «Который час?» — вопрос, он ничего не утверждает.
  • «Закрой окно!» — приказ.
  • «Какой красивый закат!» — восклицание, оценка вкуса.
  • «x больше 5» — пока неизвестен x, это не высказывание, а высказывательная форма; оно станет высказыванием, как только подставим число.

Логические переменные

Чтобы не переписывать длинные фразы, высказывания обозначают буквами: A, B, p, q. Такая буква называется логической переменной и может принимать ровно два значения: 1 (истина) и 0 (ложь). Например, пусть A = «идёт дождь», B = «я на улице». Тогда из A и B можно строить сложные условия с помощью операций.

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

Отрицание переворачивает значение высказывания: истину делает ложью, ложь — истиной. Обозначается ¬A, иногда NOT A или чертой сверху. Если A = «идёт дождь» истинно, то ¬A = «дождь не идёт» ложно.

A¬A
01
10

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

Конъюнкция A ∧ B истинна только тогда, когда оба высказывания истинны. Достаточно одного «нет» — и весь результат «нет». Это как два условия, которые должны выполниться одновременно: «возьму зонт, если идёт дождь И я выхожу».

ABA ∧ B
000
010
100
111

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

Дизъюнкция A ∨ B истинна, когда истинно хотя бы одно из высказываний (или оба сразу). Ложна она лишь в единственном случае — когда оба ложны. Важно: это «или» не исключающее. «Сдам экзамен, если выучу теорию ИЛИ решу все задачи» — годится любой из вариантов, и оба тоже.

ABA ∨ B
000
011
101
111

Считаем таблицы истинности в коде

Чтобы убедиться, что таблицы выше не выдуманы, переберём все комбинации значений 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» — везде, кроме первой. Ровно об этом и говорят определения операций.

Приоритет операций

Когда в выражении встречаются сразу несколько операций, их выполняют по старшинству, как умножение перед сложением в арифметике:

  1. НЕ (отрицание) — самый высокий приоритет;
  2. И (конъюнкция) — средний;
  3. ИЛИ (дизъюнкция) — самый низкий.

Поэтому выражение ¬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.
  • НЕ переворачивает значение; И истинно только при обоих истинных; ИЛИ ложно только при обоих ложных.
  • Приоритет: НЕ → И → ИЛИ; скобки меняют порядок.
Проверьте себя
1. Какое из предложений является высказыванием?
AКоторый сейчас час?
BЗакрой, пожалуйста, дверь.
CЧисло 7 является простым.
DКакой замечательный фильм!
2. Чему равно ¬A, если A истинно (A = 1)?
A1
B0
CЗависит от другой переменной
DНеопределено
3. При каких значениях A и B конъюнкция A ∧ B (И) истинна?
AКогда хотя бы одно из A, B истинно
BТолько когда оба A и B истинны
CКогда оба A и B ложны
DВсегда
4. Чему равно 0 ∨ 1 (ложь ИЛИ истина)?
A0
B1
CЗависит от приоритета
DОшибка
5. Как с учётом приоритета операций читается выражение ¬A ∧ B ∨ C?
A¬(A ∧ (B ∨ C))
B((¬A) ∧ B) ∨ C
C¬((A ∧ B) ∨ C)
D(¬A) ∧ (B ∨ C)
6. Сколько значений может принимать логическая переменная?
AБесконечно много
BТри: истина, ложь, неизвестно
CРовно два: истина (1) и ложь (0)
DЛюбое целое число
Поддержать проект