使用Z3中的证明目标减少已使用子句的数量

时间:2012-12-21 20:49:26

标签: z3 smt theorem-proving

我正在尝试优化使用Z3来证明关于一阶理论的事实。目前,我在Python中指定了一阶理论,将量词放在那里,并将所有子句与证明目标的否定一起发送到Z3。我有以下想法,我希望可以优化结果:我只想将理论中的公式发送到与验证目标相关的Z3。我不会详细讨论这个概念,但我认为直觉很简单:我的理论是公式的结合,我只想发送可能影响证明目标真值的合取。

我的问题如下:这可以提高效率,还是Z3已经使用了类似的方法?我猜不会,因为我不认为Z3总是假设最后一个断言是证明目标,所以它没有办法优化它。

1 个答案:

答案 0 :(得分:2)

是的,删除不相关的事实可能会产生很大的不同。假设我们有F_1 and F_2 and (not G)形式的不可满足的公式。此外,我们假设F_1 and (not G)不可满足,F_2是可以满足的。 F_2就是你所谓的无关紧要。如果在将公式发送到Z3之前有一种廉价的方法可以删除F_2,那么很可能会有很大的不同。

Z3具有“忽略”无关事实的启发式,但它们只是启发式。对于我们的示例,最糟糕的情况是F_2,Z3很难满足。 Z3实际上是在尝试构建一个满足输入公式的解释/解决方案(在我们的工作示例中为公式F_1 an F_2 and (not G))。当Z3表明不可能建立解释时,公式是不可满足的。实际上,公式F_2只有在能够快速显示为可满足时才与Z3无关,并且F_2的解释/解决方案不会与F_1 and (not G)发生冲突。如果不是这样,Z3可能会浪费大量资源F_2