Задание №2 — Построение таблицы истинности
Миша заполнял таблицу истинности логической функции
,
но успел заполнить лишь фрагмент из трёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.
| F | ||||
| 0 | 0 | 0 | 0 | |
| 0 | 0 | |||
| 0 | 0 | 0 |
Определите, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.
Правильный ответ
wyzx
Пояснение
Решение:
В задании известны только фрагменты трёх различных строк таблицы истинности, причём неизвестно, какая переменная стоит в каком столбце. Приём здесь всегда один: сначала выписываем все наборы, на которых функция принимает указанное значение, а затем прикладываем к ним строки фрагмента и смотрим, при каком порядке столбцов всё сходится.
Все слагаемые выражения должны быть нулевыми. Сразу , тогда , и равенство даёт , то есть . Наконец, равносильно и запрещает пару . Наборов три:
| w | x | y | z | F |
|---|---|---|---|---|
| 0 | 0 | 1 | 0 | 0 |
| 0 | 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 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, z)) or impl(not x, not y) or x
for w, x, y, z in product((0, 1), repeat=4):
if not F(w, x, y, z):
print(w, x, y, z)Ответ: wyzx