2012-03-26 55 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_sought指定的初始值是trans_assumed

與順序相比,增量求解的模式較慢。任何更好的方法來引入初始值?

回答

2

我認爲這是一個很好的方法,但是你可以考慮使用更多的布爾變量。現在,這是一個「全部」或「無」的方法。在你的腳本中,當執行(check-sat p)時,Z3將尋找一個模型,其中trans_assumedtrans_sought具有相同的解釋。如果這種模型不存在,它將返回包含p的不含核心。當執行(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..'調用。這可能是昂貴的(hm,因爲它是增量式的,所以值得懷疑)。我試圖避免這種情況,並讓Z3啓發式選擇模型的哪些部分應該保留。如果'trans_assumed'和'trans_sought'完全不同!我只想讓Z3以'trans_assumed'開頭,然後Z3可以使用自己的啓發式方法_tweak_。 Z3會調整'trans_assumed'還是開始一個全新的? – Ayrat 2012-03-28 10:47:21

+1

Z3會爲'(check-sat)'創建一個新模型,但它會重新使用在第一個'(check-sat p)'中學到的引理。但是,如果Z3將'p'賦予'false',任何依賴於'p'的引理都將被自動禁用。隨機化的使用也可能是一個問題。我認爲你可能會以不穩定的解決方案結束(即它並不總是有效)。 – 2012-03-28 15:03:34