コンテキスト:z3を使用して制限付きJavaプログラムの検証について調査します。線形化問題の最適化モデルを取得したいと思います。標準的なアプローチは、不満のケースが見つかるまでモデルを段階的に検索することです。しかし、パフォーマンスは問題のようであり、z3 c / c ++ apiをツールに統合するJNIを導入することにより、コードの移植性が損なわれます。
ここで、Javaメソッドのすべての入力に制約を追加したいと思います。私は量配列を使用します(ヒープをモデル化するために配列の理論を使用します)。ただし、z3は、満足のいく問題が発生すると、常に「不明」をすぐに返します。モデルを生成することは不可能のようです。z3、INST_GENのオプションがあることに気づき、それを理解しようとしています。次の式をz3にフィードします。
(set-option :INST_GEN true)
(define-sort S () (_ BitVec 2))
(declare-fun s () S)
(assert (= s (_ bv0 2)))
(define-sort A () (Array S S))
(push) ;; 1st case
(assert (forall ((a A)) (= (select a s) s)))
(check-sat)
(get-model)
(pop)
(push) ;; 2nd case
(declare-fun a () A)
(assert (forall ((t S)) (= (select a t) t)))
(check-sat)
(get-model)
(pop)
(push) ;; 3rd case
(check-sat)
(get-model)
(pop)
1番目と2番目のケースの両方で、z3はLinuxでは「セグメンテーション違反」を返しますが、Windows7ではクラッシュします。両方のz3はバージョン4.0、x64です。
3番目のケースでは、定量化フリーであり、Z3はモデルを正常に生成します
sat
(model (define-fun s () (_ BitVec 2) #b00) )
私の最初の質問は、このオプションがどのように機能するかです。配列を列挙しますか?
2番目の質問は、z3が、配列の定量化に関する満たされていない問題に対して「unsat」を正常に返す可能性があることに気付きました。z3は、制限されたインデックスと要素を使用して、定量化された配列で満足のいく問題でモデルを生成するためのオプションまたはアプローチをサポートしていますか?たとえば、if-then-else句を使用します。
読んでいただきありがとうございます!どんな提案でも大歓迎です!