如何估算SAT在z3中为SMT解决部分所花费的时间?

时间:2014-01-23 18:18:20

标签: z3 smt

我已经使用profiler gprof(stats here包括调用图)描述了我的问题,这些问题存在于(伪非线性)整数实际片段中,并且试图将分成两个类的时间分开:< / p>

I)SAT解决部分(包括[纯粹]布尔传播和[纯粹]布尔冲突子句检测,回跳,任何其他命题操作)

II)理论解决部分(包括理论一致性检验,理论冲突从句和理论传播的产生)。

bounded_search()内的smt_context.cpp中的第3280-3346行是否构成顶级DPLL(X)循环?

我相信在SAT求解器函数中总结时间会更容易(因为它们更少) 然后其余的可以被视为理论解算者的时间。我想弄清楚我应该考虑哪些功能属于上面的I类?他们是smt::context::decide()smt::context::bcp()smt::context::propagate()内吗?还有其他人? smt::context: resolve_conflict()似乎与对理论解算者的呼吁混在一起?

除了smt::context::propagate()函数之外,bcp()似乎主要是理论传播(第二类)是否正确?此外,smt::context::final_check()似乎纯粹属于第二类。

任何提示都非常感谢。感谢。

1 个答案:

答案 0 :(得分:5)

你是对的,bcp()decide()是“SAT求解器”的一部分。 函数final_check()只是理论推理。它执行Z3“声称”过于“昂贵”的程序。 resolve_conflict()程序是混合的:它执行引理学习和回溯。为了生成新的引理,Z3使用布尔分辨率(在“SAT部分”中)。在某些情况下,resolve_conflict中最昂贵的部分正在回溯理论解算器的状态。