“对无循环、表达式纯粹且总定义的片段,可用最弱自由前置条件写出精确的部分正确性义务 $P\Rightarrow wlp(C,Q)$。若选择总正确性 wp,则 $P\Rightarrow wp(…”
形式陈述
先固定确定性命令
逻辑蕴含在状态谓词上给出预序,按逻辑等价取商后形成偏序;它是所有保证总正确性的前置条件中最弱的一个。典型方程为
赋值方程依赖上述表达式假设。若
若只要求部分正确性,常使用最弱自由前置条件(wlp);文献中的记号约定必须明确。
直觉
最弱前置条件把验证方向倒过来:先说执行后要什么,再沿程序逆向计算执行前恰好需要什么。“最弱”意味着不多要求任何无关事实,因而所有能保证目标的前置条件都蕴含它。赋值时无需模拟所有状态,只把后置公式中的变量替换为赋值右侧;顺序语句则从最后一条一步步向前。循环会形成递归方程,实际验证通常用不变量给出可证明近似,而不是自动得到精确闭式。
例子与边界
对命令
在整数上即 x:=x+1; y:=2*x 与目标
边界是非终止:总正确性的 wp 必须排除会发散的初始状态,而 wlp 可把这些状态视为平凡满足。对非确定程序,通常采用 demonic 解释,要求所有可能执行都终止并满足
推论与应用
循环展示了结果保证与终止保证的区别。对整数程序 while x>0 do x:=x-1 和目标
按本页约定,总正确性 Hoare 三元组等价于逻辑义务
它也把程序看成谓词变换器,为指称语义提供一种面向性质的模型。
SMT 驱动的验证器可按所验证的正确性口径生成相应条件,再化简并求解背景理论公式;只验证安全性或部分正确性的工具,不因此证明终止。不变量发现、理论编码和求解分别有自己的可靠性边界。精化演算则反向使用谓词变换器,从规格逐步选择能建立目标的程序构造。
最弱前期望把后置布尔谓词推广为非负奖励函数:赋值仍作替换,概率分支使用加权平均,循环取最小不动点。后奖励一读出终止概率,而不是期望运行时间;对非终止路径的约定也必须与本页总正确性或部分正确性区分一致。
参考资料
- Edsger W. Dijkstra, “The Characterization of Semantics”, EWD 401, 1973,谓词变换器与终止要求。
- C. A. R. Hoare, “An Axiomatic Basis for Computer Programming,” Communications of the ACM 12(10), 1969,Full paper, assertion transformation implicit in axiomatic semantics。
- Edsger W. Dijkstra, A Discipline of Programming, Prentice Hall, 1976,Chs. 1–4, weakest preconditions and guarded commands。