Archipelago

Lec 7语义(IMP)——完整大步操作语义

讲义完成更新于 2026-09-16

Lec 7 语义(IMP)——完整大步操作语义

接 L6。给出 IMP 全部求值关系:布尔表达式、语句(赋值/顺序/if/while),并讨论"出错求值" 记号约定:⟨⋅,f⟩⇓⋅\langle \cdot, f\rangle \Downarrow \cdot 为大步求值关系,ff 为帧(变量→值映射)

TL;DR

  • IMP 的大步语义用推理规则完整定义布尔表达式、赋值、顺序组合、条件与循环。
  • 状态在顺序语句中被线程化:前一条语句的终态就是后一条的初态;while 规则通过在前提中递归引用自身表达反复执行。
  • 除零或未定义变量会导致无规则可用,说明求值关系是部分函数;不停机程序则没有有限的大步推导树。

1. IMP 回顾

IMP 含赋值、if-then-else、顺序组合、while。三类项各有一个求值关系:

  • 算术表达式:⟨e,f⟩⇓n\langle e, f\rangle \Downarrow n(求出整数)
  • 布尔表达式:⟨b,f⟩⇓t\langle b, f\rangle \Downarrow t(求出真值 true/false)
  • 语句:⟨s,f⟩⇓f′\langle s, f\rangle \Downarrow f'(把帧 ff 变换为 f′f')

算术表达式规则已在 L6 给出(常量、变量、二元运算)。本讲补全布尔与语句,并把整套规则与递归解释器对照。


2. 布尔表达式的推理规则

定义(布尔表达式大步语义)

常量: ⟨true,f⟩⇓true⟨false,f⟩⇓false\frac{}{\langle \text{true}, f\rangle \Downarrow \text{true}} \qquad \frac{}{\langle \text{false}, f\rangle \Downarrow \text{false}} 比较(先把两侧算术表达式求值,再比较): ⟨e1,f⟩⇓n1⟨e2,f⟩⇓n2⟨e1=e2,f⟩⇓(n1=n2)⟨e1,f⟩⇓n1⟨e2,f⟩⇓n2⟨e1<e2,f⟩⇓(n1<n2)\frac{\langle e_1, f\rangle \Downarrow n_1 \quad \langle e_2, f\rangle \Downarrow n_2}{\langle e_1 = e_2, f\rangle \Downarrow (n_1 = n_2)} \qquad \frac{\langle e_1, f\rangle \Downarrow n_1 \quad \langle e_2, f\rangle \Downarrow n_2}{\langle e_1 < e_2, f\rangle \Downarrow (n_1 < n_2)} 逻辑联结(结果是真值上的对应布尔运算): ⟨b1,f⟩⇓t1⟨b2,f⟩⇓t2⟨b1∧b2,f⟩⇓(t1∧t2)⟨b,f⟩⇓t⟨¬b,f⟩⇓¬t\frac{\langle b_1, f\rangle \Downarrow t_1 \quad \langle b_2, f\rangle \Downarrow t_2}{\langle b_1 \wedge b_2, f\rangle \Downarrow (t_1 \wedge t_2)} \qquad \frac{\langle b, f\rangle \Downarrow t}{\langle \neg b, f\rangle \Downarrow \neg t}

注意"语法层的 ∧\wedge"(程序里的 &&)在结论右侧变成了"数学/元语言层的 ∧\wedge"(真值表运算)——区分对象语言与元语言是操作语义的关键。


3. 语句的推理规则

语句改变帧,关系为 ⟨s,f⟩⇓f′\langle s, f\rangle \Downarrow f'。

定义(语句大步语义)

空语句 skip(帧不变): ⟨skip,f⟩⇓f\frac{}{\langle \text{skip}, f\rangle \Downarrow f} 赋值(先求右侧表达式,再更新帧): ⟨e,f⟩⇓n⟨x:=e,f⟩⇓f[x↦n]\frac{\langle e, f\rangle \Downarrow n}{\langle x := e, f\rangle \Downarrow f[x \mapsto n]} 顺序组合(前一句的终态作为后一句的初态——这就是"状态线程"): ⟨s1,f⟩⇓f′⟨s2,f′⟩⇓f′′⟨s1;s2,f⟩⇓f′′\frac{\langle s_1, f\rangle \Downarrow f' \quad \langle s_2, f'\rangle \Downarrow f''}{\langle s_1 ; s_2, f\rangle \Downarrow f''} 条件 if(按条件真值选分支,两条互斥规则): ⟨b,f⟩⇓true⟨s1,f⟩⇓f′⟨if b then s1 else s2,f⟩⇓f′⟨b,f⟩⇓false⟨s2,f⟩⇓f′⟨if b then s1 else s2,f⟩⇓f′\frac{\langle b, f\rangle \Downarrow \text{true} \quad \langle s_1, f\rangle \Downarrow f'}{\langle \text{if } b \text{ then } s_1 \text{ else } s_2, f\rangle \Downarrow f'} \qquad \frac{\langle b, f\rangle \Downarrow \text{false} \quad \langle s_2, f\rangle \Downarrow f'}{\langle \text{if } b \text{ then } s_1 \text{ else } s_2, f\rangle \Downarrow f'}

