Z3上的位向量算法

Z3上的位向量算法,z3,bitvector,Z3,Bitvector,我正在尝试使用Z3来解决使用位向量算法的算术方程。我想知道是否有一种方法可以同时处理实数。例如,如果我可以指定一个不同于#x1的常数,并改用实数 (set-option :pp.bv-literals false) (declare-const x (_ BitVec 4)) (declare-const y (_ BitVec 4)) (assert (= (bvadd x y) #x1)) (check-sat) (get-model) 是的,SMT库(和Z3)都完全支持实数: 您可以简单

我正在尝试使用Z3来解决使用位向量算法的算术方程。我想知道是否有一种方法可以同时处理实数。例如,如果我可以指定一个不同于#x1的常数,并改用实数

(set-option :pp.bv-literals false)
(declare-const x (_ BitVec 4))
(declare-const y (_ BitVec 4))
(assert (= (bvadd x y) #x1))
(check-sat)
(get-model)
是的,SMT库(和Z3)都完全支持实数:

您可以简单地编写以下示例:

(declare-const x Real)
(declare-const y Real)
(assert (= (+ x y) 1))
(check-sat)
(get-model)
您还可以混合/匹配
Int
/
Real
/
位向量
,只要所有内容都正确键入。下面是一个示例,演示如何同时使用Ints和REAL:

(declare-const a Int)
(declare-const b Int)
(declare-const c Int)
(declare-const d Real)
(declare-const e Real)
(assert (> e (+ (to_real (+ a b)) 2.0)))
(assert (= d (+ (to_real c) 0.5)))
(assert (> a b))
(check-sat)
(get-model)

然而,请注意,从位向量到整数的转换通常并不令人惊讶。请参见此处进行讨论:

感谢您的回复。你所说的是对的,不管怎样,对于“实”我不能使用逐位运算,但我必须使用位向量;只要所有的东西都打好了。请参阅更新的答案。可能是相关的。