z3を使用して学習しようとしています。だからこの質問は愚かかもしれない。SS3でz3 bvsmodの動作を理解する
次のコードでbvsmodと比較してbvsmodを使用すると、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))
)
私は理にかなって値を取得x___0 bvadd使用方程式の場合。
bvsmodの場合、値がになるのはなぜですか?期待値に近くない値、つまり4で終わる値はありません。
これらの制約を追加します。 '(assert(bvslt x___0(_ bv5 32)))'と '(assert(bvsgt x___0(_ bv0 32)))'を呼び出します。 – Deepak