いくつかの仮説に関して、ステートメントの妥当性を証明することに興味があります。ただし、デフォルトでは Z3 は「オープン」モデルを想定しているようです。たとえば、次のように仮定します。
フー(4)
そして、このステートメントに関して、foo の「in」は偶数であることを示したいと思います。だから私は foo を宣言することから始めます
(declare-fun foo (Int) Bool)
次に、仮説に興味があるので。私は含意を構築します:
(implies (foo 4) (not (exists ((x Int)) (and (foo x) (not (= (mod x 2) 0))))))
最後に、充足可能性よりも妥当性に関心があるので、このステートメントの否定の充足可能性を確認したいと思います。
(assert (not (implies (foo 4) (not (exists ((x Int)) (and (foo x) (not (= (mod x 2) 0))))))))
(check-sat)
ただし、Z3 は、このステートメントが実際に満足できるものであると報告しています。
sat
(model
(define-fun x!0 () Int
(- 1))
(define-fun foo ((x!1 Int)) Bool
(ite (= x!1 4) true
(ite (= x!1 (- 1)) true
true)))
)
私はここで何が起こっているかを大まかに理解していますが、私の仮定のステートメントの下で foo を「閉じる」必要があることを最もよく表現する方法がわかりません。この非常に単純な例では、Z3 に foo の他のメンバーが存在しないことを伝えることでこれを行うことができます。
(assert (not (implies (and (foo 4) (not (exists ((x Int)) (and (not (= x 4)) (foo x))))) (not (exists ((x Int)) (and (foo x) (not (= (mod x 2) 0))))))))
しかし、より複雑な仮説に移ると、foo にないものを定義するための数式を自動的に生成することが難しくなるようです。
私が見逃しているばかげたことはありますか?