“当组件要在不同环境中复用时,依赖—保证推理用关系规格替代全局两两检查;当干扰主要来自堆别名时,并发分离逻辑用资源所有权使许多交叉义务在语义上不可能发生。这些后续方法没有取消原子性和稳定性责任…”
形式陈述 ​
依赖—保证判断可写作
它表示:若执行期间每个环境步骤都属于二元关系
两个组件可组合的核心条件是
等价地,
并组合前后条件。包含方向不能反写;
稳定性仍按一步检查:
直觉
rely 是组件写给环境的“我能承受什么”,guarantee 是组件交给环境的“我最多做什么”。单独验证组件时,不必知道邻居的代码,只需在所有满足 rely 的干扰下维持自己的断言。组装时再核对每份保证是否落在对方依赖内,像把两份接口契约对接起来。
关系摘要比逐个原子语句更稳定。环境可以用完全不同的实现,只要每一步仍在 rely 允许范围内,原证明就可复用。不过摘要不能靠愿望变窄:真实环境若可能减少计数器,而 rely 只允许增加,局部证明的前提在组合系统里并未兑现。
例子与边界
状态含整数
线程 A 在
于是
若另有未建模线程执行 x:=0,它不属于任一 rely,组合结论立即失去前提。把 rely 放宽到任意改写
若 A 的保证误写成“最终令
推论与应用
依赖—保证规格支持分层开发:先在抽象共享状态上写关系,再分别精化组件实现。计数器单调性、版本推进、所有权状态机和锁保护协议都能写成二态公式;关系复合还可隐藏组件内部步骤,只向上层暴露稳定保证。
在大型验证中,关系若过于具体会泄露实现,过于宽泛又难以证明有用后置。实践常结合 ghost state、区域或分离资源,使 rely/guarantee 只描述真正共享的抽象状态。无论采用哪种表示,最后都要回到交叉包含与稳定性,而不能用“两个组件遵守同一协议”替代公式检查。
参考资料
- Cliff B. Jones, Development Methods for Computer Programs Including a Notion of Interference, Oxford University Computing Laboratory Technical Monograph PRG-25, 1981。
- Cliff B. Jones, “Tentative Steps Toward a Development Method for Interfering Programs,” ACM TOPLAS 5(4), 1983, pp. 596–619。
- Viktor Vafeiadis and Matthew Parkinson, “A Marriage of Rely/Guarantee and Separation Logic,” CONCUR, 2007, pp. 256–271。
- Willem-Paul de Roever et al., Concurrency Verification: Introduction to Compositional and Noncompositional Methods, Cambridge University Press, 2001。