使用SSA了解z3 bvsmod行为

时间:2017-02-09 13:50:37

标签: z3

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

为什么在使用bvsmod时从Z3获取x___0的意外值,而不是以下代码中的bvadd。我在这里使用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___0得到一个值 3 ,这是有道理的。

为什么我在bvsmod的情况下获得值 3720040335 ,这是否接近预期值,即某些以4结尾的值?

2 个答案:

答案 0 :(得分:2)

你得到的价值没有错。你的编码就好了。

请注意,您使用的是32位有符号整数(通过调用bvsmod隐含暗示。)返回的模型为您提供值为32位的位向量值,其十进制等值为3720040335 。如果将其解释为有符号值,则实际为-574926961,您可以根据要求验证(-574926961) % 5确实等于4

请注意,解算器可以自由地为您提供满足约束条件的任何模型。如果你想要一个更具体的值,你需要添加额外的约束来编码“简单”应该正式意味着什么。

答案 1 :(得分:0)

如果你想写那样的公式,你需要量词。 我建议你改用SMT表达式;分享将免费发生。 写道: (assert (= (bvmul (bvadd x___0 (_ bv1 32)) (_ bv2 32)) (_ bv8 32)))

如果您需要中间值,您以后可以随时执行(eval ...)