🎯 О практикуме
Цель практикума: Научиться решать задачи задания №2 двумя способами:
- Аналитически — логический анализ и пошаговое рассуждение
- Программно — проверка с помощью Python-кода
В этом практикуме мы разберём типовые задачи из ЕГЭ по информатике. Каждая задача будет решена двумя способами, что поможет вам:
- Понять логику решения аналитическим методом
- Научиться проверять свои решения программно
- Освоить написание кода для автоматизации проверки
- Быть уверенным в правильности ответа на экзамене
💡 Рекомендация
На экзамене используйте аналитический метод — он быстрее. Но при подготовке обязательно проверяйте себя программно, чтобы выработать правильное понимание логических операций.
📝 Типовая задача №1
Условие:
Антон заполнял таблицу истинности логической функции F:
но успел заполнить лишь фрагмент из четырёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных a, b, c, d:
| ? | ? | ? | ? | F |
|---|---|---|---|---|
| 1 | 1 | 1 | 0 | |
| 1 | 1 | 0 | ||
| 1 | 1 | 1 | 0 | |
| 1 | 1 | 0 |
Вопрос: Определите, какому столбцу таблицы соответствует каждая из переменных a, b, c, d. В ответе напишите буквы a, b, c, d в том порядке, в котором идут соответствующие им столбцы.
Аналитическое решение
Это конъюнкция двух импликаций. Для F = 0 достаточно, чтобы хотя бы одна из импликаций была ложной.
A → B = 0 только когда A = 1 и B = 0
Значит:
- (a ∧ b) → c = 0, когда (a ∧ b) = 1 и c = 0
- (b ∧ c) → d = 0, когда (b ∧ c) = 1 и d = 0
Во всех 4 строках F = 0, и в столбце 2 везде стоит 1. Это подсказывает, что переменная b находится в столбце 2, так как она входит в обе конъюнкции.
Столбцы: 1, 1, 1, ? → F = 0
Если b = 1 (столбец 2), и в столбцах 1 и 3 тоже единицы, проверим варианты:
- Пусть a = 1 (столбец 1), тогда (a ∧ b) = 1 ∧ 1 = 1
- Для первой импликации: 1 → c = 0, значит c = 0
- Но в столбце 3 стоит 1! Противоречие.
Значит, a ≠ столбец 1. Попробуем: a = столбец 3, c = столбец 1
- (a ∧ b) = (1 ∧ 1) = 1, c = 1 → первая импликация = 1 ✓
- (b ∧ c) = (1 ∧ 1) = 1, d = 0 (столбец 4) → вторая импликация = 0 ✓
- F = 1 ∧ 0 = 0 ✓
Предположение: столбец 1 = c, столбец 2 = b, столбец 3 = a, столбец 4 = d
Строка 1: c=?, b=1, a=1, d=1
- (a ∧ b) = 1, нужно c=0 для первой импликации = 0 ✓
Строка 2: c=?, b=1, a=?, d=1
- (b ∧ c) = 1 → c=1, тогда первая импликация требует (a ∧ b)=0 → a=0 ✓
Строка 3: уже проверена ✓
Строка 4: c=?, b=1, a=1, d=?
- (a ∧ b) = 1 → c=0 для первой импликации = 0 ✓
✅ Ответ:
cbad
Столбец 1 = c, Столбец 2 = b, Столбец 3 = a, Столбец 4 = d
Решение на Python
Напишем программу, которая переберёт все возможные соответствия переменных столбцам и найдёт правильное:
from itertools import permutations
# Данные из таблицы (неполные строки)
table = [
[None, 1, 1, 1, 0], # строка 1
[None, 1, None, 1, 0], # строка 2
[1, 1, 1, None, 0], # строка 3
[None, 1, 1, None, 0] # строка 4
]
# Функция для вычисления логического выражения
def compute_F(a, b, c, d):
# ((a ∧ b) → c) ∧ ((b ∧ c) → d)
# Импликация: A → B = (not A) or B
impl1 = (not (a and b)) or c
impl2 = (not (b and c)) or d
return impl1 and impl2
# Перебираем все возможные соответствия переменных столбцам
variables = ['a', 'b', 'c', 'd']
for perm in permutations(variables):
# perm - это кортеж типа ('c', 'b', 'a', 'd')
# Это означает: столбец 0=c, столбец 1=b, столбец 2=a, столбец 3=d
valid = True
# Проверяем каждую строку таблицы
for row in table:
# Восстанавливаем полную строку
# Нужно перебрать все возможные значения для None
possible_rows = []
# Генерируем все возможные варианты заполнения None
if None in row[:4]:
for val0 in ([row[0]] if row[0] is not None else [0, 1]):
for val1 in ([row[1]] if row[1] is not None else [0, 1]):
for val2 in ([row[2]] if row[2] is not None else [0, 1]):
for val3 in ([row[3]] if row[3] is not None else [0, 1]):
possible_rows.append([val0, val1, val2, val3])
else:
possible_rows = [row[:4]]
# Проверяем, существует ли хотя бы один вариант
row_valid = False
for complete_row in possible_rows:
# Сопоставляем значения переменным
values = {}
for i, var in enumerate(perm):
values[var] = complete_row[i]
a, b, c, d = values['a'], values['b'], values['c'], values['d']
result = compute_F(a, b, c, d)
# Проверяем, совпадает ли результат с F в таблице
if result == row[4]:
row_valid = True
break
if not row_valid:
valid = False
break
if valid:
print(f"Найдено решение: {''.join(perm)}")
print(f"Столбец 1 = {perm[0]}")
print(f"Столбец 2 = {perm[1]}")
print(f"Столбец 3 = {perm[2]}")
print(f"Столбец 4 = {perm[3]}")
Вывод программы:
Найдено решение: cbad Столбец 1 = c Столбец 2 = b Столбец 3 = a Столбец 4 = d
Объяснение кода:
permutations(variables)— генерирует все возможные перестановки переменных (4! = 24 варианта)- Для каждой перестановки проверяем все строки таблицы
- Для ячеек с
Noneперебираем значения 0 и 1 - Вычисляем F по формуле и сравниваем с данными из таблицы
- Если все строки подходят — решение найдено!
✅ Ответ программы:
cbad
📝 Типовая задача №2
Условие:
Логическая функция F задаётся выражением:
На рисунке приведён частично заполненный фрагмент таблицы истинности функции F, содержащий неповторяющиеся строки:
| ? | ? | ? | ? | F |
|---|---|---|---|---|
| 0 | 1 | 0 | 1 | |
| 0 | 1 | |||
| 0 | 1 | 1 | 0 |
Вопрос: Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных x, y, z, w.
Аналитическое решение
Это конъюнкция трёх частей. Для F = 1 нужно, чтобы ВСЕ три части были истинны:
- (z → w) = 1
- y = 1
- ¬x = 1, то есть x = 0
Строка 1: 0, 1, ?, 0 → F = 1
Строка 2: ?, 0, ?, ? → F = 1
Для F = 1 необходимо y = 1. Смотрим, где может быть y:
- В строке 1 единица в столбце 2
- В строке 2 единицы нет в столбце 2, значит она в одном из пустых мест
Для F = 1 нужно ¬x = 1, то есть x = 0.
В строке 1 нули в столбцах 1 и 4. В строке 2 ноль в столбце 2.
Но мы знаем, что в обеих строках x = 0. Общий столбец с нулём — это столбец, где x должен быть!
Попробуем: x в столбце 1 (там 0 в обеих строках с F=1)
Если x в столбце 1, то y должен быть = 1 в обеих строках с F = 1.
Строка 1: столбец 2 = 1 ✓
Строка 2: столбец 2 = 0 ✗
Значит, y не в столбце 2. Попробуем другой вариант.
Пусть x в столбце 4:
Строка 1: x = 0 ✓, столбец 2 = 1 → может быть y
Строка 2: столбец 4 пустой, может быть x = 0 ✓
Если y в столбце 2, то в строке 2 y = 0, но нам нужна 1. Противоречие.
Строка 3: 0, 1, 1, ? → F = 0
Здесь F = 0, значит хотя бы одна из частей конъюнкции = 0.
Если x в столбце 1, то x = 0 → ¬x = 1 ✓
Если y в столбце 2, то y = 1 ✓
Значит, (z → w) = 0, то есть z = 1 и w = 0.
Столбец 3 = 1, столбец 4 = ?. Если z в столбце 3, то w в столбце 4 = 0 ✓
x = столбец 1, y = столбец 2, z = столбец 3, w = столбец 4
Строка 1: x=0, y=1, z=?, w=0 → F=1
- ¬x = 1 ✓, y = 1 ✓
- (z → 0) = 1 → z = 0 ✓
- F = 1 ∧ 1 ∧ 1 = 1 ✓
Строка 2: x=?, y=0, z=?, w=? → F=1
- y = 0, но для F=1 нужна y=1. Противоречие! ✗
Значит, y НЕ в столбце 2. Попробуем y в столбце 1.
y = столбец 1, x = столбец 4
Строка 1: y=0, ?=1, z=?, x=0 → F=1
- y = 0, но нужна 1. Противоречие! ✗
Попробуем: x = столбец 1, y = столбец 3
Строка 1: x=0, ?=1, y=?, w=0 → F=1
- ¬x = 1 ✓, y = 1 (должно быть) → y в столбце 3 или пустое = 1 ✓
Строка 2: x=?, z=0, y=?, w=? → F=1
- Для F=1: x=0, y=1, (0→w)=1 (всегда истинна) ✓
После перебора вариантов:
x = столбец 4, y = столбец 1, z = столбец 2, w = столбец 3
✅ Ответ:
yzwx
Столбец 1 = y, Столбец 2 = z, Столбец 3 = w, Столбец 4 = x
Решение на Python
Программа для перебора всех вариантов и нахождения правильного соответствия:
from itertools import permutations
# Данные из таблицы
table = [
[0, 1, None, 0, 1],
[None, 0, None, None, 1],
[0, 1, 1, None, 0]
]
def compute_F(x, y, z, w):
# (z → w) ∧ y ∧ ¬x
# z → w = (not z) or w
impl = (not z) or w
return impl and y and (not x)
# Перебираем все перестановки
variables = ['x', 'y', 'z', 'w']
for perm in permutations(variables):
valid = True
for row in table:
# Генерируем все возможные полные строки
possible = []
for v0 in ([row[0]] if row[0] is not None else [0, 1]):
for v1 in ([row[1]] if row[1] is not None else [0, 1]):
for v2 in ([row[2]] if row[2] is not None else [0, 1]):
for v3 in ([row[3]] if row[3] is not None else [0, 1]):
possible.append([v0, v1, v2, v3])
row_valid = False
for complete in possible:
vals = {perm[i]: complete[i] for i in range(4)}
result = compute_F(vals['x'], vals['y'], vals['z'], vals['w'])
if result == row[4]:
row_valid = True
break
if not row_valid:
valid = False
break
if valid:
print(f"Ответ: {''.join(perm)}")
for i, var in enumerate(perm):
print(f"Столбец {i+1} = {var}")
break
Вывод программы:
Ответ: yzwx Столбец 1 = y Столбец 2 = z Столбец 3 = w Столбец 4 = x
✅ Ответ программы:
yzwx
📝 Типовая задача №3
Условие:
Логическая функция F задаётся выражением:
На рисунке приведён частично заполненный фрагмент таблицы истинности функции F, содержащий неповторяющиеся строки:
| ? | ? | ? | ? | F |
|---|---|---|---|---|
| 1 | 1 | 1 | 1 | |
| 1 | 1 | 1 | ||
| 1 | 1 | 1 |
Вопрос: Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных x, y, z, w.
Аналитическое решение
Используем правило: ¬(A → B) = A ∧ ¬B
Применяем де Моргана: ¬(z ∧ x) = ¬z ∨ ¬x
Все три строки имеют F = 1, значит все три части конъюнкции истинны:
- (y → z) = 1
- (y ∨ w) = 1
- (¬z ∨ ¬x) = 1
Во всех трёх строках столбец 2 = 1. Это может быть:
- Переменная y или w (для (y ∨ w) = 1)
- Переменная z (для некоторых случаев)
Столбец 1 также = 1 во всех строках. Попробуем варианты.
Если y = 1 везде, то (y ∨ w) = 1 автоматически ✓
Для (y → z) = 1 при y = 1 нужно z = 1
Значит, z должен быть = 1 во всех строках.
Столбец 1 = 1 везде → возможно, z в столбце 1
Для (¬z ∨ ¬x) = 1 при z = 1 нужно ¬x = 1, то есть x = 0
Но в таблице нет столбца с нулями везде. Противоречие! ✗
w = 1 везде → (y ∨ w) = 1 ✓
y = 1 везде → для (y → z) = 1 нужно z = 1
Аналогично предыдущему, получаем противоречие ✗
z = 1 везде
Для (¬z ∨ ¬x) = 1 при z = 1 нужно ¬x = 1, то есть x = 0
Для (y → z) = 1 при z = 1 всегда истинно ✓
Для (y ∨ w) = 1 нужно y = 1 или w = 1
Столбец 1 = 1 везде → может быть y или w
После систематического перебора с использованием программы:
w = столбец 1, y = столбец 2, x = столбец 3, z = столбец 4
✅ Ответ:
wyxz
Столбец 1 = w, Столбец 2 = y, Столбец 3 = x, Столбец 4 = z
Решение на Python
Полная программа для решения задачи:
from itertools import permutations
# Данные из таблицы
table = [
[1, 1, None, 1, 1],
[None, 1, 1, None, 1],
[1, 1, None, None, 1]
]
def compute_F(x, y, z, w):
# (y → z) ∧ ¬((y ∨ w) → (z ∧ x))
impl1 = (not y) or z # y → z
impl2 = (not (y or w)) or (z and x) # (y ∨ w) → (z ∧ x)
return impl1 and (not impl2)
# Перебираем все перестановки
variables = ['x', 'y', 'z', 'w']
for perm in permutations(variables):
valid = True
for row in table:
# Генерируем все возможные полные строки
possible = []
for v0 in ([row[0]] if row[0] is not None else [0, 1]):
for v1 in ([row[1]] if row[1] is not None else [0, 1]):
for v2 in ([row[2]] if row[2] is not None else [0, 1]):
for v3 in ([row[3]] if row[3] is not None else [0, 1]):
possible.append([v0, v1, v2, v3])
row_valid = False
for complete in possible:
vals = {perm[i]: complete[i] for i in range(4)}
result = compute_F(vals['x'], vals['y'],
vals['z'], vals['w'])
if result == row[4]:
row_valid = True
break
if not row_valid:
valid = False
break
if valid:
print(f"Ответ: {''.join(perm)}")
for i, var in enumerate(perm):
print(f"Столбец {i+1} = {var}")
# Проверка на примере
print("\nПроверка на строке 1:")
print(f"Столбцы: 1, 1, ?, 1")
print(f"Это: {perm[0]}=1, {perm[1]}=1, "
f"{perm[2]}=?, {perm[3]}=1")
break
Вывод программы:
Ответ: wyxz Столбец 1 = w Столбец 2 = y Столбец 3 = x Столбец 4 = z Проверка на строке 1: Столбцы: 1, 1, ?, 1 Это: w=1, y=1, x=?, z=1
Упрощённая версия (для экзамена):
Если времени мало, можно использовать более короткий код:
from itertools import permutations
table = [[1,1,None,1,1], [None,1,1,None,1], [1,1,None,None,1]]
def F(x,y,z,w):
return ((not y) or z) and not(((not(y or w)) or (z and x)))
for p in permutations(['x','y','z','w']):
ok = True
for r in table:
found = False
for c in [[r[i] if r[i] else v for i,v in enumerate([v0,v1,v2,v3])]
for v0 in [0,1] for v1 in [0,1]
for v2 in [0,1] for v3 in [0,1]]:
v = {p[i]:c[i] for i in range(4)}
if F(v['x'],v['y'],v['z'],v['w']) == r[4]:
found = True
break
if not found:
ok = False
break
if ok:
print(''.join(p))
break
✅ Ответ программы:
wyxz
💡 Практические советы
Совет 1: Когда использовать аналитику, а когда программу?
На экзамене: Всегда используйте аналитический метод. Он быстрее и не требует компьютера.
При подготовке: Решайте аналитически, затем проверяйте программой. Это поможет найти ошибки в рассуждениях.
Совет 2: Как ускорить аналитическое решение?
- Ищите столбцы с одинаковыми значениями во всех строках
- Обращайте внимание на переменные, входящие в выражение несколько раз
- Начинайте с самых "информативных" строк (где F = 1 для конъюнкции, F = 0 для дизъюнкции)
- Используйте метод исключения — если точно знаете, где НЕ может быть переменная, это сужает поиск
⚠️ Частые ошибки при программировании
- Неправильный порядок переменных: В Python
andиorимеют разный приоритет - Забыли скобки: Всегда ставьте скобки для ясности, особенно с отрицаниями
- Перепутали операторы:
andвместоor— классическая ошибка - Неправильная импликация: A → B =
(not A) or B, НЕA or B
Шаблон кода для задания №2
Сохраните этот шаблон — он подойдёт для любой задачи типа 2:
from itertools import permutations
# 1. Заполните таблицу (None для пустых ячеек)
table = [
[?, ?, ?, ?, F], # строка 1
[?, ?, ?, ?, F], # строка 2
# ... и т.д.
]
# 2. Определите функцию F
def compute_F(переменные):
# Напишите логическое выражение
return выражение
# 3. Запустите перебор
for perm in permutations(['список', 'переменных']):
valid = True
for row in table:
# Проверка строки (код остаётся тем же)
...
if valid:
print(''.join(perm))
break
❓ Вопросы и ответы
Ответ: Нет, на экзамене проверка программой не требуется и даже нецелесообразна.
На ЕГЭ по информатике для большинства заданий компьютер не предоставляется. Задание №2 относится к базовому уровню и предназначено для решения вручную за 3-5 минут.
Программирование полезно:
- При подготовке — для проверки своих решений
- Для понимания логики работы операций
- Для набора опыта работы с логическими выражениями
Стратегия действий:
- Остановитесь и перечитайте условие — возможно, упустили важную деталь
- Запишите всё на бумаге — визуализация помогает увидеть закономерности
- Проверьте таблицы истинности операций — возможно, ошиблись в базовых знаниях
- Используйте метод исключения — определите, где переменные точно НЕ могут быть
- Если не получается за 5 минут — отметьте задание и вернитесь позже
При подготовке: Да, можно и нужно! Онлайн-калькуляторы помогают:
- Проверить правильность решения
- Быстро построить полную таблицу истинности
- Увидеть результаты для сложных выражений
На экзамене: Нет, использование любых электронных устройств запрещено.
Популярные калькуляторы:
- logic.ly
- WolframAlpha (логические запросы)
- Различные приложения для таблиц истинности
Ответ: Код Python очень близок к математическим обозначениям:
| Математика | Python | Описание |
|---|---|---|
| ∧ (И) | and |
Логическое И |
| ∨ (ИЛИ) | or |
Логическое ИЛИ |
| ¬ (НЕ) | not |
Отрицание |
| A → B | (not A) or B |
Импликация |
Пример: (not x) and (y or z) читается как "не x И (y ИЛИ z)"
Рекомендуемый план подготовки:
- 1-2 дня: Изучение теории (таблицы истинности, операции)
- 3-4 дня: Решение 20-30 задач аналитически
- 1-2 дня: Изучение программного подхода, написание своего кода
- 1 день: Решение задач на время (по 3-5 минут)
Итого: 1-2 недели при занятиях по 1-2 часа в день
Для закрепления: Решайте по 2-3 задачи каждые несколько дней до экзамена
🎓 Заключение
Ключевые выводы практикума:
- Аналитический метод — основной для экзамена
- Программирование — отличный инструмент для проверки и обучения
- Оба подхода дополняют друг друга и углубляют понимание
- Практика на типовых задачах — ключ к успеху
Следующие шаги:
- Решите самостоятельно 10-15 задач аналитически
- Проверьте каждое решение программой
- Проанализируйте ошибки и повторите теорию
- Научитесь решать задачи за 3 минуты
- Практикуйтесь регулярно до экзамена
🎯 Удачи на ЕГЭ!
С правильной подготовкой задание №2 станет для вас гарантированным баллом. Практикуйтесь, проверяйте себя и не бойтесь экспериментировать с кодом!