Z3的模型似乎违反了约束

时间:2018-10-25 14:04:59

标签: z3

在下面显示的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

1 个答案:

答案 0 :(得分:2)

我认为这是z3错误,并且我怀疑它与macro-finder选项一起使用。如果删除smt.macro-finder=true参数(或不带任何参数的调用),则不会出现此问题。

您绝对应该在其github跟踪器上报告。 (我相信您已经做到了!)

关于建模:您是否尝试过declare-datatypes来建模EffOper?您可以使它们成为简单的构造函数,从而摆脱它们的基数约束。 (它们会自动推断出来。)通过使用对此类数据类型建模的内部机制,而不是量化,您可能会获得更好的成绩。