1. Введение

Во втором задании ЕГЭ нужно работать с логическим выражением и фрагментом его таблицы истинности.

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

Задача — определить правильный порядок переменных.

Для выполнения задания нужно:

  • знать основные логические операции;
  • уметь переводить логическое выражение на Python;
  • понимать, как устроена таблица истинности;
  • сравнивать полученные наборы 0 и 1 с фрагментом из условия;
  • определять, какой столбец соответствует каждой переменной.

Самый удобный способ решения — небольшой перебор на Python: программа находит подходящие наборы, а мы сопоставляем их с таблицей.

1

Общий принцип решения задания №2

2. Решение задачи базовым кодом

Перед кодом нужно знать, как логические операции записываются в Python.

В математикеНазваниеВ Python
¬Отрицаниеnot
Конъюнкцияand
Дизъюнкцияor
Импликация<=
Эквиваленция==

Важно: <= можно использовать как импликацию, потому что в таблицах истинности переменные принимают значения 0 и 1.

Для четырёх переменных существует всего 2⁴ = 16 комбинаций, поэтому их удобно перебрать четырьмя циклами.

for x in 0, 1:
    for y in 0, 1:
        for z in 0, 1:
            for w in 0, 1:
                F = # выражение из условия
                if F == 0:
                    print(x, y, z, w)

Каждый цикл перебирает 0 и 1 для своей переменной. В строку F записываем выражение из условия, например:

F = ((x or y) <= z) or (y == w) or z

Если в таблице во всех строках F = 0, выводим только такие наборы. Если F = 1 — меняем проверку на if F == 1.

Пример вывода:

x y z w
0 1 0 0
1 0 0 1
1 1 0 0

После этого начинается главная часть: сопоставление полученных строк со столбцами таблицы из условия.

3. Как правильно расставить переменные в таблице?

Сначала ищем самые заметные признаки.

Полностью одинаковые значения

Если у переменной во всех найденных строках стоит только 0 или только 1, её столбец часто можно определить сразу.

Например, если z = 0 во всех строках, ищем столбец таблицы, который может целиком состоять из нулей.

Количество нулей и единиц

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

Используем уже найденные переменные

Не нужно определять всё одновременно. Нашли один столбец — фиксируем его и используем как опору для следующих строк. С каждым найденным соответствием количество вариантов уменьшается.

Не переносим вывод Python в таблицу слева направо: столбцы в условии стоят в неизвестном порядке.

Сначала ищем самый заметный столбец, затем определяем остальные.

4. Какие прототипы могут встретиться?

Принцип решения один и тот же:

получаем подходящие строки → сравниваем их с условием → определяем расположение переменных.

Отличается только сложность сопоставления.

1

Прототип 1. Базовый

Сложность: минимальная. Количество строк, выведенных программой, совпадает с количеством строк в условии — ничего отбрасывать не нужно.

Условие

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

F = ((x ∨ y) → z) ∨ (y ≡ w) ∨ z

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

1234F
01 0
1 100
1100

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

Для функции из условия используем код:

for x in 0, 1:
    for y in 0, 1:
        for z in 0, 1:
            for w in 0, 1:
                F = ((x or y) <= z) or (y == w) or z
                if F == 0:
                    print(x, y, z, w)

Получаем:

x y z w
0 1 0 0
1 0 0 1
1 1 0 0

Шаг 1. Находим z

В выводе Python в столбце z во всех трёх строках стоит 0. Значит в таблице из условия столбец z не может содержать ни одной известной единицы.

В 1-м столбце уже есть 1 во второй строке, во 2-м — единицы в первой и третьей строках, в 3-м — единицы во второй и третьей.

Только 4-й столбец не содержит известной единицы: там стоят пропуск, 0 и 0.

Поэтому 4-й столбец = z.

1

Почему 4-й столбец сразу определяется как z

Шаг 2. Используем вторую и третью строки

После того как 4-й столбец определён как z, во 2-й строке условия единицы стоят в 1-м и 3-м столбцах, а в 3-й строке — во 2-м и 3-м.

Среди результатов Python только две строки имеют по две единицы при z = 0:

1 0 0 1
1 1 0 0

В первой единицы стоят у x и w, во второй — у x и y.

Именно эти две строки должны соответствовать второй и третьей строкам условия.

3-й столбец равен 1 в обеих строках условия. В двух подходящих строках Python единственная переменная, равная 1 в обоих случаях, — x.

Поэтому 3-й столбец = x.

Шаг 3. Различаем w и y

Теперь остаются 1-й и 2-й столбцы — это w и y.

