我正在使用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__
和谷歌并没有真正帮助。
感谢任何建议!
答案 0 :(得分:1)
最好的猜测是,默认选项对我的特定情况表现不佳,可能是因为随机数差异或其他一些非确定性内部状态。