Skip to content

定义Definition

Hoare 三元组

Hoare triple

断言若前置条件成立且程序终止,则后置条件成立的 {P}C{Q} 形式。

形式陈述 ​

Hoare 三元组写作

{P} C {Q},

其中 P,Q 是程序状态谓词,通常由一阶逻辑公式表达;C 是命令。按部分正确性解释:对任意满足 P 的初始状态,若 C 终止于状态 σ′,则 Q(σ′) 成立。总正确性三元组额外要求从每个满足 P 的状态出发都终止。

用终止执行关系写出量词,部分正确性就是

∀σ,σ′.P(σ)∧⟨C,σ⟩⇓σ′⟹Q(σ′).

这里同时量化初态和终态;在非确定语言中,所有正常终止的分支都必须满足后置条件。若错误执行不产生普通终态,这个公式本身不会排除错误,必须另加安全性要求或把错误纳入结果规范。不能把“没有错误”无条件读进仅讨论正常终止的三元组。

后果规则允许加强前置条件、减弱后置条件:若 P′⇒P、{P}C{Q}、Q⇒Q′,则 {P′}C{Q′}。加强前提缩小允许调用的状态,减弱结论减少承诺,两个方向恰好都不会新增证明负担。

直觉

三元组是一份条件契约:调用者提供 P,程序在终止时承诺 Q。它不要求 Q 完整描述最终状态,只需陈述当前证明关心的事实;未提及的变量可能改变。部分正确性中的“若终止”是最容易被忽略的量词,死循环可以平凡满足许多三元组。前置条件为假时也没有合法初始状态,因此三元组真但没有实际运行内容。

例子与边界

在无溢出的整数语义中,三元组 {x=n} x:=x+1 {x=n+1} 有效,其中 n 是记录初值的逻辑变量,命令不能修改它。更弱的后置条件 x>n 也有效,而 x=n+2 无效。若使用有符号定宽整数,还须明确溢出规则,不能照搬整数上的结论。

赋值规则从后往前推条件:为了赋值后满足 Q,应在赋值前检查 Q[x←e]。例如目标为 x>5,命令为 x:=x+1,代入得到 x+1>5,也就是整数初态下的 x>4。替换的是后置条件中表示新值的自由 x,不是先把程序状态真的执行一遍。

对 while true do skip,部分正确性三元组 {P}C{Q} 对任意 P,Q 都成立,因为不存在终止执行;若 P 可满足,相应总正确性三元组不成立。总正确性通常还需一个在循环中严格下降、又不能无限下降的量来证明终止。

边界是并发或异常:普通顺序三元组未说明其他线程可否修改状态,也未说明异常出口。需要并发分离逻辑、原子规范或带多个后置条件的扩展,才能准确覆盖这些行为。

推论与应用

Hoare 三元组是公理语义的基本判断。最弱前置条件通常同时要求终止与后置条件;只要求“若终止则满足后置条件”的对应算子称为最弱自由前置条件(wlp)。对死循环,前者为假,后者为真,这正是两种正确性的区别。循环不变量把任意迭代次数上的性质压缩成初始化、保持和退出三个有限证明义务。

分离逻辑把 P,Q 解释为堆资源并通过框架规则实现局部推理。函数契约和 API 规范都可看作三元组的工程化形式;SMT 软件验证则把赋值、分支和不变式规则产生的条件交给求解器。三元组的语义有效性量化所有满足 P 的运行,求解器只回答某个编码公式是否有反模型,因此编码与规则的可靠性仍是独立证明义务。

参考资料
  • 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。

关系图谱25 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系