: 变量 x 定义为 int 排序方式 (declare-const x Int)
有什么方法可以将 x 转换为位向量排序吗?因为有时 x 涉及到 int 理论无法处理的 &、|、^ 等位操作。
我不想在开始时将变量 x 定义为位向量,因为我认为 int 理论支持的操作(例如,+、-、*、/)除了位操作之外的运行速度比位向量中支持的操作快得多。
所以实际上,我想根据需要将 int 排序转换为位向量排序或 vesa 。
谢谢。
陈婷
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