我對量詞有疑問。量詞與非量詞
假設我有一個數組,我想計算數組索引0,1和2這個數組 -
(declare-const cpuA (Array Int Int))
(assert (or (= (select cpuA 0) 0) (= (select cpuA 0) 1)))
(assert (or (= (select cpuA 1) 0) (= (select cpuA 1) 1)))
(assert (or (= (select cpuA 2) 0) (= (select cpuA 2) 1)))
或者否則我可以使用forall構造作爲指定相同的 -
現在我想了解他們之間的區別。 第一種方法可以快速執行並提供簡單易讀的模型。 相比之下,第二個選項的代碼量非常少,但程序需要時間來執行。而且解決方案也很複雜。
我想使用第二種方法,因爲我的代碼會變得更小。 但是,我想找到一個可讀的簡單模型。
親愛的萊昂納多,我又回來同樣的問題。我正在嘗試優化座標解算器的代碼。你能告訴我什麼時候使用常量以及何時使用未解釋的函數是好的。例如,我的代碼中有大約30-40個未解釋的函數。當我將一些函數替換爲多個常量(例如(xA 0)替換爲xA0等等)時,我的運行時間減少了,但對於其他我沒有得到的。在它們之間進行選擇的關鍵規則是什麼?它依賴於你在代碼中使用它們多少? – Raj 2012-05-31 08:44:10
波動是表現是非常普遍的。即使我們進行小的修改,例如對斷言重新排序,我們也會觀察到波動。任何細微的修改都可能會改變Z3遍歷搜索空間的順序。作爲一個經驗法則,我們應該儘可能避免量詞。如果我們可以使用單一理論對問題進行編碼,我們通常會獲得更好的性能。當然,我們總是有例外。你觀察到什麼樣的性能波動?它是2倍,10倍,100倍的數量級? – 2012-05-31 18:41:22