动机

前言

介绍文章前,首先需要说明对于经典的 SMT(QF_NIA),基于 bit-blasting 做法,简而言之主要是以下三步:

  1. 先给整数变量一个有限位宽(bit-width)
  2. 把整数运算翻译成位向量电路
  3. 再交给 SAT solver

对于第一步而言,一个整数变量 其位向量可以表示为位宽为 的向量 ,其中 为符号位 。

而一个位向量对应的整数值由 计算得出。

然而,如果使用固定位宽的位向量,在整数域上是不完备的

Example

对于约束 而言,假定现在所有变量的位宽都为 ,那么在 QF_BV 中,,这是因为我们完全没有考虑溢出的情况,如果用位宽为 的向量来表示,就可以表示出 ,而不是

Search Box

每个整数变量都映射到一个有限闭区间 ,我们称为 search box,其决定了 bit-blasting 时的搜索空间。

问题

因此,在基于 bit-blast 的求解方法会带来三个问题:

  • 位宽太大,乘法和长加法会产生一个巨大的 CNF,导致 SAT 端压力爆炸
  • 位宽太小,搜索空间太窄,会频繁重启甚至根本搜不到解
  • 连续加法的结合顺序会影响中间结果位宽,从而影响布尔变量和子句规模

位宽启发式

乘法自适应位宽

对于一条带有乘法的约束,我们采用 BMA(Bit-width based on Multiplications Adaptive)来确定,其根据约束中乘法运算的数量()自适应地确定初始位宽。公式为:

其中, 表示约束中包含的乘法运算数量, 用于调节乘法数量对位宽削减的强度,为 表示基础位宽,为 为默认位宽(下限值),默认为

这样可以在乘法较少时尝试较大位宽以提高表达能力,在乘法较多时从小位宽开始以提升求解速度。

唯一图

我们定义 distinct 图如下:

Distinct Graph

给定图 ,其中 ,其中 为一条形如 的约束 (all-different)

若某个变量 的度数是 ,那么它至少需要 个不同值候选,因此给出候选位宽为

多项式约束

在多项式约束中,系数与常数项在一定程度上也确定了变量的取值范围:

  • 若常数项大,而某变量系数小
  • 那么该变量往往需要更大的范围才能抵消常数项

因此我们通过:

来确定变量 的大概位宽,其中 为系数, 为 x 的系数

截断

由于前两个启发式可能会给出较大的位宽(例如 ,我们可能会给 很大的位宽)

但是这样会导致生成的电路很大,所以在这里我们进行截断:

投票

最后,我们结合这几个启发式,可以得到一个位宽的候选序列:

其中, 表示位宽 在总位宽设置中所占的比例, 为投票阈值系数, 表示位宽等于 的变量数量,实验中

若集合 为空集,则候选位宽 将为 。当 时,我们将把 中所有变量的位宽设置为 的最大值。

贪心加

Info

总是优先相加当前 bit-width 最小的两个项

由于在整数多项式里,大量表达式会形成一长串 successive addition。虽然加法在语义上满足结合律,但在 bit-blasting 成本上不满足:

  • (a + b) + c
  • a + (b + c)

其中间结果位宽可能不同,因此最终布尔变量和子句数量不同。

我们基于前面的前提,总是优先相加位宽最小的两项,从而最小化 successive addition 过程中中间节点位宽之和,减少布尔变量与子句数,算法如下:

image.png

BLAN

结合后,提出了 BLAN 这个求解器,本质上对 UNSAT 并不完备,这是一个:一个对 SAT 实例 QF_NIA 强的 bit-blasting solver

算法如下所示:

image.png