“形式化验证可以把实现状态映射到“共同 committed 前缀 + 确定状态”的抽象机,并用精化关系说明选主、重试和快照等内部步骤不改变外部历史。模型检查适合在有限副本和有界状态下搜索不变式…”
Model–Specification–Decision–Witness ​
一项模型检查任务由四部分组成:
- Model:有限或有限表示的系统模型
,包括初始状态与转移; - Specification:在明确语义下解释的规格
; - Decision:判定指定初始行为是否满足规格;
- Witness:为违反、存在性成立或证明成功提供可核验的诊断对象。
对Kripke 结构
局部问题给定单个状态
decision 至少返回 satisfied 或 violated。witness 可以是违反时的反例路径、存在性公式成立时的见证路径,或安全证明中的归纳不变式。证书能否由较小内核独立检查,是工具可信边界的一部分;布尔答案本身没有解释模型和规格是否写对。
一个小型互斥检查 ​
设两个进程的组合状态为
显式检查可以从初态枚举可达图;一旦到达
这个结论的量词覆盖模型中的全部可达交错,不只是测试运行采样到的路径。反过来,它只覆盖模型写出的进程位置、共享变量和转移;若真实代码还有未建模的中断处理,模型检查并未验证那条实现路径。
求解路线不属于问题定义 ​
“模型检查”是一类判定任务,不是一种固定搜索算法。显式搜索枚举可达图,符号方法压缩状态集合,自动机路线寻找接受环,有界方法只展开有限深度,归纳方法则学习可推广的安全证书。它们共享同一个 model–specification–decision 接口,却有不同的完备条件、资源尺度和 witness 形状;选择哪条路线不能改变原问题的满足关系。
复杂度的正确尺度 ​
显式图已经给出时,基本可达性成本按
公式大小同样属于输入。CTL 检查对显式 Kripke 图和公式大小可做到近线性乘积量级;LTL 路线通常在公式长度上产生指数规模的自动机,再对乘积图做线性搜索。复杂度陈述必须指出模型表示、逻辑种类与公式是否固定。
无限状态系统不能直接以有限
反例、无反例与证明 ​
安全性质的反例通常是一条到达坏状态的有限路径;liveness 反例常是 stem 加 cycle 的 lasso,表示无限重复的坏行为。CTL 的存在或全称子公式还可能需要树状 witness,而不总是一条线性路径。
有界模型检查找到长度不超过
反例也不自动定位根因。最短反例减少路径长度,却可能穿过多个症状状态;工程诊断还需映射回源代码、输入和环境假设。
模型、规格与实现三层 ​
正确性陈述必须固定被验证对象。模型检查能证明
规格本身也可能错误。公式
有限状态不等于小状态。并发组件的笛卡尔积、变量域和队列内容都会造成状态空间爆炸。某种表示或约简能否缓解它,取决于模型结构和待保持性质;把工具链名称列得更长,不会让任意系统自动变得紧凑。
参考资料
- Edmund M. Clarke and E. Allen Emerson, “Design and Synthesis of Synchronization Skeletons Using Branching Time Temporal Logic,” Logic of Programs, Springer, 1981, pp. 52–71。
- Edmund M. Clarke, Orna Grumberg, and Doron A. Peled, Model Checking, MIT Press, 1999, Chs. 1–4。
- Christel Baier and Joost-Pieter Katoen, Principles of Model Checking, MIT Press, 2008, Chs. 1, 4–6。
- Edmund M. Clarke, Thomas A. Henzinger, Helmut Veith, and Roderick Bloem, eds., Handbook of Model Checking, Springer, 2018, Chs. 1–3。