В общем, вы не можете ожидать, что z3 выполнит такие упрощения, поскольку то, что вы считаете «простым», и то, что оно считает «простым», может сильно различаться.
Сказав это, вы можете запустить help_simplify()
и это покажу вам все варианты simplify
поддерживает. Из того, что я вижу, нет правила, которое бы помогло в вашем случае.
Обратите внимание, что решатели SMT на самом деле не предназначены для такого рода упрощения на уровне пользователя. Более традиционным было бы спросить z3, является ли то, что вы считаете упрощенной формой, действительно эквивалентным. В вашем случае что-то вроде:
from z3 import *
x, y = Bools('x y')
f = Or(Not(y), And(y, Not(x)))
g = Or(Not(y), Not(x))
prove(f == g)
На что отвечает z3:
proved