Задача № 85
Миша заполнял таблицу истинности логической функции \( F \)
\[ (x \land ¬y) \lor (y ≡ z) \lor ¬w, \]
но успел заполнить лишь фрагмент из трёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных \( w \), \( x \), \( y \), \( z \).
? | ? | ? | ? | F |
---|---|---|---|---|
0 | 0 | 0 | ||
1 | 0 | 0 | 0 | |
1 | 0 | 1 | 0 |
Определите, какому столбцу таблицы соответствует каждая из переменных
В ответе напишите буквы \( w \), \( x \), \( y \), \( z \) в том порядке, в котором идут соответствующие им столбцы (сначала буква, соответствующая первому столбцу; затем буква, соответствующая второму столбцу, и так далее). Буквы в ответе пишите подряд, никаких разделителей мужду буквами ставить не нужно.
Пример. Функция \( F \) задана выражением \( ¬x \lor y \), зависящим от двух переменных, а фрагмент таблицы имеет следующий вид.
? | ? | F |
---|---|---|
0 | 1 | 0 |
В этом случае первому столбцу соответствует переменная \( y \), а второму столбцу - переменная \( x \). В ответе следует написать: \( yx \).
Решение
Алгоритмов решения такого задания много. От аналитических способов до полного перебора на компьютере. Рассмотрим три способа решения задачи.
Рассуждаем. Аналитический способ
Посмотрим на логическое выражение и таблицу истинности. Мы рассматриваем только ложные случаи дизъюнкции. Дизъюнкция «ИЛИ» ложна только тогда, когда ложны все высказывания.
\((x \land ¬y)\) \(\lor\) \((y ≡ z)\) \(\lor\) \(¬w\)
? | ? | ? | ? | F |
---|---|---|---|---|
0 | 0 | 0 | ||
1 | 0 | 0 | 0 | |
1 | 0 | 1 | 0 |
Получается, что каждое из высказываний должно быть ложно и мы можем их рассматривать отдельно. Перепишем логическое выражение.
\[\begin{cases} x \land ¬y = 0\\ y ≡ z = 0 \\ ¬w = 0 \end{cases}\]
Начнём с выражения, которое содержит только одну переменную: \( ¬w \). Чтобы оно было всегда ложно, \( w \) должно быть всегда истинно. Такое возможно только в первом столбце таблицы. Заполним
w | ? | ? | ? | F |
---|---|---|---|---|
1 | 0 | 0 | 0 | |
1 | 0 | 0 | 0 | |
1 | 0 | 1 | 0 |
Далее рассмотрим выражение \( y ≡ z \). Между переменными эквиваленция. Она ложна, когда \(y\) и \(z\) разные по значению. Такое возможно во втором и третьем столбце таблицы. Получается, что четвёртый столбец — это \(x\). Заполним
w | ? | ? | x | F |
---|---|---|---|---|
1 | 1 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 0 |
Все строки в таблицы должны быть различные. Посмотрим на две последние строки. Чтобы они не совпадали, \(x\) должен быть равен 1. Заполним
w | ? | ? | x | F |
---|---|---|---|---|
1 | 1 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 1 | 0 |
Рассмотрим первое выражение \( x \land ¬y \) и последнюю строку таблицы. Конъюнкция «И» ложна, когда ложно хотя бы одно из высказываний. Если \( x = 1 \), то \( ¬y \) должен быть равен нулю. Значит \( y = 1 \). Такое выполняется в третьем столбце. Заполним
w | ? | y | x | F |
---|---|---|---|---|
1 | 1 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 1 | 0 |
Последняя переменная занимает неподписанный столбец. Можно записать ответ: wzyx
Построим таблицу истинности
# напечатаем имена переменных
print('x y z w F')
# переберём все возможные значения для x, y, z и w
for x in 0, 1:
for y in 0, 1:
for z in 0, 1:
for w in 0, 1:
# запишем логическое выражение
# обратите внимание на скобки вокруг not
F = int( (x and (not y)) or (y == z) or (not w) )
# если значение функции равно нулю, выводим
if F == 0:
print(x, y, z, w, F)
Запустим код и получим таблицу истинности.
x | y | z | w | F |
---|---|---|---|---|
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 | 0 |
Сопоставим таблицы. Столбец из всех единиц можно разместить только первым.
x | y | z | w | F |
---|---|---|---|---|
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 | 0 |
? | ? | ? | ? | F |
---|---|---|---|---|
0 | 0 | 0 | ||
1 | 0 | 0 | 0 | |
1 | 0 | 1 | 0 |
Столбец с переменной \(y\) содержит всего один ноль. Его можно разместить только в третьем столбце таблицы. Запишем
x | y | z | w | F |
---|---|---|---|---|
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 | 0 |
w | ? | ? | ? | F |
---|---|---|---|---|
1 | 0 | 0 | 0 | |
1 | 0 | 0 | 0 | |
1 | 0 | 1 | 0 |
Когда \(y = 0\) переменная \(z\) должна быть истинна. Такое возможно только если \( z \) разместить во втором столбце. Запишем
x | y | z | w | F |
---|---|---|---|---|
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 | 0 |
w | z | y | ? | F |
---|---|---|---|---|
1 | 0 | 0 | 0 | |
1 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 0 |
Переменная \(x\) занимает неподписанный столбец. Можно записать ответ: wzyx
Python. Подбираем ответ
# подключаем стандартные библиотеки
from itertools import permutations, product
# напишем функцию, которая получает переменные и возвращает результат функции
def F(x, y, z, w):
# обратите внимание на скобки вокруг not
return (x and (not y)) or (y == z) or (not w)
# заполним пропуски в таблице
# с помощью product рассмотрим все возможные варианты таблиц
for a1, a2, a3, a4 in product((0, 1), repeat=4):
table = (
(a1, a2, 0, 0),
(1, 0, a3, 0),
(1, 0, 1, a4),
)
# по условию задачи строки таблицы неповторяющиеся
# проверяем это условие
if len(table) == len(set(table)):
# рассматриваем все перестановки для переменных
for var in permutations('xyzw'):
# если при такой перестановке все строки дали нужный
# выводим ответ
if [F(**dict(zip(var, row))) for row in table] == [0, 0, 0]:
# звездочка нужна, чтобы не видеть лишних символов
print(*var)
После запуска кода сразу видим ответ на задачу. Записываем его без пробелов.