简化涉及有限域中变量的表达式

时间:2015-03-10 18:31:02

标签: z3 simplify z3py

ctx-solver-simplify策略仅适用于bool变量,那么我如何处理有限域上的变量(例如,使用哪种策略)?例如,如果z只能获得3个值0,1,2,那么如何将Or(z==0,z==1,z==2)简化为true

此外,即使对于bool表达式,策略ctx-solver-simplify也不会完全简化。例如:

x,y,z = z3.Bools('x y z')
c1 = z3.And(x==True,y==True,z==True)
c2 = z3.And(x==True,y==True,z==False)
c3 = z3.And(x==True,y==False,z==True)
c4 = z3.And(x==True,y==True,z==False)
z3.Tactic('ctx-solver-simplify')(z3.Or([c1,c2,c3,c4]))
[[Or(And(x, z), And(x == True, y == True, z == False))]]

如何获得And(x, Or(z, y))之类的内容?

谢谢!

1 个答案:

答案 0 :(得分:0)

将布尔(或其他有限域)问题简化为最小形式是一个难题。 ctx-solver-simplify策略是更昂贵的简化器之一,但它并没有一直到可证明最小的形式。

来自其他域的问题(例如,{0,1,2}中的z \等枚举)必须首先转换为布尔值以使用此策略,但也许其他策略可能更适合,也许有点 - 矢量编码也有帮助。