当使用Z3的SMT约束时,获得合法范围信息的(次)最佳方式



这个问题与我之前的问题有关

当使用Z3 的SMT约束时,是否可以获得合法的范围信息

因此,在给定典型的32位向量等的情况下,"高效"地找到最大范围信息似乎是不合适的。但另一方面,我在思考找到某些"次最大"范围信息是否可行,这有望变得更高效。另一件事是,我们可能希望有一定的"安全">保证,比如说,对于亚最大值范围内的所有元素,它们必须满足约束,但也可能存在一些其他解决方案来满足约束。

我目前正在探索model counting技术在这种情况下是否有意义。如有任何想法,我们将不胜感激。谢谢

一般情况

这不仅仅是效率问题。考虑一个问题,其中有两个变量ab,以及一个约束:

a!=b

b的范围是多少?(最大值还是其他?(

你可以说所有的价值观都是合法的。但这是错误的,因为a的选择显然会影响b的选择。你周围的变量越多,问题就会变得越复杂。我认为在这种情况下,问题甚至没有得到很好的定义,所以寻找解决方案(有效或其他(没有多大意义。

单变量假设

话虽如此,我认为如果你假设系统中只有一个变量,你就可以想出一个解决方案。(或者,如果你将所有其他变量固定为一些预定义的常数。(如果你愿意走这条路,那么你可以通过简单地证明量化公式来实现二进制搜索算法,以找到一个合理大小的范围

Exists([b], And(b >= minBound, b <= maxBound, Not(constraints)))

一旦你得到unsat,你就有了你的射程。只要你得到了sat,你就可以调整你的minBound/maxBound在更小的范围内搜索。在最坏的情况下,这可能会变成线性行走,但你可以通过确保每一步都走一个显著的距离来"减少"搜索。这可能是整个搜索的一个参数,取决于你希望你的间隔有多大。这必须在试图找到最大范围和你想在搜索中花费多长时间之间做出选择。当然,如果你削减太多,你可能会错过一个大的间歇期,但这是效率的代价。

示例1(好的情况(有一个单独的约束条件说b != 5。然后你的搜索会很快,根据你要去的分支,你会发现假设为8位单词的[0, 4][6, 255]

示例2(坏情况(有一个单独的约束条件说b is even。然后,您的搜索将表现出最坏的行为,如果您的"削减"大小为1,那么在确定[0, 0]之前,您可能会迭代255次;假设z3在每次呼叫中为您提供最大奇数。

我希望这能说明这一点。不过,总的来说,我认为你会更接近实际应用的"好情况",即使你的削减规模很小,你也很可能在几次迭代中收敛。当然,这完全取决于你的问题域,但我希望它能适用于一般的软件分析。

最新更新