我已经使用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()
似乎纯粹属于第二类。
任何提示都非常感谢。感谢。
答案 0 :(得分:5)
你是对的,bcp()
和decide()
是“SAT求解器”的一部分。
函数final_check()
只是理论推理。它执行Z3“声称”过于“昂贵”的程序。 resolve_conflict()
程序是混合的:它执行引理学习和回溯。为了生成新的引理,Z3使用布尔分辨率(在“SAT部分”中)。在某些情况下,resolve_conflict
中最昂贵的部分正在回溯理论解算器的状态。