Задание 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.