Z3不会对手工制作的数据类型进行大小写拆分

Z3不会对手工制作的数据类型进行大小写拆分,z3,theorem-proving,Z3,Theorem Proving,我已经定义了自己的布尔函数,称为boolean是SMT2,其上的and函数boolean_和。 我的猜想是和是可交换的: (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
是SMT2,其上的and函数
boolean_和
。 我的猜想是和是可交换的:

(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

奇怪的是,如果我移除布尔公理化并用
声明数据类型
,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进行案例拆分?

你没有做错任何事。官方版本(v4.3.1)可能会在包含基数约束的问题上失败,例如

(assert (forall ((x boolean)) (or (= x boolean_false)
                                  (= x boolean_true))))
此约束断言未解释的排序
布尔值
最多有两个元素。 我解决了这个问题。该修复程序已在
unstable
分支中可用。 下面是一些关于如何编译
分支的说明。

明天,还将包含此修复程序。

谢谢!那我明天重建。