スコーレム化を使用して、私の理論で存在記号を削除しようとしています。これは、存在記号を、存在記号のスコープ内の全称記号変数によってパラメーター化された関数に置き換えることを意味します。
ここで、Z3でこれを行う方法の説明を見つけましたが、まだ問題があります。次の2つの関数を想定します。
(define-fun f1 ((t Int)) Bool (= t 3))
(define-fun f2 () Bool (exists ((t Int)) (f1 t)))
真であるような整数、すなわち。f2
が存在するので、それは真であるはずだと私は信じています。存在記号の式に定数を導入することにより、スコーレム化を適用します。t
(f1 t)
t=3
(define-const c Int)
次に、存在記号を含む式は次のように書き直されます。
(define-fun f2 () Bool (f1 c))
これは機能しません。つまり、定数c
の値は3ではありません。定数に解釈を与えていないためだと思います。これc
を追加すると正常に機能するためです(assert (= c 3))
が、これにより存在記号の概念全体が失われます。数量詞。これが機能するように、あまり明確に解釈しない方法はありc
ますか?