我正在尝试使用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结尾的值?
答案 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 ...)