我正在使用来自 Codeplex 的最新 z3 主代码,标记为 v4.3.1。
我想要一个这样的函数prove
,它有一个有用的返回值并且不打印。所以,我写了看起来很明显的东西:
def prove2(claim):
s = Solver()
s.add(Not(claim))
if s.check() == unsat:
return True, []
return False, s.model()
但是,此代码的运行速度比默认prove
函数慢得多。
prove
(瘦身)的代码src/api/python/z3.py
是:
def prove(claim, **keywords):
s = Solver()
s.set(**keywords)
s.add(Not(claim))
if keywords.get('show', False):
print s
r = s.check()
if r == unsat:
print "proved"
elif r == unknown:
print "failed to prove"
print s.model()
else:
print "counterexample"
print s.model()
当我添加s.set()
到我的代码中时,它很快并且找到了相同的反例。
这里发生了什么?
- 这个空洞的电话是否以
s.set()
某种方式清除了一些通常不好的选项? - ..对我的特定测试不利?
- 还有什么?
我试图找出默认的求解器选项是什么,但是str(s)
repr(s)
,s.__dict__
和 google 并没有真正帮助。
任何建议表示赞赏!