Загрузка данных


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}")