Z3:将int sort转换为bitvector

时间:2014-12-03 14:05:50

标签: int z3 smt bitvector

:变量x定义为int sort by (declare-const x Int)

有没有方法可以将x转换为bitvector排序?因为有时x涉及int理论无法处理的位操作,例如&,|,^。

我不想在开始时将变量x定义为位向量,因为我认为除了位操作之外,int理论支持的操作(例如+, - ,*,/)比bitvectors中支持的操作运行得快得多

实际上,我想将int sort转换为bitvector sort或vise vesa in demand。

感谢。

陈廷婷

1 个答案:

答案 0 :(得分:4)

是的,您可以使用bv2intint2bv之类的内容。请注意,位向量长度很重要,int2bv是参数化的(需要位向量长度)。

这是一个最小的例子(rise4fun链接:http://rise4fun.com/Z3/wxcp):

(declare-fun x () (_ BitVec 32))
(declare-fun y () Int)
(declare-fun z () (_ BitVec 16))
(assert (= y 129))
(assert (= (bv2int x) y))
; (assert (= ((_ int2bv 32) y) x)) ; try with this uncommented
(assert (= ((_ int2bv 16) y) z))
(check-sat)
(get-model)
(get-value (x y z)) ; gives ((x #x00000000) (y 129) (z #x0081))

另一个例子是:

Z3: an exception with int2bv

目前看来这些功能可能存在一些问题:Check overflow with Z3

其他解算器(bv2natnat2bv)中的其他名称也可能会调用它们:http://smtlib.cs.uiowa.edu/theories/FixedSizeBitVectors.smt2