Подтема 4 из 4
Решение программой
Как записать формулу на Python, перебрать все наборы и сопоставить вывод со строками фрагмента.
Что делает программа
Программа перебирает все наборы и печатает те, где F равна нужному значению. Это тот же список, который в подтеме 2 мы получали рассуждением, только без риска пропустить случай. Столбцы по этому списку подбирают так же, как в подтеме 3: программа их не расставляет.
Циклы, условия и печать объясняются в курсе Python, здесь — только их применение к таблице истинности.
Формула на Python
У каждой операции есть запись на Python; сравнения <= и == берут в скобки. Переменные принимают значения 0 и 1, для Python 0 — ложь, 1 — истина.
| Операция | На Python |
|---|---|
| ¬A | not A |
| A ∧ B | A and B |
| A ∨ B | A or B |
| A → B | (A <= B) |
| A ≡ B | (A == B) |
Почему стрелка — это <=: на 0 и 1 сравнение «меньше или равно» ложно только для 1 <= 0, то есть ровно на запрещённой паре импликации.
Тонкости:стрелка без сравнения
Ту же стрелку можно записать без сравнения, по правилу A → B = ¬A ∨ B: (not A) or B. Значения совпадают на всех четырёх парах — пригодится, если сомневаешься в скобках у <=.
Сравнения Python выполняет раньше, чем not, and и or. Поэтому без скобок смысл меняется: x and y == z вычисляется как x and (y == z), а не как (x ∧ y) ≡ z. Ещё коварнее запись x <= y == z: для Python это цепочка сравнений x <= y и y == z, а не (x → y) ≡ z. Правильно — (x <= y) == z.
Переводить формулу удобно по чек-листу:
- Замени знаки по таблице, сохранив все скобки формулы.
- Каждое
<=и==возьми в скобки вместе с его частями. - Отрицание скобки пиши как
not (…), с её скобками. - Проверь, что открывающих и закрывающих скобок поровну.
Формула задачи темы F = ¬x ∧ (y ∨ z) ∧ (z → w) на Python: F = (not x) and (y or z) and (z <= w).
Перебор наборов
Вложенные циклы перебирают все наборы, а if оставляет строки с нужным F. for x in (0, 1): выполняет свой блок дважды — с x = 0 и с x = 1. Если внутрь поместить второй цикл, он пройдёт оба значения при каждом значении первого: получатся пары 00, 01, 10, 11. Посмотри по шагам на импликации:
for a in (0, 1): for b in (0, 1): print(a, b, int(a <= b))Ноль печатается один раз — на паре 1, 0, как в таблице импликации. Для задачи темы нужны четыре — или один цикл с product, который выдаёт те же наборы:
print('x y z w')for x in (0, 1): for y in (0, 1): for z in (0, 1): for w in (0, 1): F = (not x) and (y or z) and (z <= w) if F == 1: print(x, y, z, w)from itertools import product print('x y z w')for x, y, z, w in product((0, 1), repeat=4): F = (not x) and (y or z) and (z <= w) if F == 1: print(x, y, z, w) выдаёт все четвёрки из нулей и единиц в том же порядке, что четыре цикла, а запись for x, y, z, w каждую четвёрку четырём именам.
print стоит внутри if, а if — внутри всех циклов: так проверяется каждый набор. Если сдвинуть print влево, строк напечатается меньше. Для наборов с F = 0 пиши if F == 0.
От вывода к ответу
Программа даёт наборы, а не ответ: столбцы подбирают по шагам подтемы 3. Вывод выше — те же четыре набора 0011, 0100, 0101, 0111, что в разборе по шагам.
Строки фрагмента сопоставляют с наборами по цифрам, а не по номерам: программа печатает наборы по порядку счёта, а строки фрагмента идут в любом порядке. Если вывод не совпал с ручным списком, первым делом проверь скобки у <= и ==.
Итого
- ¬, ∧, ∨
not,and,or - A → B
(A <= B)— в скобках - A ≡ B
(A == B)— в скобках - x <= y == zцепочка двух сравнений, а не (x → y) ≡ z
- Переборвложенные циклы или
product((0, 1), repeat=n) - Выводнаборы для подтемы 3; сопоставлять по цифрам
Проверьте себя
Ответь сначала сам, потом открой ответ.
x <= y == z. Найди значение его записи и правильной при x = y = z = 0.ОтветСкрыть ответ
(x <= y) == z: 0 <= 0 даёт True, а True == 0 — False. Запись ученика Python читает как 0 <= 0 и 0 == 0 — обе проверки истинны, результат True. Без скобок получилась другая формула.ОтветСкрыть ответ
F = (not (x <= y)) or (z == w): у стрелки и равнозначности свои скобки, отрицание — со своей скобкой.print стоит в самом внутреннем без if. Сколько строк она напечатает?ОтветСкрыть ответ
ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Сколько строк напечатает программа
Программа ниже должна напечатать восемь строк. Сколько строк она напечатает?
for x in (0, 1): for y in (0, 1): for z in (0, 1): F = (x or y) and (x <= z) print(x, y, z, int(F))Введите число.
Подсказка
Посмотри по отступу, внутри какого цикла стоит print.
Решение
4 строки: print стоит в теле второго цикла после третьего, поэтому печатается один раз на пару x, y — с последним значением z = 1.
Ответ: 4
Нули F программой
Напиши программу, которая печатает все наборы xyzw, при которых F = (x ∧ ¬y) ∨ (y ≡ z) ∨ ¬w равна 0.
Введите наборы через пробел в порядке возрастания, каждый — цифрами подряд.
Подсказка
Переведи формулу на Python и печатай наборы, где F == 0.
Решение
Программа печатает 0 0 1 1, 0 1 0 1, 1 1 0 1 — те же три набора 0011, 0101, 1101.
Ответ: 0011 0101 1101
Число единиц функции
Сколько наборов xyzw дают 1 для F = ((x → y) ∧ (y → w)) ∨ (z ≡ (x ∨ y))?
Введите число.
Подсказка
Посчитай программой наборы с F == 1 — или вычти из 16 число наборов с F = 0.
Решение
12 наборов: F = 0 только на 0100, 1000, 1001, 1100, остальные 16 − 4 = 12 дают 1.
Ответ: 12
Порядок столбцов: проверка программой
Логическая функция F задаётся выражением ¬(x ∨ ¬y) ∨ (z → w). Дан частично заполненный фрагмент, содержащий неповторяющиеся строки таблицы истинности функции F. Определи, какому столбцу соответствует каждая из переменных x, y, z, w. В ответе напиши буквы в том порядке, в котором идут соответствующие им столбцы.
| C1 | C2 | C3 | C4 | F |
|---|---|---|---|---|
| 0 | 0 | 0 | ||
| 1 | 1 | 0 | ||
| 1 | 1 | 0 |
Введите буквы переменных подряд, без пробелов, в порядке столбцов.
Подсказка
Напечатай программой наборы с F = 0: две переменные в них постоянны.
Решение
Программа печатает нулевые наборы 0010, 1010, 1110 (xyzw) — z = 1 и w = 0 всегда. Поэтому w в столбце без единиц, z — в столбце без нулей: это C1 и C3. Если C4 = y, строки 2 и 3 обе требуют набора 1110; значит, C4 = x, C2 = y.
Ответ: wyzx
Порядок столбцов: три множителя
Логическая функция F задаётся выражением (w → x) ∧ (y ∨ z) ∧ ¬(x ≡ y). Дан частично заполненный фрагмент, содержащий неповторяющиеся строки таблицы истинности функции F. Определи, какому столбцу соответствует каждая из переменных x, y, z, w. В ответе напиши буквы в том порядке, в котором идут соответствующие им столбцы.
| C1 | C2 | C3 | C4 | F |
|---|---|---|---|---|
| 1 | 1 | 1 | ||
| 1 | 1 | 1 | ||
| 1 | 1 | 1 |
Введите буквы переменных подряд, без пробелов, в порядке столбцов.
Подсказка
Напечатай программой наборы с F = 1. Строки 2 и 3 одинаковы в известных клетках — им нужны два разных набора.
Решение
F = 1 на 0100, 0110, 1010, 1011 (xyzw). Строки 2 и 3 одинаковы в известных клетках — нужны два разных набора с единицами в C3 и C4; так бывает только у пары x и z (1010 и 1011). Они заняты, поэтому строка 1 — 0110, где кроме z единица только у y: C1 = y, C4 = z, C3 = x, C2 = w.
Ответ: ywxz