Hoare三元组

概述

Hoare三元组(Hoare Triple)记为 ,其中 前条件(precondition) 是程序语句,后条件(postcondition)。它断言:若执行 为真且 终止,则执行后 为真。由 C. A. R. Hoare 于 1969 年提出,是公理语义学的基石。

定义

Hoare三元组的语法和语义

语法:Hoare 三元组写作 ,其中:

  • 前条件(precondition),一个描述程序执行前状态逻辑公式
  • :程序语句(可以是赋值、条件、循环或复合语句)
  • 后条件(postcondition),一个描述程序执行后期望状态的逻辑公式

部分正确性语义 表示:

完全正确性语义(方括号记法)表示:

部分正确性与完全正确性的 Hoare 三元组表示

  • 部分正确性使用花括号:
    • 含义: 为真且 终止 为真
    • 不保证 终止
  • 完全正确性使用方括号:
    • 含义: 为真 终止且 为真
    • 同时保证终止性和结果正确性

两者关系: 成立当且仅当 成立 下必定终止。

五条推理规则

1. 赋值规则(Assignment Rule)

其中 表示将 中所有自由出现的 替换为表达式

直觉:要使赋值后 成立,只需在赋值前 的位置换成 后成立。

2. 条件规则(Conditional Rule)

直觉:分别验证两个分支在各自条件下都能从 达到

3. 循环规则(Loop Rule)

其中 循环不变量(loop invariant), 是循环条件。

直觉:若 在循环前为真,且每次迭代后 仍为真(不变量保持),则循环终止时 成立。

4. 复合规则(Composition Rule)

直觉: 的后条件恰好是 的前条件,中间断言 连接两段程序。

5. 合取规则(Conjunction Rule)

直觉:若程序 在前条件 下分别满足两个后条件,则同时满足两者的合取。

推理规则应用示例

示例:验证程序 x := 1; y := x + 1 满足

证明

  1. y := x + 1 应用赋值规则:
    • 后条件为 ,将 替换为 ,得 ,即
    • 所以
  2. x := 1 应用赋值规则:
    • 后条件为 ,将 替换为 ,得 ,即
    • 所以
  3. 应用复合规则,取中间断言

核心性质

性质描述说明
后向推理赋值规则从后条件反推前条件 是保证 成立的最弱前条件
规则可靠性每条推理规则都是可靠的(sound)若前提成立则结论一定成立
不变量关键性循环规则的核心是找到合适的循环不变量不变量必须满足初始化、保持、终止三条件
复合可分解复合语句的正确性可分解为子语句正确性通过中间断言连接
条件分支独立if-else 的两个分支独立验证各自在对应条件下保证后条件
部分正确性优先通常先证部分正确性再证终止性终止性需要单独处理

关系网络

graph TB
    A["Hoare三元组<br/>{P} S {Q}"] --> B["部分正确性<br/>{P} S {Q}"]
    A --> C["完全正确性<br/>[P] S [Q]"]
    A --> D["推理规则"]

    D --> D1["赋值规则<br/>{Q[x/e]} x:=e {Q}"]
    D --> D2["条件规则<br/>分支分别验证"]
    D --> D3["循环规则<br/>需要循环不变量"]
    D --> D4["复合规则<br/>中间断言连接"]
    D --> D5["合取规则<br/>后条件合取"]

    A -.-> E["程序正确性<br/>Hoare三元组的应用领域"]
    A -.-> F["循环不变量<br/>循环规则的核心要素"]
    A -.-> G["推理规则<br/>规则系统的逻辑基础"]

    E --- A
    F --- A
    G --- A
  • 应用领域程序正确性 使用 Hoare 三元组作为形式化验证的基本表示
  • 核心要素循环不变量 是循环规则中必须找到的关键断言
  • 逻辑基础推理规则 为 Hoare 三元组的推理系统提供逻辑支撑

章节扩展

第5章 — 5.5节内容

Hoare 三元组是 Rosen 第5章 5.5 节中程序验证的核心形式化工具:

  • 三元组记法 的语法和语义,部分正确性与完全正确性的区分
  • 赋值公理:后向替换方法 ,从后条件反推前条件
  • 条件规则:if-else 语句的分支独立验证方法
  • 循环规则:基于循环不变量的 while 循环验证,与数学归纳法的对应
  • 复合规则:顺序语句的中间断言连接方法
  • 合取规则:多个后条件的合并验证
  • 程序验证实例:使用 Hoare 三元组规则系统验证具体程序的正确性

Hoare 三元组将程序验证从直觉层面提升到了严格的逻辑推理层面,是形式方法的重要基础。

补充

学术背景

Hoare 三元组由 C. A. R. Hoare 于 1969 年在其经典论文 “An Axiomatic Basis for Computer Programming” 中提出。这篇论文开创了公理语义学(Axiomatic Semantics)的研究方向,使程序语言有了精确的数学语义定义。

Hoare 后来因其在程序逻辑和编程方法论方面的贡献于 1980 年获得 Turing 奖。他的另一项重要贡献是提出了 CSP(Communicating Sequential Processes),这是一种描述并发程序的代数语言,对并发理论产生了深远影响。

Hoare 三元组的思想后来被发展为更丰富的程序逻辑体系,包括:

  • 分离逻辑(Separation Logic):扩展 Hoare 逻辑以处理指针和堆操作
  • 并发 Hoare 逻辑:处理并发程序的验证
  • 时序逻辑:用模态逻辑描述程序的时序行为

来源

  • Rosen, K. H. Discrete Mathematics and Its Applications, 8th ed., Section 5.5
  • Hoare, C. A. R. (1969). “An axiomatic basis for computer programming.” Communications of the ACM, 12(10), 576-580. https://doi.org/10.1145/363235.363259
  • Hoare, C. A. R. (1978). “Communicating sequential processes.” Communications of the ACM, 21(8), 666-677.

参见