Задача № 161
Миша заполнял таблицу истинности логической функции \( F \)
\[ w \land (x \rightarrow y) \land (\neg y \land z \lor y \land \neg z) \]
но успел заполнить лишь фрагмент из трёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных \( w \), \( x \), \( y \), \( z \).
? | ? | ? | ? | F |
---|---|---|---|---|
0 | 0 | 1 | ||
0 | 0 | 1 | 1 | |
1 | 0 | 1 | 1 |
Определите, какому столбцу таблицы соответствует каждая из переменных
В ответе напишите буквы \( w \), \( x \), \( y \), \( z \) в том порядке, в котором идут соответствующие им столбцы (сначала буква, соответствующая первому столбцу; затем буква, соответствующая второму столбцу, и так далее). Буквы в ответе пишите подряд, никаких разделителей мужду буквами ставить не нужно.
Пример. Функция \( F \) задана выражением \( ¬x \lor y \), зависящим от двух переменных, а фрагмент таблицы имеет следующий вид.
? | ? | F |
---|---|---|
0 | 1 | 0 |
В этом случае первому столбцу соответствует переменная \( y \), а второму столбцу - переменная \( x \). В ответе следует написать: \( yx \).
Решение
Код из видео
# подключаем стандартные библиотеки
from itertools import permutations, product
# напишем функцию, которая получает переменные и возвращает результат функции
def f(x, y, z, w):
return int( w and (x <= y) and ((not y) and z or y and (not z)))
# заполним пропуски в таблице
# с помощью product рассмотрим все возможные варианты таблиц
for a1, a2, a3, a4 in product((0,1), repeat=4):
table = (
(0,0,a1,a2),
(a3,0,0,1),
(1,a4,0,1),
)
# по условию задачи строки таблицы неповторяющиеся
# проверяем это условие и пропускаем повторяющиеся
if len(table) != len(set(table)): continue
# рассматриваем все перестановки для переменных
for vars in permutations('xyzw'):
# если при такой перестановке все строки дали нужный
# выводим ответ
if [f(**dict(zip(vars, row))) for row in table] == [1,1,1]:
# звездочка нужна, чтобы не видеть лишних символов
print(*vars)