如何指定模型的初始「軟」值?此初始模型是解決類似查詢的結果,並且很可能此模型具有正確的部分,或者甚至可能對當前查詢爲真。指定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_sought
指定的初始值是trans_assumed
?
與順序相比,增量求解的模式較慢。任何更好的方法來引入初始值?
哦,聽起來很有趣!按照我的理解,你建議對相同的模型進行精細的假設。但是這可能導致許多帶有不同假設的'check-sat p..'調用。這可能是昂貴的(hm,因爲它是增量式的,所以值得懷疑)。我試圖避免這種情況,並讓Z3啓發式選擇模型的哪些部分應該保留。如果'trans_assumed'和'trans_sought'完全不同!我只想讓Z3以'trans_assumed'開頭,然後Z3可以使用自己的啓發式方法_tweak_。 Z3會調整'trans_assumed'還是開始一個全新的? – Ayrat 2012-03-28 10:47:21
Z3會爲'(check-sat)'創建一個新模型,但它會重新使用在第一個'(check-sat p)'中學到的引理。但是,如果Z3將'p'賦予'false',任何依賴於'p'的引理都將被自動禁用。隨機化的使用也可能是一個問題。我認爲你可能會以不穩定的解決方案結束(即它並不總是有效)。 – 2012-03-28 15:03:34