z3.prove比求解器和检查要快得多

时间:2014-07-25 08:21:33

标签: z3 z3py

我正在使用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函数。

provesrc/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__和谷歌并没有真正帮助。

感谢任何建议!

1 个答案:

答案 0 :(得分:1)

最好的猜测是,默认选项对我的特定情况表现不佳,可能是因为随机数差异或其他一些非确定性内部状态。