boolean
SMT2と呼ばれる独自のブール値と、boolean_and
それらに対するAND関数を定義しました。私の推測では、ANDは可換です。
(declare-sort boolean)
(declare-const sk_x boolean)
(declare-const sk_y boolean)
(declare-const boolean_false boolean)
(declare-const boolean_true boolean)
(declare-fun boolean_and (boolean boolean) boolean)
;; axiomatize booleans: false /= true and every bool is true or false
(assert (forall ((x boolean)) (or (= x boolean_false)
(= x boolean_true))))
(assert (not (= boolean_false boolean_true)))
;; definition of AND
(assert (forall ((a boolean)) (= (boolean_and boolean_false a) boolean_false)))
(assert (forall ((a boolean)) (= (boolean_and boolean_true a) a)))
;; try to prove that AND is commutative
(assert (not (= (boolean_and sk_x sk_y)
(boolean_and sk_y sk_x))))
(check-sat)
sk_x
ただし、z3は、スコーレム化された変数とでケース分割アサーションを使用できるはずだと思っていたにもかかわらず、しばらくするとこの問題について不明であると報告しますsk_y
。
不思議なことに、ブール値の公理化を削除して、に置き換えると
declare-datatypes
、z3は次のように報告しunsat
ます。
(declare-datatypes () ((boolean (boolean_true) (boolean_false))))
(declare-const sk_x boolean)
(declare-const sk_y boolean)
(declare-fun boolean_and (boolean boolean) boolean)
(assert (forall ((a boolean)) (= (boolean_and boolean_false a) boolean_false)))
(assert (forall ((a boolean)) (= (boolean_and boolean_true a) a)))
(assert (not (= (boolean_and sk_x sk_y)
(boolean_and sk_y sk_x))))
(check-sat)
私は何が間違っているのですか?公理化を使用してz3をケース分割するにはどうすればよいですか?