Счетчик просмотров97

Приоритет and / or / not и скобки

Оглавление
Порядок действийГде это ломает решениеЛогические операцииПример с ЕГЭ: задание 15Пример с ЕГЭ: задание 2

Порядок действий

Логические операции выполняются в строгом порядке — от самой «сильной» к самой «слабой»:

ПриоритетОперацииЗначок в условии
1 (выполняется первым)арифметика: **, *, /, //, %, +, -—
2сравнения: <, >, <=, >=, ==, !=, сюда же импликация A <= B→, ≡
3not¬
4and∧
5 (последним)or∨

Импликация в этой таблице стоит на второй строке, потому что записывается оператором сравнения <=. В математической записи из условия ЕГЭ она наоборот самая слабая — слабее or. Порядок перевёрнут, поэтому операнды импликации всегда берут в скобки: (A) <= (B).

Главное следствие: оператор and сильнее, чем or. Выражение читается так, будто вокруг всех and уже стоят скобки: 

PYTHON-КОД
1

Второе следствие: сравнения выполняются раньше логических операций, поэтому x % 3 == 0 and x > 10 работает без скобок — сначала считается x % 3, потом == 0, и только потом and.

Где это ломает решение

PYTHON-КОД
1
2
3
4

Здесь ответы совпали случайно. Возьмём x = 101: 

PYTHON-КОД
1
2
3
4

Совпадения будут встречаться часто — и именно поэтому ошибка живучая: программа выдаёт верный ответ на проверочных числах и неверный на экзаменационных. Вывод простой: в задании 15 скобки ставим всегда, даже там, где они формально не нужны.

Логические операции

В ЕГЭ логические выражения записывают математическими значками. Перевод на Python:

В условииНа Python
¬A (отрицание)not A
A ∧ B (конъюнкция, И)A and B
A ∨ B (дизъюнкция, ИЛИ)A or B
A → B (импликация)A <= B
A ≡ B (эквивалентность)A == B
ДЕЛ(x, k)x % k == 0

Каждый операнд обязательно берётся в скобки. У <= приоритет сравнения — самый высокий среди логических операций, а у импликации в математике почти самый низкий, поэтому без скобок порядок получится обратным. И a <= b <= c Python читает как цепочку (a <= b) and (b <= c), а не как две импликации.

Баннер статьи

Пример с ЕГЭ: задание 15

Формулировка: «Найдите наибольшее натуральное число A, при котором выражение ДЕЛ(x, A) ∨ (¬ДЕЛ(x, 21) ∧ ¬ДЕЛ(x, 35)) истинно для любого натурального x».

Решается перебором: пробуем каждое A и проверяем выражение на большом диапазоне x. 

PYTHON-КОД
1
2
3
4
5
6
7

Ответ — 7. Обрати внимание на три вещи:

  • каждое элементарное условие обёрнуто в скобки — так формула из условия переносится в код один в один;
  • all(...) проверяет «истинно для любого x»; для формулировки «существует x» берётся any(...);
  • диапазон проверки берут с запасом: 100 000 значений достаточно почти всегда, а вот 100 — уже нет, легко получить лишние подходящие A.

Если в условии спрашивают наименьшее A, меняется только последняя строка: min(res).

Пример с ЕГЭ: задание 2

Перебор всех наборов переменных удобно делать через itertools.product

PYTHON-КОД
1
2
3
4
5

 

product([0, 1], repeat=4) даёт все 16 наборов из нулей и единиц — ровно строки таблицы истинности. Ноль и единица работают как False и True, поэтому писать x == 1 не нужно.

Оцените статью

Другие статьи по предмету

Другие статьи не найдены