从 µZ3(喇叭求解器)中获取反例

Getting a counterexample from µZ3 (Horn solver)

使用 Z3 的 Horn 子句求解器:

如果答案是SAT,则可以对未知谓词(在大多数应用程序中,对应于某种转换系统或过程调用系统的归纳不变量)得到令人满意的分配。

如果答案是unsat,那么这意味着存在 Horn 子句的展开和对 Horn 子句中普遍量化变量的赋值,使得至少一个安全条件(子句false 头)被违反了。这构成了系统无解的具体见证

我怀疑如果 Z3 可以得出结论 unsat,那么它内部就有某种形式的此类见证(如果我没记错的话,PDR 就是这种情况)。有办法打印出来吗?

可能是我没看懂文档,找不到方法。 (get-proof) 打印出一些不可读的东西,此外,(set-option :produce-proofs true) 使一些问题变得棘手。

Z3 对 HORN 逻辑问题的反驳是以单元结果解决步骤树的形式出现的。您正在寻找的反例隐藏在单位解析步骤的结论中。这些结论(规则的最后一个参数)是与反例中的程序状态(或过程摘要或其他)相对应的基本事实。可以在 "quant-inst" 规则中找到产生这些事实的变量绑定。

显然,这不是人类可读的,实际上机器很难阅读。对于 Boogie,我实现了一种更规则的格式,但它目前仅适用于对偶引擎,并且仅适用于使用 "rule" 和 "query" 的定点格式。您可以使用以下命令获取它。

(查询:引擎对偶性:打印证书为真)