Задание 2. Составление таблицы истинности логической функции
Функция zip() в Python
Функция zip()
в Python создает итератор, который объединяет элементы из нескольких источников данных. Эта функция работает со списками, кортежами, множествами и словарями для создания списков или кортежей, включающих все эти данные.
Уровень 2: Zip работает с любым количеством итерируемых объектов
Функция zip
в Python имеет дело с любым количеством итерируемых объектов одновременно.
Вот мы передаём в функцию zip
один список:
id = [1, 2, 3, 4]
record = zip(id)
print(list(record))
# [(1,), (2,), (3,), (4,)]
А как насчёт трёх списков?
id = [1, 2, 3, 4]
leaders = ['Elon Mask', 'Tim Cook', 'Bill Gates', 'Yang Zhou']
sex = ['male', 'male', 'male', 'male']
record = zip(id, leaders, sex)
print(list(record))
# [(1, 'Elon Mask', 'male'), (2, 'Tim Cook', 'male'), (3, 'Bill Gates', 'male'), (4, 'Yang Zhou', 'male')]
То есть неважно, сколько итерируемых объектов передаётся в функцию zip
: она в любом случае работает как надо.
Кстати, если аргумента нет, функция zip
возвращает пустой итератор.
Уровень 2: работа с неравными по длине аргументами
В реальности данные не всегда чистые и полные: иногда приходится иметь дело с неравными по длине итерируемыми объектами. По умолчанию результат функции zip
берётся по длине самого короткого итерируемого объекта.
id = [1, 2]
leaders = ['Elon Mask', 'Tim Cook', 'Bill Gates', 'Yang Zhou']
record = zip(id, leaders)
print(list(record))
# [(1, 'Elon Mask'), (2, 'Tim Cook')]
Так, в приведённом выше коде самый короткий список — это id
. Поэтому record
содержит только два кортежа, а два последних лидера в списке leaders
были отброшены.
Уровень 3: операция распаковывания
Если в предыдущем примере получить сначала record
, то как распаковать его на отдельные итерируемые объекты?
К сожалению, в Python нет функции распаковывания. Но если воспользоваться хитрыми приёмами звёздочек, распаковывание превращается в очень простую задачу.
record = [(1, 'Elon Mask'), (2, 'Tim Cook'), (3, 'Bill Gates'), (4, 'Yang Zhou')]
id, leaders = zip(*record)
print(id)
# (1, 2, 3, 4)
print(leaders)
# ('Elon Mask', 'Tim Cook', 'Bill Gates', 'Yang Zhou')
С помощью звёздочки здесь выполнена операция распаковки: распакованы все четыре кортежа из списка record
.
Уровень 4: Создание и обновление словарей
С помощью функции zip
очень просто создавать или обновлять dict
, задействуя отдельные списки.
id = [1, 2, 3, 4]
leaders = ['Elon Mask', 'Tim Cook', 'Bill Gates', 'Yang Zhou']
# создаём словарь, используя функцию «dict»
leader_dict_2 = dict(zip(id, leaders))
print(leader_dict_2)
# {1: 'Elon Mask', 2: 'Tim Cook', 3: 'Bill Gates', 4: 'Yang Zhou'}
Решение задач
Логическая функция F задаётся выражением:
¬ x v y v (¬ z ^ w)
На рисунке приведён фрагмент таблицы истинности функции F, содержащий все наборы аргументов, при которых функция F ложна. Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных x, y, z, w.
В ответе напишите буквы x, y, z, w в том порядке, в котором идут соответствующие им столбцы. Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.
yzwx
from itertools import *
def f(x,y,z,w): return not x or y or (not z and w)
t = [(0, 0, 0, 1), (0, 1, 0, 1), (0, 1, 1, 1)]
for p in permutations('xyzw'):
if [f(**dict(zip(p, r))) for r in t] == [0, 0, 0]:
print(p)
Логическая функция F задаётся выражением:
(x v y) -> (y = z)
На рисунке приведён частично заполненный фрагмент таблицы истинности функции F, содержащий неповторяющиеся строки. Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных x, y, z.
В ответе напишите буквы x, y, z в том порядке, в котором идут соответствующие им столбцы. Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.
zxy
from itertools import *
def f(x, y, z): return (x or y) <= (y == z)
for a1, a2, a3 in product((0, 1), repeat = 3):
t = [(0, 0, a1), (0, a2, a3)]
if len(t) == len(set(t)):
for p in permutations('xyz'):
if [f(**dict(zip(p, r))) for r in t] == [0, 0]:
print(p)
Домашнее задание
Логическая функция F задаётся выражением:
(x v y) ^ ¬(y = z) ^ ¬w
На рисунке приведён частично заполненный фрагмент таблицы истинности функции F, содержащий неповторяющиеся строки. Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных x, y, z, w.
В ответе напишите буквы x, y, z, w в том порядке, в котором идут соответствующие им столбцы. Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.
zyxw
Логическая функция F задаётся выражением
((x → z) → y) ∨ ¬w
Ниже приведён частично заполненный фрагмент таблицы истинности этой функции, содержащий неповторяющиеся строки.
Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных x, y, z, w.
В ответе напишите буквы x, y, z, w в том порядке, в котором идут соответствующие им столбцы. Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.
zxyw
Миша заполнял таблицу истинности логической функции
F = ¬ (x → y) ˅ (x ≡ z) ˅ w
но успел заполнить лишь фрагмент из трёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных x, y, z, w.
Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных x, y, z, w.
В ответе напишите буквы x, y, z, w в том порядке, в котором идут соответствующие им столбцы. Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.
xwzy
Логическая функция F задаётся выражением:
((x ≡ y) → (¬ z ˅ w)) ≡ ¬ ((w → x) ˅ (y → z))
Дан частично заполненный фрагмент, содержащий неповторяющиеся строки таблицы истинности функции F.
В ответе напишите буквы x, y, z, w в том порядке, в котором идут соответствующие им столбцы. Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.
wzyx
Логическая функция F задаётся выражением:
¬(x → w) ˅ (y → z) ˅ ¬y
Дан частично заполненный фрагмент, содержащий неповторяющиеся строки таблицы истинности функции F.
В ответе напишите буквы x, y, z, w в том порядке, в котором идут соответствующие им столбцы. Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.
yxwz
Логическая функция F задаётся выражением
¬(¬(x→¬w)∧z)∧¬(w→z)∧(x→¬z)
На рисунке приведён заполненный фрагмент таблицы истинности функции F, содержащий неповторяющиеся наборы аргументов
Определите, сколько существует различных способов расстановки переменных w,x,y,z подходящих для данной таблицы истинности?
Ответ: 8
Серёжа переписывал таблицу истинности логической функции F
((1≡w)≡(¬((w∧x)∨y)))→z
но успел перенести только фрагмент из пяти различных её строк, даже не указав, каким столбцам таблицы соответствуют переменные.
Определите, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.
В ответе напишите буквы w, x, y, z в том порядке, в котором идут соответствующие им столбцы (сначала буква, которая соответствует первому столбцу; затем буква, которая соответствует второму столбцу, и т. д.). Буквы в ответе пишите подряд, никаких разделителей между ними ставить не нужно.
Ответ: xzyw
Тестирование
Внимание. Прохождение теста доступно только один раз, результаты сохраните на свою электронную почту.