"simplify()" 函数的 Z3 (z3py) "elim_and" 选项始终为位向量启用

Z3 (z3py) "elim_and" option of the "simplify()" function always enabled for bit vectors

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

简化函数似乎存在一个名为 "elim_and" 的选项,但我无法让它用于按位运算。函数 help_simplify() 指出:

elim_and (bool) conjunctions are rewritten using negation and disjunctions (default: 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"。 有办法吗?

elim_and 适用于布尔表达式,不适用于 bit-vectors。恐怕 Z3 没有禁用特定重写规则的选项。

这目前是不可能的。请注意,elim_and 是针对布尔值的,而不是 bit-vectors:

>>> 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 的等效选项来控制 bit-vectors。事实上,析取的转换甚至发生在调用简化器之前,请参见此处:https://github.com/Z3Prover/z3/blob/master/src/ast/rewriter/bv_rewriter.cpp#L1980-L1988