形式陈述 ​
总正确性判断
循环规则在 循环不变式 Hoare 规则 的初始化、保持和退出义务上再加变式。设
由于 良基关系 不存在无限下降链,循环体不可能被无限执行。若取
“看起来越来越小”不能替代值域、严格性和循环体终止这三项条件。
规则的反证结构很直接。若循环存在一条无限执行,每次 guard 为真并完成 body 后都会产生
这与
直觉
不变式回答“走到任何一轮都没有偏离正确区域”,变式回答“还剩多少不能无限消耗的进度”。一项是护栏,另一项是倒计时。倒计时不必是运行时间的精确估计,只需每次实际继续循环时落到更小的良基元素。
自然数适合单阶段循环;嵌套阶段可能需要字典序对、多重集合序或序数。复杂值域并不会自动带来证明,仍要展示每个程序分支严格下降。反过来,若某些步骤保持度量不变,就必须证明它们之间不能无限停顿,或换用能同时记录阶段与大小的组合变式。
例如外层剩余任务数为
例子与边界
用重复减法计算非负整数除法:
q := 0
r := n
while r >= d do
r := r - d
q := q + 1
前置为
初始化显然成立。若 guard 为真,则新值
guard 给
若允许
推论与应用
总正确性把安全证明与终止证书组合为可复查的规则。递归过程可用参数上的良基下降替代循环变式;项重写系统用简化序;自动终止分析则尝试合成线性、词典序或分段排名函数。合成器没有找到候选,只说明当前模板失败,不是程序必然发散。
验证工具还必须区分正常返回、异常、stuck 与非终止。若异常属于接口允许的完成方式,需要相应后置条件;若目标要求正常返回,异常路径就是总正确性反例。性能上“很慢”和逻辑上“必终止”也是不同结论:良基证明不提供实用时间界,除非进一步量化每次下降的成本和初始度量。
总正确性也有可组合性侧面:顺序
参考资料
- Edsger W. Dijkstra, A Discipline of Programming, Prentice Hall, 1976, Chs. 1–4。
- Krzysztof R. Apt, Frank S. de Boer, and Ernst-Rüdiger Olderog, Verification of Sequential and Concurrent Programs, 3rd ed., Springer, 2009, Chs. 3–5。
- Glynn Winskel, The Formal Semantics of Programming Languages, MIT Press, 1993, Ch. 7。
- Nachum Dershowitz and Zohar Manna, “Proving Termination with Multiset Orderings,” Communications of the ACM 22(8), 1979, pp. 465–476。