z3中的独占数据类型(后续)

z3中的独占数据类型(后续),z3,smt,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中声明了一个独占数据类型,以及一个常量和一个小断言:

(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

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

 (assert (= (bpart true) iob))


如果你投了反对票,请留下评论。否则,我不明白我应该如何表述这个问题,以致任何人都理解它。
(assert (= (ipart 1) iob))