モデルの初期 'ソフト'値の指定方法は?この初期モデルは、同様のクエリを解決した結果であり、このモデルが正しい部分を持つか、または現在のクエリで真実である可能性があります。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
の初期値を指定していますか?
解決のインクリメンタルモードは、シーケンシャルと比較して遅いです。初期値を導入するより良い方法はありますか?
ああを照会することができ、興味深いですね!私が理解したように、あなたはモデルの等しい部分について細かい仮定をすることをお勧めします。しかし、これにより、さまざまな前提で多くの 'check-sat p..'呼び出しが行われる可能性があります。それは高価かもしれません(それはインクリメンタルなので疑問です)。私はこれを避け、Z3ヒューリスティックにモデルのどの部分を残すかを選択させようとしています。 'trans_assumed'と' trans_sought'が全く違っていればOKです!私はZ3が 'trans_assumed'で始まり、Z3が独自のヒューリスティックを使って_tweak_することができます。 Z3は 'trans_assumed'を微調整するか、まったく新しいもので開始しますか? – Ayrat
Z3は '(check-sat)'の新しいモデルを作成しますが、最初の '(check-sat p)'で学習された補題を再利用します。しかし、Z3が 'false'に' p'を代入すれば、 'p'に依存する任意の補題は自動的に無効になります。無作為化の使用もまた問題となる可能性があります。私はあなたが不安定な解決策で終わるかもしれないと思います(つまり、いつもうまくいくとは限りません)。 –