リコールZ3によって返されたモデルは、単純な関数型プログラムとみなすことができるという。 あなたの数式はUFBVの断片にあります。 Z3はいくつかのモジュールを使ってこの断片を決定します。各モジュールは式F
を「より単純な」式F'
に変換し、F'
のモデルをF
のモデルに変換するプロシージャを生成します。これらの手順を「モデルコンバータ」と呼びます。例えば、モデル変換器は、F
からF'
への変換で導入された補助関数と定数の解釈を排除します。いくつかの補助定義は、他の定義の解釈を与えるために使用されていると思われます。私たちはそれらを「補助機能」とみなすべきです。また、除外されたシンボルの解釈も作成されます。
例では、最後のモジュールがtrans!...
とk!...
のシンボルを含むモデルを生成します。このモデルは、trans
を含んでいない式用です。関数trans
が削除されました。モデルコンバーターを適用すると、trans
の解釈はすべてtrans!...
の解釈に基づいて構成されます。 trans!...
およびk!...
の記号は、trans
の解釈が全てtrans!...
記号への参照を有し、trans!...
関数の解釈がk!...
機能記号への参照を有するので、依然として記号が使用されている。このステップでは、モデル内に不要なシンボルはありません。しかし、後のステップでtrans!...
とk!...
の定義を展開することによって、trans
の解釈が簡素化されます。したがって、この簡略化ステップの後に、trans!...
とk!...
は本質的に「デッドコード」です。
つまり、Z3によって返されるモデルは正しいです。つまり、これはあなたの数式のモデルです。私は、これらの余分なシンボルは迷惑で不必要であることを認めます。これらを排除するために、「デッドコード」除去ステップに相当するものを適用しています。私たちは本当に次のリリースに近いです。したがって、この機能は次のリリースでは利用できませんが、次のリリースに続くリリースで追加します。
これらの機能を生成するスクリプトへのリンクを追加できますか? –
@LeonardodeMouraはい、確かに - 投稿に追加されました – Ayrat