次の SMTLIB プログラムを検討してください (rise4fun here で):
(set-option :auto_config false)
(set-option :smt.mbqi false)
(set-option :smt.arith.nl.gb false)
(declare-const n Int)
(declare-const i Int)
(declare-const r Int)
(assert (= i n))
(assert (= r (* i n)))
(push)
(assert (not (= r (* n n))))
(check-sat) ; unknown
(pop)
Z3 (4.3.2 公式リリース、および 4.4.0 b6c40c6c0eaf) は、構文上の同等性に関する推論のみを必要とするように見えますが、最終的なアサーションが であることを示していませんunsat。
予想外に(少なくとも私にとっては)、に設定smt.arith.nl.gbするtrueと、例が検証されます(つまり、check-satyields unsat)。
それだけの価値があるため、さらにいくつかの観察結果を次に示します。
乗算がまたはにそれぞれ変更された場合、最終的なアサーションを示すことができます。
unsat(* i n)(* n i)乗算を次のように変更すると表示できません。
unsat(* i i)(push)例に(pop)影響を与えるようには見えません。つまり、記述された観察に影響を与えずに削除できます。
smt.arith.nl.gbこれはバグですか、それともこの例を表示する必要がある理由はありunsatますか?