我的枚举类型 BoolT 包含 Bool 和 Bot
(declare-datatypes () ((BoolT Bool Bot)))
我想定义一个等于函数 eq 给定两个 BoolT 返回 Bot ,如果其中一个参数是 Bot < / em>,否则两个 Bool 参数之间相等。但是,我无法定义布尔值之间的实际比较。到现在为止我得到了函数
(define-fun eq ((x1 BoolT) (x2 BoolT)) BoolT
(ite (or (= x1 Bot) (= x2 Bot)) Bot Bool))
虽然我需要像
这样的东西(define-fun eq ((x1 BoolT) (x2 BoolT)) BoolT
(ite (or (= x1 Bot) (= x2 Bot)) Bot
(or (and (= x1 true)(= x2 true)) (and (= x1 false)(= x2 false)))
)
或至少是以下谓词的正确定义
(define-fun is-True ((x1 BoolT)) Bool
(ite (= x1 true) true false)
)
有没有办法在 BoolT 上模拟 eq 函数或上一个谓词?
答案 0 :(得分:0)
您需要在Z3中使用带标记的联合,类似于ML数据类型。您不能仅使用现有类型的并集并将其包含在数据类型声明中。 所以你需要写一些像:
(declare-datatypes () ((BoolT True False Bot)))
或
(declare-datatypes () ((BoolT (mkB (tf B)) Bot) (B True False)))
然后你可以写:
(define-fun is-True1 ((x BoolT)) Bool
(= (mkB True) x))
或
(define-fun is-True2 ((x BoolT)) Bool
(and (is-mkB x) (= True (tf x))))
并断言
(declare-const a BoolT)
(assert (is-True2 a))
声明(B真假) 自动声明谓词is-True和is-False
(declare-const b B)
(assert (is-True b))