Таблицы истинности в ЕГЭ по информатике: решаем задание 2 на Python

· 3 мин чтения · Редакция Skill Unit

Типичное задание: дано выражение с четырьмя переменными и фрагмент его таблицы истинности, а подписи столбцов стёрты. Нужно определить, какой столбец какой переменной соответствует. Вручную придётся перебирать варианты и легко запутаться. Программа проверяет все варианты за долю секунды.

Логика на Python

  • И, ИЛИ, НЕ записываются как and, or, not.
  • Импликация «если a, то b» это (not a) or b.
  • Равносильность «a тогда и только тогда, когда b» это a == b.
  • Исключающее ИЛИ это a != b.
  • Чтобы результат был числом 0 или 1, оборачивайте его в int(...).

Пример задания

Логическая функция F задана выражением (x → y) ∧ (z ∨ ¬w) ∧ (y → w). Дан фрагмент таблицы истинности, в нём перечислены значения четырёх переменных в неизвестном порядке и значение F. Определите, какому столбцу какая переменная соответствует.

  • Строка 1: 0, 0, 1, 0, F = 0.
  • Строка 2: 1, 0, 1, 0, F = 1.
  • Строка 3: 1, 0, 1, 1, F = 1.
Python перебор перестановок
from itertools import permutations

def F(x, y, z, w):
    return int(((not x) or y) and (z or not w) and ((not y) or w))

rows = [
    (0, 0, 1, 0, 0),
    (1, 0, 1, 0, 1),
    (1, 0, 1, 1, 1),
]

answers = []
for perm in permutations("xyzw"):      # perm[i] — переменная в i-м столбце
    ok = True
    for *cols, f in rows:
        v = dict(zip(perm, cols))
        if F(v["x"], v["y"], v["z"], v["w"]) != f:
            ok = False
            break
    if ok:
        answers.append("".join(perm))
print(answers)   # ['zxwy']

Единственный вариант: zxwy. То есть первый столбец это z, второй x, третий w, четвёртый y. В ответе пишут буквы подряд в порядке столбцов.

Как это работает

Функция permutations из модуля itertools выдаёт все 24 порядка четырёх букв. Для каждого порядка мы присваиваем переменным значения из строки, считаем F и сравниваем с последним числом строки. Если все строки совпали, порядок подходит. Если подходит несколько порядков, значит, в условии ошибка или вы неверно записали выражение: в настоящих заданиях ответ единственный.

Полезная связанная задача: сколько наборов дают единицу

Python количество истинных наборов
from itertools import product

count = sum(F(x, y, z, w) for x, y, z, w in product([0, 1], repeat=4))
print(count)   # 5

product([0, 1], repeat=4) перебирает все 16 наборов значений четырёх переменных. Сумма значений F даёт число наборов, при которых выражение истинно: для нашего выражения это 5.

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

  • Неверно записали импликацию: «a → b» нельзя писать как a or b.
  • Забыли скобки: у not, and и or разный приоритет, лучше ставить скобки везде.
  • Перепутали порядок: «столбец i содержит переменную перестановки i», а не наоборот.
  • Не проверили, что подходит ровно один вариант.
  • Ответ записали с пробелами или заглавными буквами, хотя в условии указан другой формат.

Как проверить себя

Возьмите три строки таблицы и убедитесь руками, что найденный порядок даёт нужные значения F. Одна ручная проверка защищает от ошибок в записи выражения.

В курсе «ЕГЭ по информатике» логике посвящён отдельный урок с практикой и проверкой ответов. Первые уроки бесплатные.

Хотите пройти путь на практике?

Курс «ЕГЭ по информатике»: короткие уроки, практические задания и проверка ответов. Первый урок бесплатно.

Смотреть курс