我在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
作为结果?
答案 0 :(得分:1)
函数“b”和“I”是访问器。当应用于不匹配的构造函数时,它们可以具有任意解释。所以Z3找到一个模型,其中iob被设置为(bpart false)并且(i(bpart false))被解释为1.你可以通过断言来强制使用正确的构造函数:
(assert (= (bpart true) iob))
或
(assert (= (ipart 1) iob))