Z3Py:使用z3.prove时生成更多反例

时间:2016-04-08 00:02:09

标签: python logic z3 z3py

是否有可能让Z3Py在合理的时间内产生更多的反例?

我可以使用z3.prove生成一个反例,如下所示:

import z3

x = z3.Real("x")

rule = x > 0
goal = x < 0
z3.prove(z3.Implies(rule, goal))

,它给出了以下输出,

counterexample
[x = 1]

但是如果我想产生更多反例呢?

是否可以通过逐步添加基于反例的规则来实现此目的?

对于上述情况,我可以通过这样做得到一个不同的反例

z3.prove(z3.Implies(z3.And(rule, x!=1), goal))

但我相信当涉及许多规则时这很慢,所以我希望能有更快的方法。

谢谢!

1 个答案:

答案 0 :(得分:1)

你建议的是获得多个反例的“通常”建议。 Z3没有生成多个反例的方法,因为这很容易从外部进行。但是,它确实支持优化,因此如果您的目标是找到一个“最佳”或“至少同样好”的解决方案,那么这可能是一个解决方案。

对简单的反例添加的简单优化是检查反例中的所有赋值是否实际上是必需的。例如,情况可能是反例是(x = 5,y = 0),但没有任何东西取决于y = 0,所以我们可以将其删除,这使得反例更小(因此会有少了一些)。