Z3プログラムで次のルールを使用してs
、sortの可能な唯一の値を作成していますS
。
(assert (forall ((t S)) (= t s)))
ただし、上記の式により、Z3は次のエラーを報告します。
Z3: ERROR: WARNING: failed to find a pattern for quantifier (quantifier id: k!8)
特定の種類のドメインに単一の値のみがあることを確認する正しい方法は何ですか?
メッセージ
Z3:エラー:警告:数量詞のパターンが見つかりませんでした(数量詞ID:k!8)
誤解を招くです。これは単なる警告であり、「エラー」という言葉が誤って表示されています。これは修正され、次のリリースで利用できるようになります。警告は、E-matchingモジュールが数量詞を無視することをユーザーに通知するだけです。ただし、Z3は多くのエンジンを使用して定量化された数式を処理します。MBQIモジュールは、この定量化された式を処理し、次のような問題に対して満足のいく割り当てを構築できます。
(宣言-ソートS)
(declare-fun s()S)
(assert(forall((t S))(= ts)))
(宣言-楽しいa()S)
(declare-fun b()S)
(アサート(= ab))
(チェック土)
(モデル)
そうは言っても、上記の定量化された式は、単一の要素でソートを指定するための最良の方法ではありません。データ型を使用して列挙型をエンコードできます。たとえば、次のコマンドは、要素e1…enを使用してソートSを定義します。
(declare-datatypes ((S e1 e2 … en)))
次の例を使用して、要素が1つしかないソートを指定できます
(declare-datatypes ((S e)))
。次の例では不十分です。
(declare-datatypes((S elem)))
(宣言-Sを構成する)
(declare-const b S)
(アサート(not(= ab)))
(チェック土)