“TLA+ 风格把变量元组记为 $vars$,规格写成”
形式陈述 ​
从输入—输出关系到行为集合 ​
规格规定哪些结果或行为被允许。对输入集合
实现
这里的全称量词只覆盖规格定义域;若预期输入被漏出
有状态系统需要比较完整行为。令
若
程序逻辑的前置/后置条件、状态机不变量、时序逻辑公式与并发对象的调用—返回历史,都是选择不同
量词域与 assume–guarantee ​
环境假设
该式只约束满足
直觉
规格回答“哪些行为算正确”,实现回答“系统实际怎样产生行为”。证明逐一说明实现行为经观察后落入允许集合;反例搜索则尝试构造
中的元素。测试只采样这个差集,模型检查或演绎证明才试图覆盖规定量词域中的全部行为;精化则比较两个允许集合谁更具体。
形式化不会保证需求本身正确。规格可能遗漏输入、允许过多行为、把环境责任错写给系统,甚至彼此矛盾。验证结论始终是“相对于这个规格正确”,不能替代需求评审。
例子与边界
可复算的关系规格 ​
排序规格可要求输出
整数平方根给出更小的手算例。对
输入
行为域选错时的失败 ​
并发队列通常量化调用—返回历史,分布式复制协议还可能量化消息、故障与无限执行。若把两者都压成最终状态关系,实时顺序与进展责任会消失;最终数据相同不能证明中途返回值或可用性正确。
“程序没有崩溃”只是很弱的安全性质,不等于功能正确;“每个请求最终响应”是活性条件,也不保证响应内容正确。成本上界、概率错误与近似比只有被写入规格或单独保证时,才属于待验证合同。
若规格只量化无限公平执行,一个停在未响应请求上的有限最大执行可能被排除;对持续服务而言,这会掩盖死锁。应先说明哪些有限执行算完整行为,再说明哪些无限调度因公平假设被接受,而不是让“活性”一词代替这些选择。
推论与应用
算法正确性把实现执行与规格比较;精化把较具体行为限制到较抽象规格允许的范围;模型检查判定有限状态模型是否满足给定性质。
规格设计常先固定观察接口,再区分环境假设与系统保证。模块化验证依赖此边界:调用方只需依赖公开规格,被调用模块可以替换实现,只要继续满足同一合同。
参考资料
- Leslie Lamport, Specifying Systems, Addison-Wesley, 2002, Chapters 1–3.
- Carroll Morgan, Programming from Specifications, 2nd ed., Prentice Hall, 1994, Chapters 1–2.
- Michael Huth and Mark Ryan, Logic in Computer Science, 2nd ed., Cambridge University Press, 2004, Chapters 2–3.
- Bowen Alpern and Fred B. Schneider, “Defining Liveness,” Information Processing Letters 21(4), 1985, pp. 181–185.