Скилы по упрощению логических выражений пусть лучше лошадь развивает, у неё голова большая )))
Но раз уж тебе так приспичило - вот тренажер:
from random import choice
def scheme(n, m):
    """
    :param n: число входных аргументов, не более 26 (a..z)
    :param m: число логических операций, фигачь сколько влезет
    :return: строка с логическим выражением для упрощения
    """
    l, s = list('abcdefghijklmnopqrstuvwxyz'[:n]), ''
    while s.count('(') < m:
        op = choice(('not', 'and', 'or', '^'))
        s = f'(not {choice(l)})' if op == 'not' else f'({choice(l)} {op} {choice(l)})'
        l.append(s)
    return s
print(scheme(5, 10))
Вот проверялка, никакой обработки ошибок, всё по хардкору - извини:
import re
from itertools import product
def check(task, solution):
    """
    :param task: строка задачи
    :param solution: строка решения
    :return: эквивалентны ли они (bool)
    """
    args = sorted(set(re.findall(r'\b[a-z]\b', task)))
    chk = compile(f'({task})==({solution})', '<string>', 'eval')
    return all(eval(chk, {}, dict(zip(args, bulls)))
               for bulls in product((False, True), repeat=len(args)))
print(check('a and (b or not b)', 'a'))
print(check('a and (b or not b)', 'a ^ b'))
Не забудь рассказать об успехах.