Задание 3: логические выражения и таблицы истинности

Разбираемся в логике: И, ИЛИ, НЕ и как найти, для скольких чисел выражение истинно, — это задание №3.

Логическое выражение — это утверждение, которое для каждого набора значений переменных принимает значение «истина» (1) или «ложь» (0).

Что проверяет задание 3

В задании 3 дают логическое выражение с переменной (часто это условие про число X) и просят: либо найти, для какого числа выражение истинно/ложно, либо выбрать выражение, тождественное данному. Нужно уверенно владеть тремя операциями и порядком их выполнения.

Три базовые операции

ОперацияЗнакКогда истинно
НЕ (отрицание)¬, НЕкогда исходное ложно
И (конъюнкция)∧, Икогда оба истинны
ИЛИ (дизъюнкция)∨, ИЛИкогда хотя бы одно истинно

Порядок действий (как «скобки и умножение» в математике): сначала НЕ, затем И, затем ИЛИ. Скобки меняют порядок.

Таблица истинности

Чтобы «увидеть» выражение целиком, строят таблицу истинности — перебор всех наборов значений. Для двух переменных наборов 4, для трёх — 8.

Построим таблицу для выражения НЕ A ИЛИ B (это импликация «если A, то B»):

print("A B | НЕ A ИЛИ B")
for a in (0, 1):
    for b in (0, 1):
        f = (not a) or b
        print(a, b, " ", int(f))

Вывод:

A B | НЕ A ИЛИ B
0 0   1
0 1   1
1 0   0
1 1   1

Выражение ложно только в одном случае — когда A истинно, а B ложно. Это и есть смысл «если A, то B».

Метод «подставь и проверь» для чисел

Самый частый сюжет: дано выражение вида «(X кратно 3) И НЕ (X < 10)» и список чисел; нужно найти, для какого числа оно истинно. Метод простой: подставляйте каждое число и считайте.

Пример: для какого из чисел 6, 12, 21, 30 ложно выражение «(X > 10) И (X кратно 3)»?

def expr(x):
    return (x > 10) and (x % 3 == 0)

for x in (6, 12, 21, 30):
    print(x, "->", expr(x))

Вывод:

6 -> False
12 -> True
21 -> True
30 -> True

Выражение ложно для 6 (оно не больше 10). Остальные дают «истину». Так перебор мгновенно даёт ответ.

Выражение с тремя переменными

Иногда в выражении три переменные — тогда наборов 8 (2·2·2). Построим таблицу для (A И B) ИЛИ НЕ C и заодно посчитаем, в скольких строках выражение истинно:

istinno = 0
print("A B C | (A и B) или не C")
for a in (0, 1):
    for b in (0, 1):
        for c in (0, 1):
            f = (a and b) or (not c)
            istinno += int(bool(f))
            print(a, b, c, " ", int(bool(f)))
print("Истинно в строках:", istinno)

Вывод:

A B C | (A и B) или не C
0 0 0   1
0 0 1   0
0 1 0   1
0 1 1   0
1 0 0   1
1 0 1   0
1 1 0   1
1 1 1   1
Истинно в строках: 5

Разберём логику: НЕ C истинно во всех строках, где C=0 (их четыре), — там выражение уже истинно независимо от A и B. Среди строк с C=1 выражение истинно только когда A И B, то есть при A=1, B=1 — одна строка. Итого 4+1 = 5 истинных строк. Перебор всех наборов в цикле — безотказный способ проверить себя.

Связь с делимостью

В задании 3 постоянно встречаются условия «X кратно k» — это X % k == 0 (остаток от деления равен 0). Полезно держать в голове:

  • X % 2 == 0 — чётное;
  • X % 10 == 0 — оканчивается на 0;
  • X % 10 == 5 — оканчивается на 5.

Типичные ошибки

  • Нарушают порядок: выполняют ИЛИ раньше И.
  • Путают «И» и «ИЛИ»: «И» строже (нужны оба), «ИЛИ» мягче (хватает одного).
  • Забывают про отрицание: НЕ (X > 10) — это X ≤ 10, а не X < 10.
  • Ищут, где «истинно», когда спрашивали, где «ложно» (и наоборот) — читайте вопрос дважды.

Итог

  • Операции: НЕ (меняет значение), И (оба), ИЛИ (хотя бы одно).
  • Порядок: НЕ → И → ИЛИ, скобки сильнее.
  • Для чисел работает перебор «подставь и проверь».
  • «Кратно k» — это остаток X % k == 0.
Проверьте себя
1. Когда истинно выражение «A И B»?
AКогда истинно хотя бы одно из A, B
BКогда истинны оба A и B
CКогда оба ложны
DВсегда
2. В каком порядке выполняются логические операции без скобок?
AИЛИ, И, НЕ
BИ, ИЛИ, НЕ
CНЕ, И, ИЛИ
DСлева направо без приоритета
3. Чему эквивалентно условие «НЕ (X > 10)»?
AX > 10
BX ≥ 10
CX ≤ 10
DX < 10
4. Для какого числа истинно «(X кратно 5) И (X > 7)»?
A5
B10
C6
D3
Поддержать проект