Задание №2 — Построение таблицы истинности
Миша заполнял таблицу истинности логической функции
,
но успел заполнить лишь фрагмент из трёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.
| F | ||||
| 1 | 0 | |||
| 0 | 0 | 0 | ||
| 0 | 0 | 0 |
Определите, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.
Правильный ответ
zywx
Пояснение
Решение:
Дизъюнкция равна нулю, только если нулевые оба слагаемых. Из следует и ; из следует , то есть при обязательно .
Подходящих наборов ровно три: равно , или ; из них и состоит фрагмент.
Так как во всех строках, в столбце не может быть нулей. Нули есть в первом, втором и третьем столбцах, значит — четвёртый столбец.
Столбцы и всюду различаются. Во второй строке первый и третий столбцы оба равны 0, в третьей строке оба равны 0 второй и третий столбцы — эти пары не годятся. Значит и стоят в первом и втором столбцах, а — в третьем.
Пусть первый столбец — , а второй — . Тогда в первой строке , откуда , а из условия получаем — это набор . Во второй строке и , значит — снова набор . Строки совпали бы, поэтому первый столбец — , а второй — .
Тот же результат даёт перебор всех 24 расстановок переменных по столбцам:
from itertools import permutations, product
def F(w, x, y, z):
return (not x or (y == z)) or not (not w or y)
rows = [t for t in product([0, 1], repeat=4) if not F(*t)] # наборы (w, x, y, z) с F = 0
frag = [[None, 1, None, None],
[0, None, 0, None],
[None, 0, 0, None]]
for cols in permutations('wxyz'): # cols[i] — переменная в i-м столбце
for order in permutations(rows, 3): # какой набор какой строке фрагмента
val = [dict(zip('wxyz', t)) for t in order]
if all(frag[r][i] is None or frag[r][i] == val[r][cols[i]]
for r in range(3) for i in range(4)):
print(''.join(cols))
break
Ответ: zywx