在下面显示的Z3脚本中,我具有三个关系-会话顺序(so
),可见性(vis
)和事前发生(hb
)。约束之一有效地断言了hb = so ∪ vis
的{{1}}。换句话说,对于两个常量∀a,b. so(a,b) ⇒ hb(a,b)
和E1
,约束E2
和(so E1 E2)
不能同时满足。不出所料,如果我同时断言Z3和Z3,则它们将返回UNSAT。但是,如果现在我再次删除(not (hb E1 E2))
和(not (hb E1 E2))
,则Z3返回一个模型,其中check-sat
的计算结果为true,而(so E1 E2)
的计算结果为false(请参阅(hb E1 E2)
最后的语句)。这怎么可能?任何获得正确模型的变通方法也将受到赞赏!
我传递给Z3的选项是eval
,我使用4.8.0的Z3版本。
smt.auto-config=false smt.mbqi=true smt.macro-finder=true
答案 0 :(得分:2)
我认为这是z3错误,并且我怀疑它与macro-finder选项一起使用。如果删除smt.macro-finder=true
参数(或不带任何参数的调用),则不会出现此问题。
您绝对应该在其github跟踪器上报告。 (我相信您已经做到了!)
关于建模:您是否尝试过declare-datatypes
来建模Eff
和Oper
?您可以使它们成为简单的构造函数,从而摆脱它们的基数约束。 (它们会自动推断出来。)通过使用对此类数据类型建模的内部机制,而不是量化,您可能会获得更好的成绩。