如何用Z3将Or(不是(y)和(y,不是(x))简化为Or(不是(y),不是(x))?

如何用Z3将Or(不是(y)和(y,不是(x))简化为Or(不是(y),不是(x))?,z3,z3py,Z3,Z3py,我尝试使用Z3将~y或(y,~x)简化为~y或~x,但似乎无法实现,即使在我使用策略ctx解算器简化时也是如此。下面是演示我所做工作的Python代码。你知道如何实现这一目标吗?谢谢 sage: x,y = z3.Bools('x y') sage: f = Or(Not(y), And(y, Not(x))) sage: simpl = Tactic('ctx-solver-simplify') sage: simpl = z3.TryFor(simpl, 300000) sage: simp

我尝试使用Z3将
~y或(y,~x)
简化为
~y或~x
,但似乎无法实现,即使在我使用策略
ctx解算器简化时也是如此。下面是演示我所做工作的Python代码。你知道如何实现这一目标吗?谢谢

sage: x,y = z3.Bools('x y')
sage: f = Or(Not(y), And(y, Not(x)))
sage: simpl = Tactic('ctx-solver-simplify')
sage: simpl = z3.TryFor(simpl, 300000)
sage: simpl(f).as_expr()
Or(Not(y), And(y, Not(x)))   # cannot simplify

一般来说,你不能期望Z3执行你认为的“简单”的简化,而它认为“简单”可以大大不同。

话虽如此,您可以运行
help\u simplify()
,它将显示所有
simplify
支持的选项。据我所知,这里面没有一条规则能帮助你解决这个问题

请注意,SMT解算器并不是为这种“用户级”简化而设计的。一个更传统的做法是问Z3如果你认为一个简化的形式确实是等价的。在您的情况下,类似于:

从z3导入*
x、 y=布尔值('x y')
f=或(不是(y)和(y,不是(x)))
g=或(非(y),非(x))
证明(f==g)
z3对此作出回应:

proved

一般来说,你不能期望Z3执行你认为的“简单”的简化,而它认为“简单”可以大大不同。

话虽如此,您可以运行
help\u simplify()
,它将显示所有
simplify
支持的选项。据我所知,这里面没有一条规则能帮助你解决这个问题

请注意,SMT解算器并不是为这种“用户级”简化而设计的。一个更传统的做法是问Z3如果你认为一个简化的形式确实是等价的。在您的情况下,类似于:

从z3导入*
x、 y=布尔值('x y')
f=或(不是(y)和(y,不是(x)))
g=或(非(y),非(x))
证明(f==g)
z3对此作出回应:

proved

Z3拥有强大的机制来寻找解决方案,但这一切都在幕后

,Python的符号数学库更适合于简化
srepr()
可用于显示内部格式。默认情况下,布尔运算符显示为
&
|
~
。您还可以直接使用这些符号来编写表达式

从sympy导入符号,或、非和、srepr
x、 y=符号('x y')
f=或(不是(y)和(y,不是(x))#或f=~y |(y&~x)
打印(f)#~y |(y&~x)
打印(f.simplify())#~x |~y
打印(srepr(f))#或(非(符号('y'))和(符号('y')、非(符号('x')))
打印(srepr(f.simplify())#或(Not(Symbol('x')),Not(Symbol('y'))

Z3拥有强大的机制来寻找解决方案,但这一切都在幕后

,Python的符号数学库更适合于简化
srepr()
可用于显示内部格式。默认情况下,布尔运算符显示为
&
|
~
。您还可以直接使用这些符号来编写表达式

从sympy导入符号,或、非和、srepr
x、 y=符号('x y')
f=或(不是(y)和(y,不是(x))#或f=~y |(y&~x)
打印(f)#~y |(y&~x)
打印(f.simplify())#~x |~y
打印(srepr(f))#或(非(符号('y'))和(符号('y')、非(符号('x')))
打印(srepr(f.simplify())#或(Not(Symbol('x')),Not(Symbol('y'))