boolean
은 SM32이고 내 기능은 boolean_and
입니다. 내 추측은입니다 및 교환 법칙이 성립입니다 :Z3은 수작업으로 작성된 데이터 유형으로 대소 문자를 구분하지 않습니다
(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)
그러나, Z3 내가 이는 skolemised 변수에 내 경우 분할 주장을 사용할 수 있어야합니다 생각에도 불구하고, 잠시 후이 문제에 대한 알 수없는보고 sk_x
및 sk_y
. 내 부울 axiomatization를 제거하고 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)
을 내가 잘못 뭐하는 거지? 내 공리 (axiomatization)를 사용하여 z3을 대소 문자를 구분하는 방법은 무엇입니까?
고마워요! 나는 내일 다시 지을거야. – danr