[定理] 求值器与一步归约一致

取 Rust 求值器 step step ,归约关系采用 [定义] 一步归约 ,实现论证采用 [附注] 算术语言形式化的未展开前提 的资源与基础操作假设。对任意项 𝑡 与 𝑢: step(t) = Some(u) step(t) = Some(u) 当且仅当 𝑡⟶𝑢。

两个方向各有分工。“仅当”方向( step step 蕴涵规则)说明函数返回的每个后继都能由规则推出,函数不会凭空造出规则不允许的一步。“若”方向(规则蕴涵 step step )说明规则允许的每个后继函数都能返回,函数没有漏掉任何一条合法路线。

“若”方向要用 [引理] 值不可归约 排除“别的分支抢先匹配”的情形,这与 [定理] 确定性 证明里的排除论证同源。反过来看也成立: step step 是函数,所以只要这条定理成立,若 𝑡⟶𝑢 且 𝑡⟶𝑢 ′,则 step(t) step(t) 同时等于 Some(u) Some(u) 与 Some(u') Some(u') ,于是 𝑢=𝑢 ′。也就是说,对本文这十条规则,这条定理蕴涵确定性,是确定性的另一条证明路线。若把 E-PredSucc 放宽成任意项,“若”方向会在这一情形失败,见 [附注] 为什么 E-PredSucc 要求 nv 。

证明

(仅当: step(t) = Some(u) step(t) = Some(u) 蕴涵 𝑡⟶𝑢)对 𝑡 结构归纳,按 step step 实际走到的分支分情形。

  • true、false、0: step step 返回 None None ,前提不成立。
  • if 𝑡 1 then 𝑡 2 else 𝑡 3:若 𝑡 1 是 true,返回 𝑡 2,这是 E-IfTrue;false 同理对应 E-IfFalse。否则 step(t1) = Some(t1') step(t1) = Some(t1') ,𝑢= if 𝑡 1 ′ then 𝑡 2 else 𝑡 3。由 归纳假设 𝑡 1⟶𝑡 1 ′,用 E-If 即得。
  • succ 𝑡 1: step(t1) = Some(t1') step(t1) = Some(t1') ,𝑢= succ 𝑡 1 ′。由 归纳假设 与 E-Succ 即得。
  • pred 𝑡 1:若 𝑡 1 是 0,返回 0,这是 E-PredZero;若 t_(1) = succ nv( is_nv is_nv 为真),返回 nv,这是 E-PredSucc;其余情形 step(t1) = Some(t1') step(t1) = Some(t1') ,由 归纳假设 与 E-Pred 即得。
  • iszero 𝑡 1:与 pred 的三个分支一一对应,分别用 E-IsZeroZero、E-IsZeroSucc、E-IsZero。

(若:𝑡⟶𝑢 蕴涵 step(t) = Some(u) step(t) = Some(u) )对 𝑡⟶𝑢 作规则归纳( [定理] 规则归纳法(rule induction) ),按最后一步的规则分情形。

  • E-IfTrue、E-IfFalse:条件分别是 true、false, step step 的前两个分支直接返回 𝑡 2、𝑡 3。
  • E-If:前提 𝑡 1⟶𝑡 1 ′。由 [引理] 值不可归约 ,𝑡 1 不是值,特别地不是 true 或 false,所以 step step 走第三个分支。由 归纳假设 step(t1) = Some(t1') step(t1) = Some(t1') ,于是返回 if 𝑡 1 ′ then 𝑡 2 else 𝑡 3。
  • E-Succ:由 归纳假设 直接得到。
  • E-PredZero、E-PredSucc: step step 的前两个分支返回规则的结论;E-PredSucc 的条件 is_nv is_nv 正是规则对 nv 的限制。
  • E-Pred:前提 𝑡 1⟶𝑡 1 ′。由 [引理] 值不可归约 ,𝑡 1 不是值,所以既不是 0,也不是 succ nv(后者是数值,也是值), step step 走第三个分支。由 归纳假设 得 step(t1) = Some(t1') step(t1) = Some(t1') 。
  • E-IsZeroZero、E-IsZeroSucc、E-IsZero:与 pred 的三条一一对应,论证相同。
∎

这条定理接上的是“规则”与“Rust 函数”之间那道缝:与 [定理] 算法可靠性 和 [定理] 算法完备性 对类型检查器做的事相呼应。它是对本文这段 Rust 代码的纸面论证,没有机器检查;对代码里没有写出的细节(例如 clone clone 的行为)仍然依赖对 Rust 语义的默认理解。配套工程 code/plt-arith code/plt-arith 里的 determinism determinism 测试把 step step 与逐条照抄规则的枚举器在有限样本上对照,这是对定理的经验检验,不是它的证明。

References

[附注] 算术语言形式化的未展开前提 [unexamined-assumptions]

[定理] 规则归纳法(rule induction) [induction-on-derivations]

[] 确定性:从规则归纳到求值器 [determinism]

[引理] 值不可归约 [values-do-not-reduce]

[定理] 确定性 [determinism]

[定义] 一步归约 [one-step-reduction]

[定理] 算法完备性 [type-checking-algorithm-completeness]

[定义] 归纳假设 [induction-hypothesis]

[定理] 算法可靠性 [type-checking-algorithm-soundness]

[附注] 为什么 E-PredSucc 要求 nv [numeric-value-restriction-in-predecessor-reduction]

Backlinks

Based on Typsite