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