“TLA+ 常对 action 写 $WF {vars}(A)$ 或 $SF {vars}(A)$;SMV 工具用 FAIRNESS/justice/compassion 约束可接受路径。时序…”
性质随执行位置解释 ​
命题逻辑在一个状态赋值上判断
公式
常用算子包括 next、eventually、always 和 until,分别记作
直到公式
不是给状态加一个时间变量 ​
time 的整数再写普通一阶公式。时间来自转移序列的位置次序,状态可以完全不含物理时钟。
同样,done,没有给出多久之内。若规格要求“5 秒内响应”,需要离散计步界、实时逻辑或时间自动机,不能把定量上界藏在 eventually 的自然语言翻译里。
三类典型规格 ​
互斥安全性可写成
表示任何时刻两个进程都不同时处在临界区。一次有限前缀到达
请求—响应性质可写成
它要求每次请求后都存在未来授权,而不是只要求系统历史上曾出现过一次授权。公式若改成
“服务保持可用直到维护窗口开始”可写成
strong until 还要求维护最终开始;若维护可能永不到来、但服务应永远可用,则需要 weak until 或等价组合。自然语言中的“直到”常对这点含混,形式规格必须选定。
线性与分支时间 ​
线性时间把每条执行看作一条完整未来,公式在路径上解释。LTL 使用这种语义,系统满足 LTL 公式通常意味着所有初始路径都满足它。
分支时间在当前状态同时保留多种未来,并显式使用路径量词。CTL 可区分
前者说存在一条未来成功,后者说每条未来都成功。只画一条时间线无法表达分支选择是在当前发生还是以后发生。
线性与分支语义不是谁“更真实”的二选一。LTL 很自然地描述每次执行上的响应、公平与持续行为;CTL 很自然地描述从状态出发是否存在恢复路径或所有分支都安全。选择取决于规格想保留的观察结构。
有限行为、公平性与假设 ​
经典 LTL 默认无限路径。终止程序可给终止状态补自环,或改用有限轨迹语义;不同选择会改变
公式
assume–guarantee 写法还要区分环境假设和系统保证。把“不发生断电”与“协议最终响应”合成一个无条件公式,会让验证失败时无法判断是环境超出假设还是实现违背承诺。
从规格到验证算法 ​
时序逻辑定义性质语言,不规定如何求值。模型检查把系统模型与公式组合成判定问题;LTL 可经自动机转换检查接受环,CTL 常以状态集合不动点计算。
公式成立也只相对于给定模型及其原子命题标记。若实现错误被建模阶段遗漏,或 bad 标记没有覆盖真实危险条件,逻辑证明不会自动修复模型—实现差距。
参考资料
- Amir Pnueli, “The Temporal Logic of Programs,” FOCS, 1977, pp. 46–57。
- E. Allen Emerson, “Temporal and Modal Logic,” in Handbook of Theoretical Computer Science, Vol. B, Elsevier, 1990, Ch. 16。
- Christel Baier and Joost-Pieter Katoen, Principles of Model Checking, MIT Press, 2008, Chs. 3, 5–6。
- Zohar Manna and Amir Pnueli, The Temporal Logic of Reactive and Concurrent Systems, Springer, 1992, Chs. 1–3。