“状态集合与转移关系给出最一般的无标号状态机骨架,动作和输入输出再按观察需求逐层加入。轨迹与路径语义从最大执行提取可观察行为;若还要解释状态命题,可在其上建立Kripke 结构。这些语义对象支…”
路径先于轨迹 ​
给定标号转移系统
路径保留内部状态和每一步的动作标签。有限路径有最后状态;无限路径包含可数无限多步;若一条有限路径的末状态无后继,它是最大路径。分析持续服务时通常关心无限路径,分析会终止的程序时则不能把有限最大路径丢掉。
动作轨迹是路径的动作投影
若存在不可观察动作
执行历史常记录并发操作的调用、返回和事件偏序;LTS 路径则由局部转移关系生成一个线性化步骤序列。二者可以互相编码某些观察,却不应默认每份并发历史都已经选择了唯一全序路径。
行为集合与前缀 ​
系统的路径语义和轨迹语义分别是它允许的路径集合与轨迹集合:
若只收集有限前缀,则每条轨迹的每个有限前缀也在集合中,形成 prefix-closed 语义。这非常适合安全性:一旦坏事发生,某个有限前缀已经足以见证违反。活性通常需要完整无限行为,因为任意有限前缀仍可能在未来兑现承诺。
有限轨迹集合是否包含非最大前缀必须明确。把“用户发出请求”这一半截执行算作系统完成行为,和仅把它算作可继续前缀,会得到不同的 refinement 与测试结论。
隐藏内部步骤的例子 ​
设服务收到 request 后有两条内部路径:缓存命中时执行 reply。完整路径可以是
或
删除内部标签后,两条路径都有可见轨迹 request reply。若 fast-renew,而 slow-renew,当前短轨迹仍看不出这项分支差异;观察更长轨迹才可能区分。
更强的例子是两个系统拥有完全相同的可见轨迹集合,却在每一步的分支时机不同。环境若能在分支之后选择交互动作,就可能分辨它们。互模拟保留逐步分支结构,通常比单纯 trace equivalence 更强。
投影、隐藏与重命名 ​
给定可观察动作集
这些操作必须作用于整条行为并尊重顺序。仅比较“出现过哪些动作”的集合会丢失先后与重复次数,例如 open close 和 close open 拥有相同动作种类,却显然不是同一轨迹。
投影也不总与最大性相容。一条包含无限多个内部步骤、但只有有限多个可见动作的路径,投影后可能成为有限轨迹;这就是 divergence。若语义把它与正常终止视为相同,就会掩盖系统永远在内部忙等的事实,因此有些模型另外记录发散标记。
状态轨迹与停顿 ​
若状态带原子命题标记
连续若干状态可能拥有同一可观察标记。把有限次重复压缩后比较得到停顿等价;它适合把实现内部微步视作不可见,但含 next 运算子的时序公式一般能数出这些重复,因而不保持该等价。
路径语义不会自动规定公平性。一个始终使能却永不执行的动作,仍可能出现在系统允许的无限路径中;要排除这种调度,需要另加公平性约束。把期望的公平路径直接从例子中挑出来,会把规格假设伪装成模型事实。
语义边界与使用方式 ​
轨迹等价只比较所选观察接口下的行为集合。接口变粗,更多实现会变得等价;接口变细,原先隐藏的状态、时间或失败原因会重新可见。因此任何“两个系统行为相同”的陈述都要同时给出动作字母表、隐藏集合和有限/无限语义。
时序逻辑在这些执行序列上解释“最终”“始终”“直到”;反例与见证轨迹把逻辑失败还原成一条可读行为。逻辑是对行为集合提出性质,不替代本页对行为本身的定义。
参考资料
- C. A. R. Hoare, Communicating Sequential Processes, Prentice Hall, 1985, Chs. 1–3。
- Robin Milner, Communication and Concurrency, Prentice Hall, 1989, Chs. 2–5。
- Christel Baier and Joost-Pieter Katoen, Principles of Model Checking, MIT Press, 2008, §§2.1–2.3, 3.2。