我想使用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”。 有办法吗?
答案 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没有禁用特定重写规则的选项。