テンプレートから問題を生成しますが、問題の性質上、量指定子に頼らざるを得ません。これで、ソルバーは本当に単純な (満足できる) 問題のインスタンスのみを見つけることができます。多くの場合、「unsat」の検索は機能します。「sat」を見つけることはめったに機能しません。
問題は、互いに素な 2 つのセットの定義のような単純なものでさえ、いくつかの非常にやっかいな式で表現しなければならないことです。
(assert (! (disjoint_1 B A) :named a2 ))
(assert (! ; axiom for "disjoint_1"
(forall ((A Rel1)(B Rel1)) (=
(disjoint_1 A B)
(forall ((a0 Atom)) (not (and (in_1 a0 A) (in_1 a0 B))))))
:named ax8))
インスタンスを見つけるために、Z3 は関数の解釈を見つけなければなりませんin_1
。他のすべての機能はすべてそれに依存しています。
これまでのところ、私の問題に関連して次のような発言を聞いています。
- すべての量指定子にはパターンが必要です
- 無限モデルがある場合、インスタンス検索は機能しません
これを達成または回避する方法について、ウェブや文献で役立つ情報を見つけることができませんでした。だから私の質問は残ります:
(Z3 を使用して) 充足可能な数式のインスタンスを効率的に見つけるにはどうすればよいですか? パターンを使用してこれを達成するにはどうすればよいですか (ある場合)。