z3Py:将BoolRef转换为一位BitVecRef

时间:2016-09-07 23:45:56

标签: python casting z3 z3py bitvector

是否可以将BoolRef转换为z3Py中的一位长BitVecRef?在我的设计中,要求从另外两个BitVecRef之间的比较中返回BitVecRef。这类似于将python bool投射到int。以下是其使用示例:

bv1, bv2, added = z3.BitVecs('bv1 bv2 added', 4)
res = z3.BitVec('res', 1)
s = z3.Solver()
s.add(res == (bv1 < bv2))
s.add(added == added + z3.ZeroExt(3, res))

这是理想的,但(bv1 < bv2)的类型为Boolref,并且会引发“排序不匹配”错误。有没有办法转换(bv1 < bv2)的结果,以便res可以断言它等于它?

1 个答案:

答案 0 :(得分:1)

位矢量无法自动转换为布尔值。通常的方法是将它们包含在if-then-elses中,例如,在本例中,而不是

s.add(res == (bv1 < bv2))

我们可以说

c = If(bv1 < bv2, BitVecVal(1, 1), BitVecVal(0, 1))
s.add(res == c)