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