ユーザー理論プラグインを実装しています。一部のモデルを整理するために、ユーザー理論の不整合をテストしたいと思います。
より具体的には、私の理論でx
は、はユーザーの種類のセットの変数でありf
、セットのサイズを返す関数です。私には2つのアサーションがあります:x = set1 OR x = set2
とf x > 2
。のサイズset1
が1で、のサイズset2
が3であるとします。
検索では、Z3がx = set1
最初になります。f x = 1
したがって、INT部分で矛盾する別のアサーションを追加できます。現在の割り当てを無効にし、Z3をバックトラックさせて他のオプションを試すことができるように、不整合をテストしたいと思います。
私の質問は、どうすればそれができるかということです。
私は3つのアプローチを試しました:
(1)を使用してアサーションf x = 1
を直接追加しZ3_theory_assert_axiom()
ます。その後、検索はすぐに終了し、UNSATを返します。
(2)現在の状況を確認するための前提としてZ3_check_assumptions()
withを使用してみました。f x = 1
しかしZ3_check_assumptions()
、そのような複合式は許可されていません。だから、それは解決策になることはできません。
(3)最初にコンテキストをプッシュし、でアサーションf x = 1
を追加しZ3_assert_cnstr()
、で整合性をテストしてから、Z3_check_and_get_model()
プッシュしたばかりのコンテキストをポップします。テストでは、一貫性がない場合は、で現在の割り当てを取得Z3_get_context_assignment(ctx)
し、否定された割り当てをアサートしてバックトラックをトリガーします。私が観察しているのは、Z3は不整合を検出しますが、現在の割り当てには、のようなサイズ部分に関するアサーションのみが含まれているということ(= 1 (f x))
です。言い換えれば、のようなユーザー理論に関するアサーション(= x set1) and not (= x set2)
が欠落しています。したがって、現在の割り当てを無効にしても、バックトラック後、Z3x = set1
は他のオプションの代わりに試行しますx = set2
。
どこが間違っていたの?ありがとう!