在Z3中定义枚举类型的函数

时间:2015-06-30 11:21:19

标签: z3 smt

我的枚举类型 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 函数或上一个谓词?

1 个答案:

答案 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))