SMTLIBアレイを使用している間、私はZ3の理論と鉱山の理解の違いに気づいた。私は公式サイト[1]にあるSMTLIBアレイ理論[0]を使用しています。SMTLIBアレイ理論Z3の奇妙さ
私の問題は、単純な例で最もよく説明されていると思います。
(store (store (store ((as const (Array Int Int)) 0) 0 1) 1 2) 0 0)
(store (store ((as const (Array Int Int)) 0) 0 1) 1 2)
最初の配列は、他のすべてのインデックスのインデックス1と0 2を返す必要があり、第二は、すべての他の指標のインデックス1、及び0のインデックス0、2に1を返すべきです。インデックス0 select
を呼び出すと、これを確認しているようだ:
(assert
(=
(select (store (store (store ((as const (Array Int Int)) 0) 0 1) 1 2) 0 0) 0)
0
)
)
(assert
(=
1
(select (store (store ((as const (Array Int Int)) 0) 0 1) 1 2) 0)
)
)
Z3は、両方のためのsat
を返します。予想通り
(assert
(=
(select (store (store (store ((as const (Array Int Int)) 0) 0 1) 1 2) 0 0) 0)
(select (store (store ((as const (Array Int Int)) 0) 0 1) 1 2) 0)
)
)
、Z3は(それは、私は、Linux-AMD64上のバージョン3.2を使用しています重要な場合には)、この場合にunsat
に答えます。次は、これら二つの配列を比較してみましょう:
(assert
(=
(store (store (store ((as const (Array Int Int)) 0) 0 1) 1 2) 0 0)
(store (store ((as const (Array Int Int)) 0) 0 1) 1 2)
)
)
Z3は、私は、「これら二つの配列の比較結果が等しく」と解釈され、sat
私に語りました。しかし、私はこれらの配列が等価でないと予想します。私が言うSMTLIBアレイ理論、でこれを基礎:
- (forall ((a (Array s1 s2)) (b (Array s1 s2)))
(=> (forall ((i s1)) (= (select a i) (select b i)))
(= a b)))
ので、平易な英語で、このようなものを意味するであろう「もし等しいとならない2つのアレイを、そして、彼らはすべてのインデックスに対して同じである場合にのみ」。誰も私にこれを説明できますか?私は何かを見逃したり、理論を誤解していますか?あなたがこの問題について考えていることに感謝します。
敬具、 レオン
[0] http://goedel.cs.uiowa.edu/smtlib/theories/ArraysEx.smt2 問題を報告するための[1] http://smtlib.org
速やかな返信とバグ修正をありがとうございます。私は実際に安心して私のSMTLIB生成コードを書き直す必要はないと思っています。 この小さなバグとは別に、私のZ3の経験はこれまで非常に肯定的でした。 Z3を作成してみんなにアクセスできるようにしてくれてありがとう(Microsoft Researchの他の皆さん)に感謝したいと思います! – leonh