如何 zero/sign 在 Z3 中扩展位向量?

How to zero/sign extend bitvectors in Z3?

我无法使用 Z3 SMT 接口对位向量执行零扩展。从我通过阅读资源了解到的情况来看,有一些函数可以用于各种绑定(C、C++、Python 等),但是 SMT 接口的教程没有给出如何调用的线索他们。

使用 SMT QF_BV 逻辑标准中的 zero_extend 也无济于事 - Z3 说 unsupported.

原来zero_extend和其他一些函数是参数的,可能类似于C++中的foo<T>。要调用此类函数,需要使用特殊语法:

(declare-const a (_ BitVec 1))
(declare-const b (_ BitVec 2))
(assert (= b ((_ zero_extend 1) a)))
(check-sat)
(get-model)

使用 ((_ zero_extend i) x) 而不是 (zero_extend i x) 给出正确的结果:

sat
(model
  (define-fun a () (_ BitVec 1) #b0)
  (define-fun b () (_ BitVec 2) #b00)
)