形式陈述 ​
设具体系统
这个等式包含两个方向:每条增广行为投影后仍是原系统行为;更重要的是,每条原行为至少有一种一致的预言标注。后一方向可写成
预言值可以在较早状态非确定地选取,后续规则只保留与真实未来一致的标注。证明从来不要求一个固定预言覆盖全部未来,也不允许程序读取它来改变原有控制。这样可用增广状态构造到抽象规格的映射,辅助 并发程序精化 中具体行为到抽象行为的见证。
若映射写作
直觉
有些具体状态从过去看完全相同,未来却会迫使它们对应不同抽象状态。普通 refinement mapping 只能看当前状态,无法知道该选哪一个。预言变量把“后来会揭晓的答案”贴成一张 proof-only 标签,使映射现在就能引用它;运行程序并没有获得预知能力。
这张标签允许猜错。猜错的增广分支以后无法延伸,但同一原执行必须至少有一个猜对的标注,所以擦除标签后行为一条不少。若一开始只允许正确答案中的某一个,或者让程序按标签选择分支,就不再是证明辅助,而是把原系统偷偷改得更确定。
例子与边界
具体状态含一个待处理集合 take 可以非确定地返回任一元素;抽象规格为了维护一个队列表示,必须更早确定“下一项”。加入
若初始化规则只允许 take 在运行时读取
Herlihy–Wing 队列提供更真实的未来依赖:enqueue 先预留数组槽再填值,dequeue 的扫描与后来填槽交错,中间具体状态未必唯一决定抽象队列顺序。可为 pending dequeue 记录它将返回的槽或值,再构造状态映射。所需预言可能是一组索引或一段未来选择,不保证总是单个有限标量。
推论与应用
预言变量与 history variable 方向互补:history 记录已经发生的事件,prophecy 为尚未决定的抽象匹配提供未来信息。它可以把某些后向模拟转写为带辅助状态的前向 refinement mapping,但二者不是定义上的同义词;后向关系也可以直接保留多个抽象前驱而不显式添加变量。
有限操作结束后应消费、验证或更新相应预言;多个 pending 操作可能需要按请求标识维护一张预测表。把一个旧预测错误复用于下一次调用,会把不同未来选择绑定在一起,投影后可能删除原本独立的行为。
Abadi–Lamport 的完备性定理带有重要前提:在其行为语义下,若 machine-closed 的
参考资料
- Martín Abadi and Leslie Lamport, “The Existence of Refinement Mappings,” Theoretical Computer Science 82(2), 1991, pp. 253–284。
- Leslie Lamport and Stephan Merz, “Prophecy Made Simple,” ACM TOPLAS 44(2), 2022, Article 7。
- Leslie Lamport, Specifying Systems: The TLA+ Language and Tools for Hardware and Software Engineers, Addison-Wesley, 2002, Chs. 6–8。