“状态集合与转移关系给出最一般的无标号状态机骨架,动作和输入输出再按观察需求逐层加入。轨迹与路径语义从最大执行提取可观察行为;若还要解释状态命题,可在其上建立Kripke 结构。这些语义对象支…”
状态上的命题标记 ​
Kripke 结构写作
其中
给出每个状态中为真的原子命题。状态
它可以看作标号转移系统的状态标记版本:LTS 把标签放在边上,Kripke 结构把逻辑可观察事实放在节点上。边动作可以通过增加中间状态编码成状态命题,状态标记也可附到 LTS 上;两种表示的转换会增加状态或改变一步的粒度,不能假装完全没有代价。
命题逻辑只在单个赋值上判断布尔组合。Kripke 结构额外给出从当前状态可能延伸出的路径,使逻辑能够量化未来分支。
路径与 total 约定 ​
从状态
许多 CTL、CTL* 和经典 LTL 模型检查教材要求
真实程序可能终止。常见编码是在终止状态加入自环,让标记永久保持;另一做法是采用明确的有限轨迹语义。两者对 next 算子和“未来必有某事件”可能给出不同答案,模型必须说明采用哪一种。
初始集合可以含多个状态,用来表示未知输入或环境初始选择。判断整个系统满足状态公式
只检查一个方便的初始状态不能替代这个全称量词。
双进程互斥模型 ​
令每个进程位置属于
若模型错误地允许两个进程从
在末状态有
“每个尝试进程最终进入临界区”还需要观察整条路径,并通常依赖调度公平性。状态图没有坏状态只能证明互斥安全性,不能由此推出无饥饿。
分支结构为何重要 ​
在状态 success,从 retry。性质“存在一条路径最终成功”和“所有路径最终成功”在
这正是分支时序语义需要保留的结构。若只列出一条样例执行,存在量词看似得到见证,却完全没有检查其他分支;若把所有未来先压成一个动作集合,分支选择发生在何时也会丢失。
CTL 把路径量词
与其他 Kripke 模型的边界 ​
模态逻辑和直觉主义逻辑也使用称为 Kripke frame/model 的结构,但可达关系、单调赋值和满足关系的条件随逻辑而变。本页的对象专指并发系统模型检查中带状态标记的转移结构,不是“一阶模型论中的任意结构”的总称。
Kripke 结构也不含转移概率。若从状态出发的多条边带概率,需要 Markov 链或 MDP;把非确定分支平均分配概率会擅自改变系统语义。
有限 Kripke 结构可显式枚举,状态由多个变量组合时却可能指数增长。模型检查问题规定如何判定
参考资料
- Edmund M. Clarke, Orna Grumberg, and Doron A. Peled, Model Checking, MIT Press, 1999, Ch. 2。
- Christel Baier and Joost-Pieter Katoen, Principles of Model Checking, MIT Press, 2008, §§2.1, 3.1, 6.1。
- Michael Huth and Mark Ryan, Logic in Computer Science, 2nd ed., Cambridge University Press, 2004, Chs. 3–4。