我想用Z3來描述下面的問題。在Z3中,在數組理論中描述這個最有效的方法是什麼?
int []array1=new int[100];
int []array2=new int[100];
array1[0~99]={i0, i1, ..., i99}; (i0...i99 > 0)
array2[0~99]={j0, j1, ..., j99}; (j0...j99 < 0)
int i, j; (0<=i<=99, 0<=j<=99)
does array1[i]==array2[j]?
這是不可滿足的。
我用Z3到如下描述這個問題:
(declare-const a1 (Array Int Int))
(declare-const a2 (Array Int Int))
(declare-const a1f (Array Int Int))
(declare-const a2f (Array Int Int))
(declare-const x0 Int)
....
(declare-const x99 Int)
(assert (> x0 0))
....
(assert (> x99 0))
(declare-const y0 Int)
....
(declare-const y99 Int)
(assert (< y0 0))
....
(assert (< y99 0))
(declare-const i1 Int)
(declare-const c1 Int)
(assert (<= i1 99))
(assert (>= i1 0))
(declare-const i2 Int)
(declare-const c2 Int)
(assert (<= i2 99))
(assert (>= i2 0))
(assert (= a1f (store (store (store (store (store (store (store (store ........ 95 x95) 96 x96) 97 x97) 98 x98) 99 x99)))
(assert (= a2f (store (store (store (store (store (store (store (store ........ 95 y95) 96 y96) 97 y97) 98 y98) 99 y99)))
(assert (= c1 (select a1f i1)))
(assert (= c2 (select a2f i2)))
(assert (= c1 c2))
(check-sat)
是不是? 有沒有其他更有效的方法來描述這個使用數組理論? 我的意思是,更有效的方法需要更少的Z3解決時間。 謝謝。
感謝您的回覆。我還發現,如果我不使用量詞,則要花費超過100秒的時間才能找到長度爲200的數組的答案。如果數組元素的屬性不能用具有量詞的公式來描述,該怎麼辦?那麼Z3會使用蠻力搜索,對吧? –
我在基本符號執行中使用Z3。所以我認爲我應該使用Z3作爲約束求解器,並且我不能在公式中使用量詞,而不是在霍爾樣式驗證中使用。我想知道是否可以在符號執行中使用量詞,可能是自動或手動。 –