このかなり単純なZ3クエリを証明しようとして問題が発生しています。
(set-option :smt.auto-config false) ; disable automatic self configuration
(set-option :smt.mbqi false) ; disable model-based quantifier instantiation
(declare-fun sum (Int) Int)
(declare-fun list () (Array Int Int))
(declare-fun i0 () Int)
(declare-fun s0 () Int)
(declare-fun i1 () Int)
(declare-fun s1 () Int)
(assert (forall ((n Int))
(! (or (not (<= n 0)) (= (sum n) 0))
:pattern ((sum n)))))
(assert (forall ((n Int))
(! (let ((a1 (= (sum n)
(+ (select list (- n 1))
(sum (- n 1))))))
(or (<= n 0) a1))
:pattern ((sum n)))))
(assert (>= i0 0))
(assert (= s0 (sum i0)))
(assert (= i1 (+ 1 i0)))
(assert (= s1 (+ 1 s0 (select list i0))))
(assert (not (= s1 (sum i1))))
(check-sat)
最後のアサーションはi1の2番目の数量化ステートメントをインスタンス化する必要があり、s0を含むアサーションはi0の数量詞をインスタンス化する必要があるように思われます。これら2つは簡単にUNSATにつながるはずです。
ただし、Z3は不明を返します。何が足りないのですか?
気にしないでください、私のクエリにばかげたエラーがありました。
このコード:
(assert (= s1 (+ 1 s0 (select list i0))))
になるはずだった:
(assert (= s1 (+ s0 (select list i0))))
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加