Задание №2 — Построение таблицы истинности
Миша заполнял таблицу истинности логической функции
но успел заполнить лишь фрагмент из трёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.
| F | ||||
| 0 | 0 | 0 | ||
| 1 | 0 | |||
| 0 | 1 | 0 |
Определите, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.
Правильный ответ
xwyz
Пояснение
Решение:
В задании известны только фрагменты трёх различных строк таблицы истинности, причём неизвестно, какая переменная стоит в каком столбце. Приём здесь всегда один: сначала выписываем все наборы, на которых функция принимает указанное значение, а затем прикладываем к ним строки фрагмента и смотрим, при каком порядке столбцов всё сходится.
Дизъюнкция равна нулю, когда и ложна импликация , то есть и . Последнее равносильно и запрещает пару . Остаются три набора:
| w | x | y | z | F |
|---|---|---|---|---|
| 0 | 0 | 1 | 0 | 0 |
| 1 | 0 | 1 | 0 | 0 |
| 1 | 1 | 1 | 0 | 0 |
На всех наборах и , поэтому в столбце нет нулей, а в столбце нет единиц. В фрагменте нули стоят в первом, втором и четвёртом столбцах, откуда — третий столбец; единицы стоят в первом и втором столбцах, откуда — четвёртый. В третьей строке фрагмента первый столбец равен 0, а второй равен 1, то есть переменные и принимают там разные значения, а это единственный набор . Значит первый столбец — , второй — .
Те же три набора нетрудно получить и перебором:
from itertools import product
def impl(a, b):
return (not a) or b
def F(w, x, y, z):
return impl(y, not impl(x, w)) or z
for w, x, y, z in product((0, 1), repeat=4):
if not F(w, x, y, z):
print(w, x, y, z)Ответ: xwyz