始终为位向量启用“ simplify()”功能的Z3(z3py)“ elim_and”选项

时间:2019-07-04 16:40:16

标签: z3 simplify z3py

我想使用z3py的simple()函数,但不将按位和'&'更改为按位或'|'。

简化函数似乎存在一个名为“ elim_and”的选项,但是我无法设法使其用于按位运算。函数help_simplify()指出:

  

elim_and(布尔)连接使用否定和取和(默认值:false)重写

>>> from z3 import *
>>> x = BitVec('x', 8)
>>> y = BitVec('y', 8)
>>> z = x & y
>>> z
x & y
>>> simplify(z)
~(~x | ~y)
>>> simplify(z, elim_and=False)
~(~x | ~y)

我希望结果为“ x&y”。 有办法吗?

2 个答案:

答案 0 :(得分:1)

目前无法实现。请注意,elim_and的对象是布尔值,而不是位向量:

>>> from z3 import *
>>> a = Bool("a")
>>> b = Bool("b")
>>> simplify(And(a, b))
And(a, b)
>>> simplify(And(a, b), elim_and=True)
Not(Or(Not(a), Not(b)))

没有与simplify等效的选项来控制位向量。实际上,甚至在调用简化程序之前,转换就已经进行了析取运算,请参见此处:https://github.com/Z3Prover/z3/blob/master/src/ast/rewriter/bv_rewriter.cpp#L1980-L1988

答案 1 :(得分:0)

elim_and用于布尔表达式,而不用于位向量。恐怕Z3没有禁用特定重写规则的选项。