Задание №2 — Построение таблицы истинности
Миша заполнял таблицу истинности логической функции
,
но успел заполнить лишь фрагмент из трёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.
| F | ||||
| 1 | 0 | 1 | ||
| 1 | 1 | 1 | ||
| 1 | 1 | 1 |
Определите, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.
Правильный ответ
zxyw
Пояснение
Решение:
Конъюнкция равна единице, только если истинны все множители: , и (то есть сочетания , быть не может).
Таких наборов ровно три: равно , или . Это и есть три строки фрагмента в каком-то порядке.
Во всех строках , поэтому в столбце не должно быть единиц. В первом, втором и третьем столбцах единицы есть, значит — четвёртый столбец (он и оставлен полностью пустым).
Во второй и третьей строках второй столбец равен 1. Если бы это была переменная , то в обеих строках , а тогда из следует ; вместе с и обе строки оказались бы одним и тем же набором , чего быть не может. Переменной второй столбец тоже не соответствует: в первой строке там 0, а всегда. Значит второй столбец — .
Остались и в первом и третьем столбцах. В первой строке первый столбец равен 1, а второй равен 0, то есть . Если бы первый столбец был переменной , получилось бы при — нарушение условия . Значит первый столбец — , а третий — .
Тот же результат даёт перебор всех 24 расстановок переменных по столбцам:
from itertools import permutations, product
def F(w, x, y, z):
return z and not w and (not y or x)
rows = [t for t in product([0, 1], repeat=4) if F(*t)] # наборы (w, x, y, z) с F = 1
frag = [[1, 0, None, None],
[1, 1, None, None],
[None, 1, 1, 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
Ответ: zxyw