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