2017-02-09 6 views
2

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で終わる値はありません。

答えて

2

あなたが取得している値には何の問題もありません。あなたのエンコーディングは問題ありません。

bvsmodの呼び出しによって暗黙的に暗黙指定された32ビット符号付き整数が使用されていることに注意してください。返されるモデルは、小数の同等物が3720040335の値の32ビットビットベクトル値を提供します。符号付き値として解釈される場合、これは実際には-574926961であり、が実際に4と等しいことを確認することができます。

ソルバーは、制約を満たすモデルを自由に与えることができます。より具体的な値が必要な場合は、制約を追加して、「シンプル」が正式に意味するものをエンコードする必要があります。

+0

これらの制約を追加します。 '(assert(bvslt x___0(_ bv5 32)))'と '(assert(bvsgt x___0(_ bv0 32)))'を呼び出します。 – Deepak

0

このような数式を書きたい場合は、数量子が必要です。 代わりにSMT式を使用することをお勧めします。共有は無料で行われます。 例えばを書く: (assert (= (bvmul (bvadd x___0 (_ bv1 32)) (_ bv2 32)) (_ bv8 32)))

あなたは中間の値が必要な場合は、後でいつでも行うことができます(evalのを...)

+0

ありがとうございました。この問題を解決するために量指定子を使用する例を挙げることができれば役に立ちます。 – Deepak

+0

SMT式を推奨された方法で書き直すとここで動作します。私は、SMT式に変換したいCコードのブロックが大きすぎると複雑すぎるのではないかと心配しています。 SSAを使用すると、2つの方法でそこに役立ちます。 1.実行フローを実装します。 2.CコードのSMT発現への容易な変換。 – Deepak

+0

そして、私は 'bvsmod'の性質について疑問を抱いています。その結果、'(get-model) 'の出力として得られる値になります。 – Deepak

関連する問題