形式陈述
两类查询,两个起点
给定状态空间 S 、初始谓词 I 、转移关系 T 和安全谓词 P ,取整数 k ≥ 1 。本页不要求每个状态都有后继。k 归纳用以下两个反例公式:
B k = ⋁ j = 0 k − 1 ( I ( s 0 ) ∧ ⋀ i = 0 j − 1 T ( s i , s i + 1 ) ∧ ¬ P ( s j ) ) , D k = ( ⋀ i = 0 k − 1 P ( s i ) ) ∧ ( ⋀ i = 0 k − 1 T ( s i , s i + 1 ) ) ∧ ¬ P ( s k ) . B k 是有界模型检查 理路 有界模型检查 Bounded model checking · BMC · SAT-based bounded model checking 将前 k 步转移展开为 SAT 公式寻找有界反例,并明确无解结果何时不能升级为全局证明。 到转移深度 k − 1 的初始反例查询,包含 j = 0 。D k 有 k 条转移和 k 个安全前态,不含初始条件 I ( s 0 ) :它检查任意连续安全窗口能否再跨一步到坏状态。空转移合取取真,所以 k = 1 的 base 就是初态安全。
若二式都 UNSAT,则全部从 I 出发的可达状态满足 P 。B k 为 SAT 给真实可达反例;D k 为 SAT 只给归纳步反例,其起点可能不可达。这个区别沿用不变式与归纳不变式 理路 不变式与归纳不变式 Invariant · Inductive invariant · Strengthened invariant 区分所有可达状态上成立的性质与由初始性和一步闭包直接证明的归纳不变式。 的量词,而不是求解器输出格式上的区别。[1, §2.2]
安全定理的证明
反设存在坏状态,取一条首次到坏状态的最短执行 s 0 , … , s n 。若 n < k ,它直接满足 B k 的第 n 个析取支,矛盾。若 n ≥ k ,首次错误之前全部状态安全,于是最后 k 条转移及前 k 个安全状态满足 D k ,仍矛盾。
这个证明只需有限坏前缀,不假设程序最终终止,也不假设转移总定义。它证明“任何可达状态不坏”,不证明响应最终发生等活性性质。
直觉
一步屏障不够时,多看一段历史
普通归纳假设当前一个状态安全,便要求下一状态安全。k 归纳要求连续 k 个前态都安全,再证明下一状态安全。有些不可达状态虽然自己安全,却根本没有足够长的安全前缀;扩大窗口会把这些干扰排除。
窗口不能代替入口检查。一个系统可能从一开始就坏,此时“连续若干步安全”永远不成立,归纳步空真。base 的任务是把实际初始执行接进这个归纳规则。
例子与边界
一步失败,两步成功
取 S = { 0 , 1 , 2 , 3 } ,I = { 0 } ,全部转移为
0 → 1 , 1 → 1 , 2 → 3 , 3 → 3 , P ( s ) ≡ s ≠ 3. k = 1 时,B 1 UNSAT,因为初态0安全;D 1 SAT,见证为 ( 2 , 3 ) 。这不是实际错误轨迹,因从0只能到1,再停在1。
k = 2 时,B 2 同时检查深度0和1,只有初态0及其后继1,都安全。若 D 2 SAT,需要两个连续安全状态 u , v 再到3。能到3的安全 v 只能是2,但图中没有进入2的边,所以这样的窗口不存在,D 2 UNSAT。二式一起证明全局安全。
如果仅报告“BMC查了两步没错”,还没有这个全局结论;证书中必须另交任意起点的 D 2 排除理由。
不可达安全环使所有k都失败
在同一图添加 2 → 2 。实际可达集仍为 { 0 , 1 } ,性质仍真,但对每个 k ≥ 1 都有
个 安 全 状 态 2 , 2 , … , 2 ⏟ k 个安全状态 , 3 满足 D k 。因此只是不停加大 k ,不保证有限状态安全系统最终得到证明。下载脚本复算 k = 1 , … , 8 ;上面的任意 k 构造才证明全部深度都会失败。
可加入已独立验证的辅助不变式 Q ( s ) ≡ s ≤ 1 ,用 P ∧ Q 做一步归纳。初态0满足,边 0 → 1 , 1 → 1 保持,故可直接证明并推出 P 。若 Q 只是未经验证的猜测,不能悄悄用它排除状态2;可先通过Houdini 理路 Houdini 不变式推断 Houdini invariant inference · Houdini algorithm 从有限谓词候选中反复剔除初始化或保持失败项,输出可独立复核的归纳合取,并证明候选语言内的最大性。 或人工归纳检查建立证书。
别把不可延长短路径丢掉
设系统只有初态0,0已经坏且没有出边。B 3 的 j = 0 支仍可满足,准确报告错误。若误把 base 写成必须先走满两条转移再问此前是否坏,整个公式不可满足,会漏掉这个短反例。本页逐个前缀的析取避免依赖停顿补边。
另取一个坏初态自环系统。D 1 由于要求安全源状态而 UNSAT,B 1 却 SAT。这个例子说明归纳步通过并不足够,甚至不能证明初始执行的第一瞬间安全。
推论与应用
证书、成本和增强版本
一个可检查报告应包括 k 、状态编码、I , T , P 、各 base 深度的结果、归纳步查询及其证据。真实反例要给从初态开始的逐步路径;归纳失败要明确标记为可能不可达的窗口;unknown 和超时均不给安全结论。
按时间帧共享前缀的布尔电路表示,base 的各前缀可以逐层增量建立,k 个深度总构造规模为 O ( | I | + k ( | T | + | P | + 1 ) ) ;step 同样复制 k 帧。若不共享而把每个前缀完整复制,base 大小可能增至二次量级。公式规模线性不表示 SAT/SMT 求解时间线性,显式枚举长度 k 的路径也可能指数增长。
有限状态系统可进一步在归纳窗口加入“两两状态不同”的简单路径条件。其可靠性需回到最短坏路径:最短路径不会重复状态,否则删去环可得到更短坏路径。因此,当 base 覆盖相应短长度时,排除所有简单安全窗口已足够;有限状态也限制了这种窗口的最大长度。原文[1]讨论该增强及增量求解。本页脚本没有加入唯一状态条件 ,上面不可达自环反例正用于说明基础版本的边界。
PDR/IC3 理路 Property-Directed Reachability / IC3 Property-directed reachability · PDR · IC3 以 SAT 查询阻塞坏状态前驱、学习逐层归纳子句,最终得到反例或安全归纳不变式。 通过学习阻塞子句得到归纳屏障,k归纳通过展开窗口寻找证明;二者可配合辅助不变式,但不是同一个算法的不同名字。
迁移练习:将原四状态图的初态改成2。k = 1 的 base 仍通过而 step 失败;k = 2 的 base 在深度1发现真实路径 ( 2 , 3 ) ,应报告不安全,不能因原来的 D 2 UNSAT 就重用安全结论。初始化也是证书的一部分。
参考资料
[1] Niklas Eén、Niklas Sörensson,Temporal Induction by Incremental SAT Solving ,Electronic Notes in Theoretical Computer Science 89(4),2003,543–560页;作者上传全文§2.2给 base、step 与 Unique 条件,§§3–4讨论增量求解及可靠性。本文明确采用不含 Unique 的基础k归纳,并独立固定索引和给出最短坏前缀证明。
[2] Chalmers出版记录 核对两位作者、卷页与2003年出版信息;作者稿页眉另标2004,不据稿件页眉改写正式出版年。