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