数量器に関する質問があります。数量Vs非数量
私は配列を持っていると私は、この配列の配列インデックス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として構築使用して同じことを指定することができます -
今、私はそれらの2つの違いを理解したいと思います。 最初のメソッドは迅速に実行され、シンプルで読みやすいモデルを提供します。 対照的に、2番目のオプションのコードサイズは非常に小さいですが、プログラムの実行に時間がかかります。また、ソリューションは複雑です。
私のコードが小さくなるので、私は2番目の方法を使いたいと思います。 しかし、わかりやすいシンプルなモデルを探したい。
親愛なるレオナルド、もう一度同じ質問に戻ります。私は座ソルバーのコードを最適化しようとしています。定数を使用するのが良いときや、解釈されていない関数を使うのが良いときは教えてください。たとえば、私のコードには約30-40の解釈されない関数があります。いくつかの関数をxA0などに置き換えた複数の定数に置き換えると、実行時間が短縮されますが、他の関数については取得できません。それらの間で選択する重要なルールは何ですか?それはあなたがコードでどれくらい使っているかに依存していますか? – Raj
揺らぎは非常に一般的です。アサーションを並べ替えるなどの小さな変更を加えても、変動を観察します。小さな変更は、Z3が探索空間を横切る順序を変えることがあります。経験則として、可能なときはいつでも量限定子を避けるべきです。単一の理論を使用して問題をエンコードすることができれば、通常はより良いパフォーマンスが得られます。もちろん、私たちは常に例外を持っています。どのようなパフォーマンスの変動を観察していますか?それは2倍、10倍、100倍のオーダーですか? –