Возможны два варианта. Проверяем их по первой строке условия, где стоят 0 в 1-м столбце и 1 во 2-м.

Если 1-й = y, а 2-й = w, первая строка потребует y = 0 и w = 1.

Такой набор есть только в строке:

1 0 0 1

Но она уже должна использоваться второй или третьей строкой. Это нарушит условие о трёх различных строках.

Значит:

  • 1-й = w;
  • 2-й = y.

Первая строка тогда соответствует набору:

0 1 0 0

и все три строки различны.

1

Как из двух строк с двумя единицами получить x, а затем различить w и y

1 столбец → w
2 столбец → y
3 столбец → x
4 столбец → z

Ответ: wyxz

Короткий алгоритм

  1. Получить строки с нужным значением F.
  2. Найти столбец с постоянным значением.
  3. Сопоставлять не отдельные клетки, а целые строки и их наборы единиц.
  4. Если остаётся два варианта — проверить их по ещё не использованной строке.

Прототип 2. Лишние строки

Сложность: программа выводит больше подходящих строк, чем находится во фрагменте условия. Нужно определить, какие строки действительно используются, а какая остаётся лишней.

Условие

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

F = ¬(x ∨ y) ∧ ¬w ∨ ¬(z ∨ w) ∧ y

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

1234F
1 1
1 1
1 11

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

Программа выдаёт четыре строки:

x y z w
0 0 0 0
0 0 1 0
0 1 0 0
1 1 0 0

Шаг 1. Находим строку с двумя единицами

В третьей строке условия уже стоят две единицы: во 2-м и 4-м столбцах.

Среди результатов Python только одна строка вообще содержит две единицы:

1 1 0 0

Следовательно, третья строка условия соответствует:

x = 1
y = 1
z = 0
w = 0

Значит 2-й и 4-й столбцы — это x и y в неизвестном пока порядке.

1

Почему начинаем именно с третьей строки

Шаг 2. Находим z и w

После первого шага 1-й и 3-й столбцы должны быть z и w.

Во второй строке условия в 3-м столбце стоит 1.

Но в выводе Python w = 0 во всех четырёх строках. Поэтому 3-й столбец не может быть w.

Значит:

  • 3-й = z;
  • оставшийся 1-й = w.
1

Единица в 3-м столбце сразу отличает z от w

Шаг 3. Различаем x и y

Осталось определить 2-й и 4-й столбцы.

Предположим, что 2-й = x. Тогда в первой строке условия x = 1.

В выводе Python x = 1 только в строке:

1 1 0 0

Но эта строка уже используется третьей строкой условия.

Получились бы две одинаковые строки, а по условию все три строки различны.

Значит 2-й ≠ x.

1

Следовательно, 2-й = y, а 4-й = x.

Шаг 4. Убираем лишнюю строку

Теперь соответствия определены полностью:

  • 1-й = w;
  • 2-й = y;
  • 3-й = z;
  • 4-й = x.

Первая строка условия соответствует:

0 1 0 0

вторая:

0 0 1 0

третья:

1 1 0 0

Строка:

0 0 0 0

не понадобилась ни разу.

Именно она является лишней — мы не угадывали её заранее, она осталась после полного сопоставления.

Проверка x/y и определение лишней строки

1 столбец → w
2 столбец → y
3 столбец → z
4 столбец → x

Ответ: wyzx

Короткий алгоритм

  1. Начать с строки, где известно больше всего значений.
  2. После каждого найденного столбца сужать оставшиеся варианты.
  3. Обязательно учитывать, что строки из условия различны.
  4. Лишней считать только строку, которая не использовалась после полного сопоставления.

Прототип 3. В столбце F есть и 0, и 1

Сложность: во фрагменте одновременно встречаются F = 0 и F = 1. Поэтому нельзя вывести только одну группу строк — нужно рассматривать значения функции вместе с наборами переменных.

Условие

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

F = ¬(w → ¬(x → y)) ∧ (¬x → (¬y ≡ z))

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

1234F
1110
001
0 01

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

Выводим все комбинации вместе со значением F:

print('x y z w F')

for x in 0, 1:
    for y in 0, 1:
        for z in 0, 1:
            for w in 0, 1:
                F = (not (w <= (not (x <= y)))) and ((not x) <= ((not y) == z))
                print(x, y, z, w, int(F))

Шаг 1. Работаем только со строками F = 1

В условии две строки имеют F = 1. Поэтому сначала выписываем только результаты Python с F = 1:

x y z w
0 0 1 1
0 1 0 1
1 1 0 1
1 1 1 1

Во всех четырёх строках w = 1.

