了解Z3 bvsmod行为我试图用Z3学习。所以这个问题可能很愚蠢。与SSA
为什么我得到一个意外的值从Z3 x___0当我使用bvsmod相比在下面的代码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得到一个值,这是有意义的情况。
为什么我会得到一个值在bvsmod的情况下,哪里没有接近预期值,即某个值以4结尾?
我会添加这些约束。 '(assert(bvslt x___0(_ bv5 32)))'and'(assert(bvsgt x___0(_ bv0 32)))''。 – Deepak