Задание 2 ЕГЭ: фрагмент таблицы истинности
Фрагмент таблицы истинности. Тема номера — таблицы истинности. Ниже — пример с ответом и решением; кнопкой под ним можно решить такую же задачу с другими числами, ответ проверится сразу.
Пример
Миша заполнял таблицу истинности логической функции F
(w → y) → (¬z ∨ x ∨ x),
но успел заполнить лишь фрагмент из трёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.
| F | ||||
|---|---|---|---|---|
| 0 | 1 | 0 | ||
| 1 | 0 | 1 | 1 | 0 |
| 1 | 1 | 0 |
Определите, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.
В ответе напишите буквы w, x, y, z в том порядке, в котором идут соответствующие им столбцы (сначала буква, соответствующая первому столбцу; затем буква, соответствующая второму столбцу, и т.д.). Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.
Например, функция задана выражением ¬x ∨ y, зависящим от двух переменных, а фрагмент таблицы имеет следующий вид.
| F | ||
|---|---|---|
| 0 | 1 | 0 |
В этом случае первому столбцу соответствует переменная y, а второму столбцу – переменная x. В ответе следует написать: yx.
Ответ
yxwzРешение
Сначала выясним, на каких наборах (w, x, y, z) функция равна 0: 0001, 0011, 1011. Каждая строка фрагмента — один из этих наборов, записанный в переставленных столбцах.
Удобно смотреть на столбцы: сколько в столбце нулей и единиц может быть у каждой переменной и в каких строках. Надёжнее перебрать программой все расстановки переменных по столбцам и все способы заполнить пустые клетки; строки фрагмента должны получиться различными.
from itertools import permutations, product
def imp(a, b):
return (not a) or b
def F(w, x, y, z):
return imp(imp(w, y), (not z or x) or x)
rows = [(None, None, 0, 1), (1, 0, 1, 1), (1, None, None, 1)] # None — пустая клетка
answers = []
for order in permutations("wxyz"):
for fill in product([0, 1], repeat=4): # в таблице 4 пустых клеток
it = iter(fill)
t = [tuple(v if v is not None else next(it) for v in r) for r in rows]
if len(set(t)) < 3: # строки должны быть различными
continue
if all(F(**dict(zip(order, r))) == 0 for r in t):
answers.append("".join(order))
break
print(*answers)Подходит единственная расстановка: yxwz.