Z3 施加附加约束是否应该提高SMT求解器的求解时间?

Z3 施加附加约束是否应该提高SMT求解器的求解时间?,z3,smt,sbv,Z3,Smt,Sbv,我有一个SMT应用程序(建立在Haskell SBV库上),它使用Z3解决了实际逻辑中单个s变量的复杂方程。在我的案例中,找到解决方案大约需要30秒 为了加快速度,我添加了额外的约束s

我有一个SMT应用程序(建立在Haskell SBV库上),它使用Z3解决了实际逻辑中单个
s
变量的复杂方程。在我的案例中,找到解决方案大约需要30秒

为了加快速度,我添加了额外的约束
s<40000
,因为我对解决方案有一些估计。我认为这样的约束会缩小搜索空间,使解算器更快地返回结果。然而,这只会使它变慢(实际上,它甚至没有在10分钟内完成)

问题是:是否可以假设附加约束总是会减慢/加快解决过程,或者没有一般规则,总是取决于具体情况


我担心,即使是我的30秒算法也可能包含一些不必要的额外约束,但只会减慢过程。

我认为你无法对此做出任何一般性假设。假设
sat
/
unsat
状态不变,它可能会也可能不会影响求解时间

平等通常会有所帮助(因为它们可以自由传播),但对于其他任何事情,这都是任何人的猜测。此外,对于同一加法,不同的解算器可能表现出不同的行为

考虑这一点的一种方式是,底层的DPLL(T)算法本质上是一种非常智能的美化搜索算法。它不断产生“习得的引理”,希望能找到与先前已知的事实相矛盾的地方。您添加的新“约束”可能会导致它生成大量正确但不相关的引理,从而使它深入到最深处而没有任何有用的结果。(量化公式通常是这样的:你可以用一百万种不同的方式实例化它们;但除非你找到“正确”的实例化,否则它们所做的一切最终都会污染你的搜索空间。)


至少这是我的经历

一般来说,@Levent Erkok是正确的:SMT解算器采用的启发式/等方法使其性能很少可预测。然而,始终存在这样的可能性,即所展示的行为不是侥幸,而是与所使用的解算器或所考虑的问题/编码相关的“总体”一致真实的东西。也许值得尝试一下,尝试不同的问题实例、不同的边界和不同的解算器。如果存在一些一致的、可测量的模式,那么可能值得进行更深入的调查,并获得社区更多的关注。