2012-03-26 9 views
2

モデルの初期 'ソフト'値の指定方法は?この初期モデルは、同様のクエリを解決した結果であり、このモデルが正しい部分を持つか、または現在のクエリで真実である可能性があります。Z3の初期モデル値の指定

は現在、私は、増分解決やhard/soft constraintsでこれをシミュレートしています:

(define-fun trans_assumed ((a Int)) Int 
; an initial model, which may be (partially) true 
) 

(declare-fun trans_sought ((a Int)) Int) 

(declare-const p Bool) 
(assert (=> p (forall ((a Int)) (= (trans_assumed a) (trans_sought a))))) 
(check-sat p) ; in hope that trans_assumed values will be used as initial below 

; add here the main constraints for trans_sought function 

(check-sat) ; Z3 will use trans_assumed as a starting point for trans_sought 

これは本当にtrans_assumedするtrans_soughtの初期値を指定していますか?

解決のインクリメンタルモードは、シーケンシャルと比較して遅いです。初期値を導入するより良い方法はありますか?

答えて

2

これは良いアプローチだと思っていますが、より多くのブール変数を使用することを検討することもできます。今、それは「すべて」または「何もない」アプローチです。あなたのスクリプトで、(check-sat p)が実行されると、Z3はtrans_assumedtrans_soughtが同じ解釈を持つモデルを探します。そのようなモデルが存在しない場合は、pを含むunsatコアを返します。 (check)が実行されるとき、Z3はpfalseに割り当てることが自由であり、ユニバーサル量限定子は本質的に無関心である。つまり、trans_assumedtrans_soughtは全く異なる場合があります。

複数のブール変数を使用してtrans_soughtの解釈を制御すると、柔軟性が増します。 問題の残りの部分が数量化されていない場合は、汎用量子を削除することを検討する必要があります。これは、有限個の点でtrans_soughtの値だけを気にしている場合に実行できます。

trans_assumed(0) = 1trans_assumed(1) = 10があるとします。その後、我々は書くことができます。このエンコーディングで

assert (=> p0 (= (trans_sought 0) 1))) 
assert (=> p1 (= (trans_sought 1) 10))) 

を、私たちは(check-sat p0 p1)(check-sat p0)(check-sat p1)

+0

ああを照会することができ、興味深いですね!私が理解したように、あなたはモデルの等しい部分について細かい仮定をすることをお勧めします。しかし、これにより、さまざまな前提で多くの 'check-sat p..'呼び出しが行われる可能性があります。それは高価かもしれません(それはインクリメンタルなので疑問です)。私はこれを避け、Z3ヒューリスティックにモデルのどの部分を残すかを選択させようとしています。 'trans_assumed'と' trans_sought'が全く違っていればOKです!私はZ3が 'trans_assumed'で始まり、Z3が独自のヒューリスティックを使って_tweak_することができます。 Z3は 'trans_assumed'を微調整するか、まったく新しいもので開始しますか? – Ayrat

+1

Z3は '(check-sat)'の新しいモデルを作成しますが、最初の '(check-sat p)'で学習された補題を再利用します。しかし、Z3が 'false'に' p'を代入すれば、 'p'に依存する任意の補題は自動的に無効になります。無作為化の使用もまた問題となる可能性があります。私はあなたが不安定な解決策で終わるかもしれないと思います(つまり、いつもうまくいくとは限りません)。 –