我有一个SMT应用程序(基于Haskell SBV库构建),它使用Z3解决了针对实数逻辑中的单个s
变量的一些复杂方程式。在我的情况下,找到解决方案大约需要30秒。
为了加快速度,我增加了一些约束s < 40000
,因为我对解决方案有一些估计。我以为这样的约束将缩小搜索空间并使求解器更快地返回结果。但是,这只会使其变慢(实际上,它甚至没有在10分钟内完成)。
问题是:是否可以假设附加约束总是(总是)减慢/加快解决方案的过程,或者没有通用规则,并且总是取决于情况?
我担心即使我的30秒算法也可能包含一些不必要的约束,但这只会减慢过程。
答案 0 :(得分:3)
我认为您无法对此做出任何一般性假设。假设sat
/ unsat
的状态不变,可能会或不会影响求解时间。
平等通常会有所帮助(因为它们可以自由传播),但是对于其他任何事情,这都是所有人的猜测。同样,对于相同的加法运算符,不同的求解器可能表现出不同的行为。
对此进行考虑的一种方法是,底层DPLL(T)算法本质上是一种非常聪明的美化搜索算法。它一直在产生“学习的引理”,希望它会发现与先前已知事实的矛盾。您添加的新“约束”可能会导致它生成大量正确但无关紧要的引理,从而使其陷入深渊,而没有任何有用的结果。 (量化公式通常是这样的:您可以用一百万种不同的方式实例化它们;但是除非找到“正确的”实例化,否则它们所做的一切最终都会污染您的搜索空间。)
至少这是我的经验!