Skip to content

方法Method

显式状态模型检查

施工中 · 内容逐步修订

Explicit-state model checking · Explicit model checking

逐个生成和存储可达状态,以图搜索检查安全性及接受环的模型检查路线。

形式陈述 ​

状态生成接口 ​

显式状态模型检查不要求预先列出整张图,而是提供三个可计算接口:初始状态枚举器 Init、后继生成器 Succ(s) 与性质检查器 bad(s)。算法从初始状态开始逐个生成可达节点和转移。

对安全性质,worklist 版本维护已见集合 V 与待处理集合 W:

V←I,W←I.

每次从 W 移除一个 s,若 bad(s) 则返回反例;否则对每个 s′∈Succ(s),仅在 s′∉V 时记录父边并加入 V,W。初始状态的父指针为空,表示反例路径的起点。状态必须在入队时加入 V,否则两个前驱可能重复排入同一后继。有限可达图中每个状态至多处理一次,当 W 为空时,所有可达状态均已检查。

这是模型检查的安全可达性特例。其正确性由三个 worklist 不变量支撑:W⊆V;V 中每个状态都由一条已记录的初始路径到达;每个已展开状态的全部后继都已进入 V。因此报告 bad(s) 时,父边链给出合法反例,保证 soundness。

若 W 为空却仍有可达状态 t∉V,取到 t 的最短路径,并看路径上第一个不在 V 的状态;它的前驱在 V 中且已经展开,按第三个不变量本应把它加入 V,矛盾。故有限搜索终止时已覆盖全部可达状态,对安全性结论 complete。

这段证明依赖状态相等判定与后继生成器忠于模型。哈希遗漏语义变量会错误合并状态;把无关地址或时间戳纳入键,又会阻止本应共享的状态去重。算法框架正确不能补偿错误的状态编码。

直觉

BFS 的最短反例轨迹 ​

设系统初态 s0 有两个分支:一条经 s1,s2 到坏状态 b,另一条经十个状态后也到 b。BFS按距离分层展开,第一次发现 b 时父指针给出步数最短反例

s0→s1→s2→b.

最短按转移条数计,不一定是最短现实时间或最容易理解的根因。若边有成本,普通 BFS 的最短性不适用。

BFS frontier 可能非常宽,内存通常是瓶颈。DFS只保留搜索栈与 visited 表,更早深入某条长路径,却不保证最短安全反例。

显式状态搜索的 frontier、visited 与反例
例子与边界

无限性质与嵌套 DFS ​

检查 Büchi 接受条件需要寻找从初态可达的接受环。经典 nested DFS 先做外层 DFS;当一个接受状态完成时,再从它启动内层 DFS,检查能否回到仍相关的搜索区域。

若找到 stem u 到达接受状态 f,再找到从 f 返回 f 的非空 cycle v,就得到 lasso

uvω.

只发现一个接受状态不够。例如 s0→f→d,其中只有 f 接受而 d→d:唯一无限执行只访问 f 一次,因此不满足“无限次访问接受状态”。若改为 f→g→f,则 s0(fg)ω 无限次访问 f,构成接受运行。验证 LTL 时,这里的图通常是系统与否定性质自动机的乘积图;接受运行因此表示原性质的反例,而不是原系统中任意一个循环。

也可以在可达图上做强连通分量(SCC)分解:普通 Büchi 只需找到含接受点的可达循环分量。完整请求系统积图给出了一个可以手算的任务:两个初始积状态展开出五个顶点、七条边,分为三个 SCC。接受点 Rb 所在分量没有自环,不能报告;Wb 的接受自环才交付 lasso。算法若只按系统分量 r,w,g 去重,会把同一位置的不同监控义务合并,破坏这个结论。

这个任务的已解变体只删系统等待自环,积仍有五个可达顶点,但仅剩五条边。两个接受点都存在,却没有接受循环;其中一个积点没有后继,是自动机猜测被后续授权否定的结果。后继生成器应返回空集,不得为保持图的 total 性自行补边。

不同 nested DFS 变体对颜色、搜索次序和 on-the-fly 产品构造有严格不变量;把两个普通 DFS 随意嵌套可能漏环或重复指数工作。

复杂度与真实存储 ​

若可达显式图有 N 个状态、E 条边,安全搜索的时间为 O(N+E),visited、父指针和 frontier 使用 O(N) 辅助空间。若完整邻接表已经物化,图存储还需 O(N+E),不能把辅助数组的界当成总存储界。普通 Büchi 的 SCC 判空也在这个显式规模下使用 O(N+E) 时间。这里 N 是展开后的状态数,不是程序变量数或源代码行数。

每个状态还需序列化、归一化和哈希;每条转移需执行 guard 与 update。若状态包含大堆对象,单个节点成本不是常数。严谨报告应给出状态数、转移数、每状态字节和峰值 frontier。

哈希压缩若允许碰撞并把碰撞视为相等,会漏状态,成为有损搜索;只用哈希定位后再比较完整状态才能保留可靠性。bitstate hashing 明确以可能漏报换内存,结论不能写成完全证明。

工程边界 ​

对称约简、partial-order reduction 与状态压缩可以嵌入显式搜索,但各自需要证明代表状态覆盖原行为。搜索框架相同不意味着约简天然 sound。

动态内存、未界队列和递归栈使状态空间无限。给队列设上界能得到有限模型,却只验证该界内行为;若反例需要更长队列,“无反例”不能推广到原系统。

显式检查的优势是状态和反例直观、算法成本可按展开图解释;缺点是已探索的组合状态仍需逐个表示。状态空间爆炸分析这种增长从何而来,符号模型检查则用一个布尔对象表示整批状态。后者可能压缩规则集合,也可能因表示膨胀更差;两条路线改变表示,不改变满足语义。

推论与应用

搜索状态的规范化 ​

并发状态若含无关进程编号、堆对象地址或消息排列,可以在入 visited 前做 canonicalization,但规范化必须保持后继行为和观察。两个状态排序后字节相同却拥有不同权限或未来动作时,合并会漏路径。正确做法是先证明 canonical representative 与原状态模拟或对称等价,再把它作为去重键,而不是凭数据外观压缩。

无限状态系统不能总靠列出全部状态结束搜索。后向覆盖算法保存向上闭坏状态集的有限最小基,Karp–Miller 树则从初态用 omega 概括可泵大的 Petri 计数。二者都回答覆盖问题,不能把摘要中的一个目标直接当作精确可达状态。

参考资料
  • Rob Gerth, Concise Promela Reference, SPIN 官方参考,1997,Analysis 部分:穷尽搜索、接受环及 bitstate 有损搜索。

  • Gerard J. Holzmann, The SPIN Model Checker, Addison-Wesley, 2004, Chs. 6–9。

  • Edmund M. Clarke, Orna Grumberg, and Doron A. Peled, Model Checking, MIT Press, 1999, Chs. 2, 9。

  • Costas Courcoubetis, Moshe Vardi, Pierre Wolper, and Mihalis Yannakakis, “Memory-Efficient Algorithms for the Verification of Temporal Properties,” Formal Methods in System Design 1, 1992, pp. 275–288。

关系图谱11 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系