import itertools
def f(x, w, z, y):
# Реализация логической функции
# f = not (not (x -> w) and z) and not (w -> z) and (x -> not z)
return (not ((not (x <= w)) and z)) and (not (w <= z)) and (x <= (not z))
# Описываем фрагмент таблицы из условия
# None используется для пустых ячеек (пропусков)
# Формат: (столбец 1, столбец 2, столбец 3, столбец 4, значение F)
fragment = [
(1, 0, None, 0, 1),
(1, 0, None, None, 0),
(None, 1, None, 1, 0)
]
variables = ['x', 'w', 'z', 'y']
count_valid_permutations = 0
# Перебираем все возможные перестановки имен переменных для 4 столбцов
for p in itertools.permutations(variables):
success = True
# Для каждой перестановки пытаемся найти подходящие строки в полной таблице истинности
# Нам нужно сопоставить каждую строку фрагмента с какой-то строкой из 16 возможных
# Так как строк во фрагменте мало, проверим, существуют ли такие наборы x, w, z, y
matched_rows_for_fragment = []
# Генерируем все 16 комбинаций значений переменных
full_table = []
for x in range(2):
for w in range(2):
for z in range(2):
for y in range(2):
full_table.append({
'x': x, 'w': w, 'z': z, 'y': y, 'f': int(f(x, w, z, y))
})
# Проверяем, можно ли сопоставить строки фрагмента строкам из полной таблицы
possible_combinations = []
for row_f in fragment:
matching_rows = []
for row_t in full_table:
# Проверяем, совпадает ли значение F
if row_t['f'] != row_f[4]:
continue
# Проверяем, совпадают ли известные значения переменных в столбцах
match = True
for i in range(4):
if row_f[i] is not None:
# p[i] - это имя переменной в i-м столбце (напр. 'x')
if row_t[p[i]] != row_f[i]:
match = False
break
if match:
# Добавляем строку без значения F для проверки на уникальность наборов аргументов
matching_rows.append(tuple(row_t[v] for v in variables))
possible_combinations.append(matching_rows)
# Теперь нужно проверить, можно ли выбрать 3 РАЗЛИЧНЫХ строки из найденных вариантов
found_valid_match = False
for comb in itertools.product(*possible_combinations):
if len(set(comb)) == 3: # Все наборы аргументов должны быть уникальны
found_valid_match = True
break
if found_valid_match:
count_valid_permutations += 1
print(f"Количество подходящих способов расстановки: {count_valid_permutations}")