:变量x定义为int sort by (declare-const x Int)
有没有方法可以将x转换为bitvector排序?因为有时x涉及int理论无法处理的位操作,例如&,|,^。
我不想在开始时将变量x定义为位向量,因为我认为除了位操作之外,int理论支持的操作(例如+, - ,*,/)比bitvectors中支持的操作运行得快得多
实际上,我想将int sort转换为bitvector sort或vise vesa in demand。
感谢。
陈廷婷答案 0 :(得分:4)
是的,您可以使用bv2int
和int2bv
之类的内容。请注意,位向量长度很重要,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))
另一个例子是:
目前看来这些功能可能存在一些问题:Check overflow with Z3
其他解算器(bv2nat
和nat2bv
)中的其他名称也可能会调用它们:http://smtlib.cs.uiowa.edu/theories/FixedSizeBitVectors.smt2