ステートメント 1 はマクロです。Z3 は、出現するすべてmax_integ
の式をその式に置き換えite
ます。解析時にそれを行います。2 番目のステートメントでは、デフォルトでは、Z3 は を削除せずmax_integ
、すべてのおよびの量指定子を満たすsat
未解釈のシンボルの解釈を構築する必要があります。Z3 には というオプションがあり、本質的にマクロをエンコードしている量指定子を検出し、それらを削除します。以下に例を示します (こちらからオンラインでも入手できます)。max_integ
x
y
:macro-finder
(set-option :macro-finder true)
(declare-fun max_integ ((Int)(Int)) Int)
(assert (forall ((x Int) (y Int)) (= (max_integ x y) (if (< x y) y x))))
(check-sat)
(get-model)
そうは言っても、指定された Z3 式が新しい Z3 式を返す関数を作成することで、プログラム API でマクロを簡単にシミュレートできます。Python API を使用した例 (こちらからオンラインでも入手可能):
def max(a, b):
# The function If builds a Z3 if-then-else expression
return If(a >= b, a, b)
x, y = Ints('x y')
solve(x == max(x, y), y == max(x, y), x > 0)
さらに別のオプションは、C API を使用することですZ3_substitute_vars
。アイデアは、自由変数を含む式です。自由変数は API を使用して作成されますZ3_mk_bound
。各変数は引数を表します。次に、Z3_substitute_vars
変数を他の式に置き換えるために使用します。