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