我正在使用Z3py尝试对舍入错误问题进行一些实验,事实证明我必须总结一个BitVec和一个Real。但是,当我尝试这样做时,我会收到“排序不匹配”错误。这是我的代码:
x = BitVecVal(8, 6)
y = Real('y')
solve(y + x == 5)
有没有办法对BitVec和Real进行求和?或者只是获取BitVec的Int值?
答案 0 :(得分:3)
您可以将位向量值转换为带符号的long:
x = BitVecVal(8, 6)
y = Real('y')
solve(y + x.as_signed_long() == 5)
# [y = -3]
顺便说一下,我通过检查as_signed_long
找到了y
,就像在Python中一样,即print dir(y)
。
答案 1 :(得分:3)
基于Z3 C的API确实包含从位向量到数字(整数)的转换函数,并且整数可以被强制转换为实数。 但是,python API不直接公开相关函数,但你可以将其包装起来:
x = BitVecVal(2,8)
y = Real('y')
def to_int(x):
return ArithRef(Z3_mk_bv2int(x.ctx_ref(), x.as_ast(), 0), x.ctx)
print solve(to_int(x) + y == 5)