瞭解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