3.1 while 循环(关键:自指规则)

定义(while 大步语义)

条件为假(直接结束,帧不变): ⟨b,f⟩⇓false⟨while b do s,f⟩⇓f\frac{\langle b, f\rangle \Downarrow \text{false}}{\langle \text{while } b \text{ do } s, f\rangle \Downarrow f} 条件为真(执行一次循环体,再对整个 while 递归求值): ⟨b,f⟩⇓true⟨s,f⟩⇓f′⟨while b do s,f′⟩⇓f′′⟨while b do s,f⟩⇓f′′\frac{\langle b, f\rangle \Downarrow \text{true} \quad \langle s, f\rangle \Downarrow f' \quad \langle \text{while } b \text{ do } s, f'\rangle \Downarrow f''}{\langle \text{while } b \text{ do } s, f\rangle \Downarrow f''}

while-true 规则的第三个前提又是 while 自身——这正是循环的本质。若循环不终止,则不存在有限的推导树,即该配置与任何 f′′f'' 都不在求值关系中(大步语义对不停机程序"无话可说",这是它相对小步语义的局限)。


4. 出错求值(Errant Evaluations)

定义(卡住 / 无规则适用)

当没有任何推理规则可应用时,求值"卡住 (stuck)",配置与任何结果都不在关系中。典型情形:除以零(⟨e2,f⟩⇓0\langle e_2,f\rangle\Downarrow 0 时除法无对应规则)、访问未定义变量(f(x)f(x) 无定义)、类型不匹配。

这把求值关系刻画为部分函数 (partial function):并非每个 ⟨s,f⟩\langle s, f\rangle 都有结果。语言设计者可选择:让它卡住(未定义行为)、显式定义"错误"结果、或用类型系统在求值前排除这些情形(下一讲引入 Types)。


5. 与递归解释器的对应

每条推理规则精确对应解释器的一段代码:前提 = 递归调用,结论 = 返回/状态更新。

int eval_plus(Frame* f, Binop* e) {
    int n1 = eval_expr(f, e->left);    // 前提 ⟨e1,f⟩⇓n1
    int n2 = eval_expr(f, e->right);   // 前提 ⟨e2,f⟩⇓n2
    return n1 + n2;                    // 结论 ⟨e1+e2,f⟩⇓n1+n2
}

语句解释器同理:eval_seq 先 f' = eval_stmt(f, s1) 再 return eval_stmt(f', s2)(对应顺序规则的状态线程);eval_while 用一个循环或递归实现两条 while 规则。操作语义就是解释器的数学规格,解释器是操作语义的可执行实现。


6. 完整示例

例

例题(推导 if (x == 1) { y = 2; } 在 f={x↦1, y↦0}f=\{x\mapsto1,\ y\mapsto0\} 下) 目标:⟨if (x=1) then (y:=2) else skip, f⟩⇓ ?\langle \text{if } (x{=}1) \text{ then } (y{:=}2) \text{ else skip},\ f\rangle \Downarrow\ ?

(1) ⟨x, f⟩ ⇓ 1            [变量规则, f(x)=1]
(2) ⟨1, f⟩ ⇓ 1            [常量规则]
(3) ⟨x = 1, f⟩ ⇓ true     [比较规则, 由(1)(2), 1=1]
(4) ⟨2, f⟩ ⇓ 2            [常量规则]
(5) ⟨y := 2, f⟩ ⇓ f[y↦2]  [赋值规则, 由(4)]
(6) ⟨if (x=1) then (y:=2) else skip, f⟩ ⇓ f[y↦2]   [if-真规则, 由(3)(5)]

结论:终态 f′={x↦1, y↦2}f' = \{x\mapsto1,\ y\mapsto2\}。整个推导是一棵以(6)为根的推导树 (derivation tree)。


7. 本讲小结

  • IMP 完整大步语义:布尔表达式(常量/比较/联结)+ 语句(skip/赋值/顺序/if/while)。
  • 顺序组合"线程化"帧(前句终态 = 后句初态);while-true 规则在前提中递归引用 while 自身,不停机程序无有限推导树。
  • 出错求值 = 无规则适用(除零、未定义变量),求值关系是部分函数;可用类型系统提前排除。
  • 推理规则与递归解释器一一对应(前提=递归调用、结论=返回/更新)。
  • 下一讲:堆(Heaps)与布尔/类型——把语义扩展到引用与可变数据。