Skip to content

公理语义

Axiomatic semantics

用逻辑断言和推理规则描述程序状态变换性质的语义方法。

条目类型
模型

形式陈述

公理语义不用执行轨迹直接定义程序含义,而以通常由一阶逻辑表达的状态断言和推理规则刻画程序前后的关系。典型判断是 Hoare 三元组 {P}C{Q}。赋值公理、顺序规则和条件规则例如

{Q[E/x]} x:=E {Q},{P}C1{R}{R}C2{Q}{P}C1;C2{Q}.

部分正确性只约束终止执行;总正确性还要求终止。一个公理系统相对于某操作或指称语义是可靠的,若可推导三元组在该语义中都有效;是相对完备的,若所有有效三元组在断言语言足够表达所需不变量时都可推导。

赋值公理中的 Q[E/x] 是对断言语法的无捕获替换;若断言语言含量词,必须先重命名冲突的约束变量,不能把它实现为普通文本替换。

直觉

公理语义把程序视为状态性质之间的变换器,而不是一串机器步骤。证明从目标后置条件反推每条语句执行前必须满足什么,或从已知前置条件向前维护不变量。推理规则刻画程序构造如何组合证明,因此一份验证可以按语法模块化。它刻意忽略许多实现细节,只保留与所声明性质有关的逻辑关系;这使证明简洁,也意味着性能和中间事件需要其他语义工具。

例子与边界

要证明 {x=0} x:=x+1 {x=1},赋值公理要求前置条件为 (x+1=1),即 x=0,恰好满足。对顺序程序 x:=x+1; y:=2*x,可选择中间断言连接两次赋值,再用顺序规则合成。

边界是循环:仅靠展开语句无法完成有限证明,需要用户或工具提供循环不变量。断言语言若无法表达某个必要不变量,即使程序性质语义上成立,系统也可能无法推导。部分正确性还允许程序永不终止,因此不能把三元组自动读成“程序一定产生 Q 状态”。

推论与应用

公理语义以Hoare 三元组为核心,最弱前置条件把规则变成系统化验证条件生成。分离逻辑进一步把状态断言扩展为可分堆资源,支持指针程序的局部推理。

这套方法把程序正确性目标分解成可组合的证明义务。基于 SMT 的软件验证把程序注解与路径条件转化为理论公式,再让求解器寻找反模型;这是一条自动化实现链,不会把公理语义的规则有效性变成“求解器说真”。规则可靠性仍须相对于操作语义证明,生成器还须覆盖程序的每条控制流路径。

参考资料
  • Glynn Winskel, The Formal Semantics of Programming Languages, MIT Press, 1993,Chs. 6–7。
  • C. A. R. Hoare, “An Axiomatic Basis for Computer Programming,” Communications of the ACM 12(10), 1969,Full paper, axioms and rules。
关系图谱23 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

并列辨析