私は、算術、数量詞、平等の理論を組み合わせたZ3を実験しています。これはあまり効率的ではないようです。実際、可能な場合は、数量詞をすべてのインスタンス化された地上インスタンスに置き換える方が効率的であるようです。f
次の例を考えてみましょう。この例では、sortの2つの引数を取りObj
、解釈されたsortを返す関数の一意の名前の公理をエンコードしましたS
。この公理は、引数の各一意のリストがf
一意のオブジェクトを返すことを示しています。
(declare-datatypes () ((Obj o1 o2 o3 o4 o5 o6 o7 o8)))
(declare-sort S 0)
(declare-fun f (Obj Obj) S)
(assert (forall ((o11 Obj) (o12 Obj) (o21 Obj) (o22 Obj))
(=>
(not (and (= o11 o21) (= o12 o22)))
(not (= (f o11 o12) (f o21 o22))))))
これはロジックでそのような公理を定義する標準的な方法ですが、このように実装すると計算コストが非常に高くなります。これには4つの定量化された変数が含まれ、それぞれが8つの値を持つことができます。これは、これが8^4 = 4096
平等になることを意味します。これを証明するには、Z30.69sと2016年の数量詞のインスタンス化が必要です。この式のインスタンスを生成する簡単なスクリプトを書くと、次のようになります。
(assert (distinct (f o1 o1) (f o1 o2) .... (f o8 o7) (f o8 o8)))
これらの公理を生成するのに0.002秒かかり、Z3でそれを証明するのにさらに0.01秒(またはそれ以下)かかります。定義域内のオブジェクト、または関数への引数の数をf
増やすと、この違いは急速に増加し、定量化されたケースはすぐに実行不可能になります。
これは私に不思議に思います:私たちが有界ドメインを持っているとき、なぜ私たちはそもそもZ3で数量詞を使うのでしょうか?SMTはヒューリスティックを使用して解決策を見つけることを知っていますが、接地されたインスタンスをSMTにフィードする単純なドメイン固有のグラウンダーと効率的に競合することはできないと感じています。これはSATの解決にすぎません。私の直感は正しいですか?