“中间的 Hoare 三元组 要求每次循环体若终止,都会在下一次判断 guard 前重新建立 $I$。第一项把调用者状态带入不变式,第三项说明退出时不变式足以得到目标;三项缺一不可。省略外层…”
形式陈述
Hoare 三元组写作
其中
用终止执行关系写出量词,部分正确性就是
这里同时量化初态和终态;在非确定语言中,所有正常终止的分支都必须满足后置条件。若错误执行不产生普通终态,这个公式本身不会排除错误,必须另加安全性要求或把错误纳入结果规范。不能把“没有错误”无条件读进仅讨论正常终止的三元组。
后果规则允许加强前置条件、减弱后置条件:若
直觉
三元组是一份条件契约:调用者提供
例子与边界
在无溢出的整数语义中,三元组
赋值规则从后往前推条件:为了赋值后满足
对 while true do skip,部分正确性三元组
边界是并发或异常:普通顺序三元组未说明其他线程可否修改状态,也未说明异常出口。需要并发分离逻辑、原子规范或带多个后置条件的扩展,才能准确覆盖这些行为。
推论与应用
Hoare 三元组是公理语义的基本判断。最弱前置条件通常同时要求终止与后置条件;只要求“若终止则满足后置条件”的对应算子称为最弱自由前置条件(wlp)。对死循环,前者为假,后者为真,这正是两种正确性的区别。循环不变量把任意迭代次数上的性质压缩成初始化、保持和退出三个有限证明义务。
分离逻辑把
参考资料
-
Benjamin C. Pierce et al., Software Foundations, Volume 2: Programming Language Foundations, 在线版,2026 年访问,Hoare Logic, Part I:赋值规则及部分正确性。
-
C. A. R. Hoare, “An Axiomatic Basis for Computer Programming,” Communications of the ACM 12(10), 1969,Full paper, axioms and rules for assignment, sequencing, conditionals, and loops。
-
Edsger W. Dijkstra, A Discipline of Programming, Prentice Hall, 1976,Chs. 1–2, assertions and guarded commands。