在Z3上使用SMT约束时,(次)最优方法来获取合法范围信息

时间:2018-12-11 23:03:22

标签: z3 smt z3py

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

Is it possible to get a legit range info when using a SMT constraint with Z3

在给定典型的32位向量等的情况下,似乎无法“有效”地找到最大范围信息。但是,另一方面,我在考虑找到某些“低于最大”范围的信息是否可行,希望可以提高效率。另一件事是,我们可能希望具有某些“安全” 保证,例如,对于次最大范围内的所有元素,它们必须满足约束条件,但是可能存在一些其他满足条件的解决方案。约束。

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

1 个答案:

答案 0 :(得分:1)

一般情况

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

  

a!= b

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

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

单变量假设

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

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

为此,一旦您获得unsat,就可以确定范围了。只要您获得sat,就可以调整minBound / maxBound在较小范围内进行搜索。在最坏的情况下,这可能会变成线性游动,但是您可以通过确保在每个步骤中减小尺寸来“缩小”搜索范围。这可能是整个搜索的一个参数,具体取决于您希望间隔的大小。在尝试找到最大范围和您要在此搜索中花费多长时间之间,必须要做出选择。当然,如果削减得太多,您可能会错过很大的时间间隔,但这就是效率的代价。

Example1 (很好的情况),有一个约束说b != 5。这样一来,您的搜索就会很快,并且根据要走的分支,您会发现[0, 4][6, 255]都是8位字。

Example2 (不正确的情况)有一个约束说b is even。然后,您的搜索将表现出最坏的情况,如果您的“缩减”大小为1,则在确定[0, 0]之前,您可能会迭代255次;假设z3为您提供每次通话的最大奇数。

我希望可以说明这一点。不过,总的来说,我认为您会更接近于实际应用中的“好案例”,即使缩减大小很小,您也很可能会在几次迭代中收敛。当然,这完全取决于您的问题领域,但是我希望它能在总体上用于软件分析。