z3中的独有数据类型(跟进)

时间:2014-07-28 11:11:43

标签: z3 smt

我在z3中声明了一个独占数据类型以及一个常量和一个小断言:

(declare-datatypes () ((IntOrBool (bpart (b Bool)) (ipart (i Int)))))
(declare-fun iob () (IntOrBool))    
(assert (= true (b iob)))

我得到预期结果(bpart true),但是

(assert (= 1 (i iob)))

z3报告(bpart false)。 z3是否忽略了我给出的断言?如果他将数据类型视为非独占数据类型,我如何强制z3返回ipart作为结果?

1 个答案:

答案 0 :(得分:1)

函数“b”和“I”是访问器。当应用于不匹配的构造函数时,它们可以具有任意解释。所以Z3找到一个模型,其中iob被设置为(bpart false)并且(i(bpart false))被解释为1.你可以通过断言来强制使用正确的构造函数:

 (assert (= (bpart true) iob))

(assert (= (ipart 1) iob))