Z3:int2bv的一个例外

Z3:int2bv的一个例外,z3,Z3,我对由上述代码引起的异常“int2bv需要一个参数”感到困惑,如何正确使用函数int2bv?这是因为int2bv是一个参数函数,这些函数的SMT2语法是(uf p1 p2…),因此在这种情况下正确的语法是 (declare-const a Int) (declare-const b Int) (declare-const c (_ BitVec 32)) (declare-const d (_ BitVec 32)) (assert (= b (bv2int c))) (assert (= c

我对由上述代码引起的异常“int2bv需要一个参数”感到困惑,如何正确使用函数int2bv?

这是因为int2bv是一个参数函数,这些函数的SMT2语法是(uf p1 p2…),因此在这种情况下正确的语法是

(declare-const a Int)
(declare-const b Int)
(declare-const c (_ BitVec 32))
(declare-const d (_ BitVec 32))

(assert (= b (bv2int c)))
(assert (= c (int2bv a)))

(check-sat)
注意,int2bv基本上被视为未解释的;API文档说明:


“注意,此函数本质上被视为未解释。因此,在使用此函数解决约束时,您不能期望Z3精确反映此函数的语义。”(from)

问题在于
int2bv
需要一个大小(创建的新位向量的长度对应于整数)。但是,用于指定此(
(assert(=c(int2bv[32]a))
的旧语法(例如,将
a
转换为32位长的位向量)会出现错误
意外字符
(例如:),因此语法可能已更改。下面是一个旧用法的示例:
((_ int2bv 32) a)