Значит в любой строке условия с F = 1 столбец w не может содержать известный 0.

В 1-м столбце есть 0 в третьей строке, в 3-м — 0 во второй строке, в 4-м — 0 сразу в обеих строках F = 1.

Только во 2-м столбце нет известного нуля.

Поэтому 2-й столбец = w.

1

Почему по строкам F = 1 сразу находится w

Шаг 2. Находим 4-й столбец

Во второй и третьей строках условия F = 1 и в 4-м столбце стоит 0.

Эти строки различны, поэтому выбранная переменная должна принимать 0 как минимум в двух разных строках F = 1.

4-й столбец не может быть y: среди строк F = 1 значение y = 0 встречается только один раз.

Проверим z.

При z = 0 подходят две строки:

0 1 0 1
1 1 0 1

В обеих y = 1.

Тогда известный 0 в 3-м столбце второй строки и известный 0 в 1-м столбце третьей строки пришлось бы оба объяснять переменной x.

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

Значит 4-й ≠ z.

Остаётся x.

Поэтому 4-й столбец = x.

1

Почему 4-й столбец не может быть y или z и остаётся x

Шаг 3. Различаем y и z

Теперь известно:

  • 2-й = w;
  • 4-й = x.

Для двух строк F = 1 с x = 0 остаются ровно два набора:

0 0 1 1
0 1 0 1

Поэтому 1-й и 3-й столбцы — это y и z, но их порядок пока неизвестен.

Используем первую строку условия, где F = 0 и стоят значения:

? 1 1 1

Предположим, что 3-й = y.

Тогда в этой строке:

x = 1
w = 1
y = 1

При z = 0 и при z = 1 функция даёт F = 1, а в условии F = 0.

Получаем противоречие.

Следовательно:

  • 3-й = z;
  • 1-й = y.

Первая строка становится:

y = 0
w = 1
z = 1
x = 1

то есть:

x = 1
y = 0
z = 1
w = 1

Для этого набора F действительно равно 0 — всё совпало.

1

Строка с F = 0 окончательно различает y и z

1 столбец → y
2 столбец → w
3 столбец → z
4 столбец → x

Ответ: ywzx

Короткий алгоритм

  1. Сначала разделить анализ по значениям F.
  2. Искать переменные с постоянным значением внутри одной группы.
  3. Проверять кандидатов на столбец по всем известным клеткам сразу.
  4. Если остаётся неоднозначность — использовать строку с другим значением F как дополнительную проверку.

5. Автокод

Задание можно решить полностью автоматически: программа сама заполнит пропуски, переберёт расположение переменных и проверит значения функции.

Условие

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

F = ¬(w → (x ≡ y)) ∧ (z → x)

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

1234F
0101
0 01
11 1

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

from itertools import *

def F(x, y, z, w):
    return (not(w <= (x == y))) and (z <= x)

for a1, a2, a3, a4, a5 in product([0, 1], repeat=5):
    table = ((a1, 0, 1, 0),
             (0, a2, a3, 0),
             (a4, 1, 1, a5))

    if len(set(table)) == len(table):
        for i in permutations('xyzw'):
            if [F(**dict(zip(i, line))) for line in table] == [1, 1, 1]:
                print(i)
1

Что делает каждая часть?

from itertools import *

Подключает функции для перебора вариантов.

def F(x, y, z, w):
    return (not(w <= (x == y))) and (z <= x)

Логическое выражение из условия записывается как функция Python.

for a1, a2, a3, a4, a5 in product([0, 1], repeat=5):

a1–a5 — пустые клетки. product() перебирает для них все комбинации из 0 и 1.

table = ((a1, 0, 1, 0),
         (0, a2, a3, 0),
         (a4, 1, 1, a5))

Это фрагмент таблицы из условия: известные значения оставляем, пропуски заменяем на a1, a2 и т. д.

if len(set(table)) == len(table):

Проверяет, что строки различны. set(table) удаляет повторы; если количество строк не изменилось, условие выполнено.

for i in permutations('xyzw'):

Перебирает все 24 возможных порядка переменных по четырём столбцам.

F(**dict(zip(i, line)))

Связывает столбцы с буквами и подставляет значения конкретной строки в функцию F.

if [F(**dict(zip(i, line))) for line in table] == [1, 1, 1]:

Проверяет значения F для всех строк. Список справа должен полностью совпадать со столбцом F из условия.

Если всё совпало, print(i) выводит найденный порядок переменных.

Ответ: yxwz

Видео разбор

В данном видео так-же есть разборы всех основных прототипов второй задачи