z3 4.0 で次のコード フラグメントを使用して、式を CNF に変換しています。
(set-logic QF_UF)
(
set-option
:produce-models
true
)
; ------ snip -------
;
; declarations,
; and assert statement
; of "original" formula
; here.
;
; ------ snap -------
(
apply
(
then
(
!
simplify
:elim-and
true
)
tseitin-cnf
)
)
次のようなものが得られます。
(goals
(goal
; ------ snip -------
;
; Lot's of lines here
;
; ------ snap -------
:precision precise :depth 2)
)
私は、それに続く式のそれぞれがgoal
CNF の 1 つの節であると想定していました。つまり、これらすべての式を結合して、実際の式を生成する必要があります。この結合を「エンコードされた」式と呼びます。
明らかに、元の式とエンコードされた式は同等ではありません。エンコードされた式にk!0, k!1, ...
は Tseitin エンコードを行う新しい変数が含まれているためです。しかし、私は、それらが等充足可能であるか、実際には同じモデルによって充足されることを期待していました (k!i
変数を無視した場合)。
つまり、私はそれ(encoded formula) AND (NOT original formula)
が満足できないと思っていました。残念ながら、そうではないようです。このチェックが実際に を返す反例がありますsat
。
これは z3 のバグですか、使い方が間違っているのでしょうか、それとも私の仮定が有効ではないのでしょうか?