К содержанию

Подтема 4 из 4

Решение программой

Как записать формулу на Python, перебрать все наборы и сопоставить вывод со строками фрагмента.

Что делает программа

Программа перебирает все наборы и печатает те, где F равна нужному значению. Это тот же список, который в подтеме 2 мы получали рассуждением, только без риска пропустить случай. Столбцы по этому списку подбирают так же, как в подтеме 3: программа их не расставляет.

Циклы, условия и печать объясняются в курсе Python, здесь — только их применение к таблице истинности.

Формула на Python

У каждой операции есть запись на Python; сравнения <= и == берут в скобки. Переменные принимают значения 0 и 1, для Python 0 — ложь, 1 — истина.

ОперацияНа Python
¬Anot A
A ∧ BA and B
A ∨ BA 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.

Переводить формулу удобно по чек-листу:

  1. Замени знаки по таблице, сохранив все скобки формулы.
  2. Каждое <= и == возьми в скобки вместе с его частями.
  3. Отрицание скобки пиши как not (…), с её скобками.
  4. Проверь, что открывающих и закрывающих скобок поровну.

Формула задачи темы 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))
0 0 1 0 1 1 1 0 0 1 1 1

Ноль печатается один раз — на паре 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)
x y z w 0 0 1 1 0 1 0 0 0 1 0 1 0 1 1 1
product
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)
x y z w 0 0 1 1 0 1 0 0 0 1 0 1 0 1 1 1

выдаёт все четвёрки из нулей и единиц в том же порядке, что четыре цикла, а запись 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; сопоставлять по цифрам

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Нужно вычислить (x → y) ≡ z. Ученик написал x <= y == z. Найди значение его записи и правильной при x = y = z = 0.
ОтветСкрыть ответ
Ответ
Правильная запись (x <= y) == z: 0 <= 0 даёт True, а True == 0 — False. Запись ученика Python читает как 0 <= 0 и 0 == 0 — обе проверки истинны, результат True. Без скобок получилась другая формула.
Вопрос 2
Запиши на Python формулу F = ¬(x → y) ∨ (z ≡ w).
ОтветСкрыть ответ
Ответ
F = (not (x <= y)) or (z == w): у стрелки и равнозначности свои скобки, отрицание — со своей скобкой.
Вопрос 3
В программе четыре вложенных цикла по 0 и 1, а print стоит в самом внутреннем без if. Сколько строк она напечатает?
ОтветСкрыть ответ
Ответ
16: внутренний блок выполняется для каждого набора, а наборов из четырёх цифр 2⁴ = 16.
Вопрос 4
Программа напечатала наборы 010, 011, 101, 111. Первая строка фрагмента — пустая, пустая, 0. Можно ли считать, что это набор 010, раз он напечатан первым?
ОтветСкрыть ответ
Ответ
Нет. Программа печатает наборы по порядку счёта, а строки фрагмента идут в любом порядке. Строку сопоставляют с набором по цифрам — так же, как в подтеме 3.

Практика

Для проверки ответов нужен 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))

Введите число.

Нули F программой

Напиши программу, которая печатает все наборы xyzw, при которых F = (x ∧ ¬y) ∨ (y ≡ z) ∨ ¬w равна 0.

Введите наборы через пробел в порядке возрастания, каждый — цифрами подряд.

Число единиц функции

Сколько наборов xyzw дают 1 для F = ((x → y) ∧ (y → w)) ∨ (z ≡ (x ∨ y))?

Введите число.

Порядок столбцов: проверка программой

Логическая функция F задаётся выражением ¬(x ∨ ¬y) ∨ (z → w). Дан частично заполненный фрагмент, содержащий неповторяющиеся строки таблицы истинности функции F. Определи, какому столбцу соответствует каждая из переменных x, y, z, w. В ответе напиши буквы в том порядке, в котором идут соответствующие им столбцы.

C1C2C3C4F
000
110
110

Введите буквы переменных подряд, без пробелов, в порядке столбцов.

Порядок столбцов: три множителя

Логическая функция F задаётся выражением (w → x) ∧ (y ∨ z) ∧ ¬(x ≡ y). Дан частично заполненный фрагмент, содержащий неповторяющиеся строки таблицы истинности функции F. Определи, какому столбцу соответствует каждая из переменных x, y, z, w. В ответе напиши буквы в том порядке, в котором идут соответствующие им столбцы.

C1C2C3C4F
111
111
111

Введите буквы переменных подряд, без пробелов, в порядке столбцов.