闭环的四个阶段 ​
CEGAR 维护具体系统
可靠抽象要求
因此抽象系统证明安全即可推出具体安全。抽象系统发现反例却只说明“可能违反”,必须经过 concretization feasibility check。
精化应满足行为收缩
并排除当前伪反例。只增加新术语而不删除该路径,不构成有效精化进展。
伪反例从何产生 ​
考虑程序
x := 0
y := 0
while nondet:
x := x + 1
y := y + 1
assert x == y
只跟踪 x>=0、y>=0 的非关系抽象会允许某抽象路径到达
加入谓词
把循环常数换成另一个数字不会修复根因;真正新增的是变量关系这一表达能力。
路径可行性检查 ​
给定抽象动作序列
SAT 给出具体反例,可直接报告;UNSAT 证明至少有一处抽象连接无法由同一具体状态序列实现。
失败可能来自 guard 互斥、变量相关性或抽象合流。检查器要保留动作与状态帧对应,不能只逐边确认“某些具体状态能走这条边”;不同边的见证状态若无法连接,整条路径仍是伪的。
插值与谓词生成 ​
把不可满足路径公式分成前缀
且只使用两边共享符号。
另一策略从 unsat core、weakest precondition 或失败 transition pair 中选谓词。生成谓词要在表达力、数量和求解成本之间权衡;把路径公式所有子式都加入会迅速造成
精化后必须重新证明抽象 transfer 的 soundness。新的状态划分更细不意味着旧的转移边自动准确,需按谓词可满足性重新连接。
收敛与失败边界 ​
有限状态系统若精化策略最终能区分每个必要具体状态,最坏可退化到精确模型并终止。对无限状态软件,CEGAR 不保证找到有限谓词集,也可能不断产生新反例而不收敛。
求解器 unknown 既不是真实反例也不是不可行证明。把超时当 UNSAT 会错误删除可能真实路径,把它当 SAT 又可能报告无法重放的警报;工具应保留 unknown 状态。
精化也可能过拟合一条路径:加入只排除某个具体常数的谓词,下一轮出现同构伪反例。好的概括来自失败原因,而非反例表面数字。
与抽象解释的关系 ​
抽象解释提供可靠 over-approximation 的数学基础;CEGAR 是选择和迭代改进抽象的一种控制循环。它不是独立于 soundness 的“反复跑模型检查”技巧。
区间阈值、谓词集合、状态分裂和 transition refinement 都可成为 refinement 维度。每种选择要说明哪部分 concretization 变小以及为何仍覆盖具体行为。
终止时还应区分两种证书:真实反例附具体可行路径;安全结果附最终抽象的可靠性和抽象模型无反例证明。只保存“循环若干轮后工具返回 safe”不足以复核结论。
参考资料
- Edmund M. Clarke et al., “Counterexample-Guided Abstraction Refinement,” CAV, Springer, 2000, pp. 154–169。
- Thomas A. Henzinger et al., “Lazy Abstraction,” POPL, 2002, pp. 58–70。
- Kenneth L. McMillan, “Interpolation and SAT-Based Model Checking,” CAV, Springer, 2003, pp. 1–13。