使用Z3的Horn子句求解器:
如果答案是SAT
,那么可以得到令人满意的未知谓词赋值(在大多数应用程序中,它对应于某种过渡系统或过程调用系统的归纳不变量)。
如果答案是unsat
,那么这意味着存在一个Horn条款的展开和Horn条款中普遍量化变量的赋值,这样至少有一个安全条件(带有a的条款) false
头部)被违反。这构成了具体的见证为什么系统没有解决方案。
我怀疑如果Z3能够得出结论unsat
,那么它内部会有某种形式的这种见证(如果我记得很清楚,这就是PDR的情况)。有没有办法打印出来?
也许我读错了文档,但我找不到办法。 (get-proof)
打印出一些不可读的内容,此外,(set-option :produce-proofs true)
会使一些问题难以处理。
答案 0 :(得分:2)
Z3为HORN逻辑问题产生的反驳是以单元结果树的形式产生的。您正在寻找的反例隐藏在单位解析步骤的结论中。这些结论(规则的最后一个论点)是与反例中的程序状态(或程序摘要或其他)相对应的基本事实。产生这些事实的变量绑定可以在" quant-inst"规则。
显然,这不是人类可读的,实际上很难通过机器阅读。对于Boogie,我实现了一种更常规的格式,但它目前仅适用于二元引擎,并且仅适用于使用"规则"的定点格式。和"查询"。您可以使用以下命令获取此信息。
(查询:引擎二元性:print-certificate true)