Teacher & coder

Задача № 85

Миша заполнял таблицу истинности логической функции \( F \)

\[ (x \land ¬y) \lor (y ≡ z) \lor ¬w, \]

но успел заполнить лишь фрагмент из трёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных \( w \), \( x \), \( y \), \( z \).

????F
000
1000
1010

Определите, какому столбцу таблицы соответствует каждая из переменных \( w \), \( x \), \( y \), \( z \).

В ответе напишите буквы \( w \), \( x \), \( y \), \( z \) в том порядке, в котором идут соответствующие им столбцы (сначала буква, соответствующая первому столбцу; затем буква, соответствующая второму столбцу, и так далее). Буквы в ответе пишите подряд, никаких разделителей мужду буквами ставить не нужно.

Пример. Функция \( F \) задана выражением \( ¬x \lor y \), зависящим от двух переменных, а фрагмент таблицы имеет следующий вид.

??F
010

В этом случае первому столбцу соответствует переменная \( y \), а второму столбцу - переменная \( x \). В ответе следует написать: \( yx \).

Можно скопировать и вставить все ответы сразу
Демонстрационный вариант 2024 года
Прокрути, чтобы прочитать решение задачи
Ты уверен, что хочешь это сделать?
Удачного чтения!

Решение

Алгоритмов решения такого задания много. От аналитических способов до полного перебора на компьютере. Рассмотрим три способа решения задачи.

Рассуждаем. Аналитический способ

Посмотрим на логическое выражение и таблицу истинности. Мы рассматриваем только ложные случаи дизъюнкции. Дизъюнкция «ИЛИ» ложна только тогда, когда ложны все высказывания.

\((x \land ¬y)\) \(\lor\) \((y ≡ z)\) \(\lor\) \(¬w\)

????F
000
1000
1010

Получается, что каждое из высказываний должно быть ложно и мы можем их рассматривать отдельно. Перепишем логическое выражение.

\[\begin{cases} x \land ¬y = 0\\ y ≡ z = 0 \\ ¬w = 0 \end{cases}\]

Начнём с выражения, которое содержит только одну переменную: \( ¬w \). Чтобы оно было всегда ложно, \( w \) должно быть всегда истинно. Такое возможно только в первом столбце таблицы. Заполним

w???F
1000
1000
1010

Далее рассмотрим выражение \( y ≡ z \). Между переменными эквиваленция. Она ложна, когда \(y\) и \(z\) разные по значению. Такое возможно во втором и третьем столбце таблицы. Получается, что четвёртый столбец — это \(x\). Заполним

w??xF
11000
10100
1010

Все строки в таблицы должны быть различные. Посмотрим на две последние строки. Чтобы они не совпадали, \(x\) должен быть равен 1. Заполним

w??xF
11000
10100
10110

Рассмотрим первое выражение \( x \land ¬y \) и последнюю строку таблицы. Конъюнкция «И» ложна, когда ложно хотя бы одно из высказываний. Если \( x = 1 \), то \( ¬y \) должен быть равен нулю. Значит \( y = 1 \). Такое выполняется в третьем столбце. Заполним

w?yxF
11000
10100
10110

Последняя переменная занимает неподписанный столбец. Можно записать ответ: 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)

Запустим код и получим таблицу истинности.

xyzwF
00110
01010
11010

Сопоставим таблицы. Столбец из всех единиц можно разместить только первым.

xyzwF
00110
01010
11010
????F
000
1000
1010

Столбец с переменной \(y\) содержит всего один ноль. Его можно разместить только в третьем столбце таблицы. Запишем

xyzwF
00110
01010
11010
w???F
1000
1000
1010

Когда \(y = 0\) переменная \(z\) должна быть истинна. Такое возможно только если \( z \) разместить во втором столбце. Запишем

xyzwF
00110
01010
11010
wzy?F
1000
10100
1010

Переменная \(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)

После запуска кода сразу видим ответ на задачу. Записываем его без пробелов.

Артём Зинкин

Лучше не гуглить и подумать самостоятельно. Тест можно пройти несколько раз :)
Чтобы поделиться задачей с коллегами или друзьями, отправьте им ссылку :)
Забыл сказать, что у этой задачи есть подробное решение. Посмотрите его :)
Попробуйте решить эту задачу сами и посмотрите наши разборы похожих задач :)
Кстати, на ЕГЭ тоже нельзя копировать :)
Этим материалом удобно поделиться по прямой ссылке :)