SMT Solver
继上篇有关 SAT 的介绍,我们接着展开看看 SMT - Satisfiability Modulo Theories。 SAT 是基于布尔逻辑回答某个命题的可满足性,如
这里我们就提出了可满足性模理论 Satisfiability Modulo Theories:
- 给定一组理论,根据给定逻辑,求在该组理论解释下公式的可满足性
- 现有理论通常针对一阶理论,即公理都是一阶的
比如 EUF(Equality with Uninterpreted Functions):
以及等价关系的性质。
再比如线性方程组,算数求解之类的理论。
Eager Method
我们可以将 SMT 问题编码为 SAT 问题,如:
, 我们把 替换为 , 替换为 ,原式就变为了 , 然后根据 EUF 理论的传递性,我们得到一堆的 SAT 可解的命题:
从这个例子就可以知道,Eager 方法有许多问题,再摘自北大软件分析 PPT:
Lazy Method
把 Theory Solver 当作输出 SAT/UNSAT 的黑盒,那么我们可以先把命题看成 SAT 命题,然后有流程: 对于一个类似
- SAT Solver 将其看成
- SAT Solver 返回 SAT 并赋值
- 然后把
对应的公式组给到 Theory Solver - Theory Solver 返回 SAT/UNSAT
- SAT,继续让 SAT Solver 赋值,直到赋值 complete 为止
- UNSAT,表示 SAT 达到了 Conflict,加新约束到子句集中,若加入后不可满足了,那么宣告整个命题 UNSAT
Lazy 方法的优点与问题:
怎么解决这个问题呢? 我们只需要给 Theory Solver 加接口就行了,这个就是DPLL(T)算法了(懒得再写了,如北大 PPT 所示): 注意,这里的冲突项的前驱和 SAT 那篇文章里求合适分割是一样的。
混合多个理论 -- Nelson-Oppen 方法
本质和 SAT 与其他理论的结合一样,通过变形让同一个文字(Literal)变为不同的文字,然后 让不同的理论处理不同的文字,最后再结合不同 Theory Solver 的结果,也就是让不同理论之间通过 接口属性交换信息。但通常我们不能遍历所有的接口属性(通常是无限多的)。
注: 接口属性指的是两种理论都包含的命题集合
Nelson-Oppen 方法解决了这一问题,但他有一定的限定范围:
- 两个理论除等号外没有公共函数或者谓词
- 理论在某种无限域上成立
- 理论是凸的:
- 这里引入一个凸理论(Convex Theory),一个理论是凸的当其满足: 其对于每个变量自由的公式
,若 则 可以举个反例,对于 那么
但是无法推出 或
对于凸理论,我们只需要考虑变量之间的等价关系,这些关系则是有限的。
- 这里引入一个凸理论(Convex Theory),一个理论是凸的当其满足: 其对于每个变量自由的公式
基于以上限制,对于混合多个理论的命题,我们只需要沿着 AST 自底向上将其他理论的子树用变量替代即可, 对于以下例子,假设我们有 EUC 和线性方程组两个理论求解器:
令
在线性方程组理论中我们有:
故我们有共享变量
线性方程组理论解得:
接口属性经过 EUC 处理,再次求解得:
线性方程组求解得:
EUC 继而求到:
最后线性方程组求解
把例子扔了,我们只剩下一个简单的流程: 遍历
具体理论通常有高效的实现方式
对于非凸包
任何时候遇到一个等价关系的析取式,依次尝试每个等价关系, 如果任意一个得出 SAT,即整体 SAT, 如果全部 UNSAT,即整体 UNSAT。
Application
Z3 是一个基于 SMT 理论的求解器
Alive2 基于 Z3 完成了 LLVM-IR 的程序验证/refinement 关系验证的工作
Gitalking ...