用SSA理解z3 bvsmod行为

用SSA理解z3 bvsmod行为,z3,Z3,我正在努力学习使用z3。所以这个问题可能很愚蠢 为什么在下面的代码中使用bvsmod与bvadd相比,会从Z3中得到x__0的意外值。我在这里使用SSA来实现执行流 Z3说明: (set-option :pp.bv-literals false) ; ; The code ; x %= 5 ; x * 2 == 8 ; Implement SSA ; x1 = x0 % 5 ; x1 * 2 == 8 ; (push) (set-info :status unknown) (declar

我正在努力学习使用z3。所以这个问题可能很愚蠢

为什么在下面的代码中使用bvsmod与bvadd相比,会从Z3中得到x__0的意外值。我在这里使用SSA来实现执行流

Z3说明:

(set-option :pp.bv-literals false)
;
; The code
;  x %= 5
;  x * 2 == 8
; Implement SSA
;  x1 = x0 % 5
;  x1 * 2 == 8
;
(push)
(set-info :status unknown)
(declare-const x___0 (_ BitVec 32))
(declare-const x___1 (_ BitVec 32))
(assert (= x___1 (bvsmod x___0 (_ bv5 32))))
(assert (= (bvmul x___1 (_ bv2 32)) (_ bv8 32)))
(check-sat)
(get-model)
(pop)
;
; The code
;  x += 1
;  x * 2 == 8
; Implement SSA
;  x1 = x0 + 1
;  x1 * 2 == 8
;
(push)
(declare-const x___0 (_ BitVec 32))
(declare-const x___1 (_ BitVec 32))
(assert (= x___1 (bvadd x___0 (_ bv1 32))))
(assert (= (bvmul x___1 (_ bv2 32)) (_ bv8 32)))
(check-sat)
(get-model)
(pop)
结果:

sat
(model 
    (define-fun x___1 () (_ BitVec 32)
        (_ bv4 32))
    (define-fun x___0 () (_ BitVec 32)
        (_ bv3720040335 32))
)
sat
(model 
    (define-fun x___1 () (_ BitVec 32)
        (_ bv4 32))
    (define-fun x___0 () (_ BitVec 32)
        (_ bv3 32))
)
在我使用bvadd x_uuu0的等式中,得到一个值3,这是有意义的


为什么在bvsmod的情况下,我会得到一个值3720040335,它与期望值(即以4结尾的某个值)不接近?

如果你想这样写公式,你需要量词。 我建议您使用SMT表达式;共享将免费进行。 写下例如:
(assert(((bvmul(bvmul)(bvadd x_uuuuuuu0(bv1 32))(bv2 32))(bv8 32)))


如果您需要中间值,您可以在以后执行(eval…)

获取的值没有问题。你的编码很好

请注意,您使用的是32位有符号整数(通过调用
bvsmod
隐式表示),返回的模型为您提供值32位向量值,其十进制等效值为
3720040335
。当解释为有符号值时,这实际上是
-574926961
,您可以按照要求验证
(-574926961)%5
是否确实等于
4


请注意,解算器可以自由地为您提供满足约束的任何模型。如果您想要一个更具体的值,您需要添加额外的约束来编码“simple”的正式含义。

谢谢。如果你能给出一个使用量词来解决这个问题的例子,这将是很有帮助的。我担心它对于我想要转换成SMT表达式的更大的C代码块来说太复杂了。使用SSA在两个方面帮助我。1.实现执行流。2.更容易将C代码转换为SMT表达式。我仍然想知道
bvsmod
的性质,它会导致我得到作为
(get model)
输出的值。我将添加这些约束<代码>(断言(bvslt x_uuuu0(bv5 32))和
(断言(bvsgt x_uuuu0(bv0 32))