[定理]
求值器与一步归约一致
[定理] 求值器与一步归约一致
取
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
实际走到的分支分情形。
- 、、:
stepstep返回NoneNone,前提不成立。 - :若 是 ,返回 ,这是 E-IfTrue; 同理对应 E-IfFalse。否则
step(t1) = Some(t1')step(t1) = Some(t1'),。由 归纳假设 ,用 E-If 即得。 - :
step(t1) = Some(t1')step(t1) = Some(t1'),。由 归纳假设 与 E-Succ 即得。 - :若 是 ,返回 ,这是 E-PredZero;若 t_(1) = succ nv(
is_nvis_nv为真),返回 nv,这是 E-PredSucc;其余情形step(t1) = Some(t1')step(t1) = Some(t1'),由 归纳假设 与 E-Pred 即得。 - :与 的三个分支一一对应,分别用 E-IsZeroZero、E-IsZeroSucc、E-IsZero。
(若: 蕴涵
step(t) = Some(u)
step(t) = Some(u)
)对 作规则归纳(
[定理] 规则归纳法(rule induction)
),按最后一步的规则分情形。
- E-IfTrue、E-IfFalse:条件分别是 、,
stepstep的前两个分支直接返回 、。 - E-If:前提 。由
[引理] 值不可归约
, 不是值,特别地不是 或 ,所以
stepstep走第三个分支。由 归纳假设step(t1) = Some(t1')step(t1) = Some(t1'),于是返回 。 - E-Succ:由 归纳假设 直接得到。
- E-PredZero、E-PredSucc:
stepstep的前两个分支返回规则的结论;E-PredSucc 的条件is_nvis_nv正是规则对 nv 的限制。 - E-Pred:前提 。由
[引理] 值不可归约
, 不是值,所以既不是 ,也不是 succ nv(后者是数值,也是值),
stepstep走第三个分支。由 归纳假设 得step(t1) = Some(t1')step(t1) = Some(t1')。 - E-IsZeroZero、E-IsZeroSucc、E-IsZero:与 的三条一一对应,论证相同。
这条定理接上的是“规则”与“Rust 函数”之间那道缝:与
[定理] 算法可靠性
和
[定理] 算法完备性
对类型检查器做的事相呼应。它是对本文这段 Rust 代码的纸面论证,没有机器检查;对代码里没有写出的细节(例如
clone
clone
的行为)仍然依赖对 Rust 语义的默认理解。配套工程
code/plt-arith
code/plt-arith
里的
determinism
determinism
测试把
step
step
与逐条照抄规则的枚举器在有限样本上对照,这是对定理的经验检验,不是它的证明。
References
References
[附注] 算术语言形式化的未展开前提 [unexamined-assumptions]
[定理] 规则归纳法(rule induction) [induction-on-derivations]
[] 确定性:从规则归纳到求值器 [determinism]
[引理] 值不可归约 [values-do-not-reduce]
[定义] 一步归约 [one-step-reduction]
[定理] 算法完备性 [type-checking-algorithm-completeness]
[定义] 归纳假设 [induction-hypothesis]
[定理] 算法可靠性 [type-checking-algorithm-soundness]
[附注] 为什么 E-PredSucc 要求 nv [numeric-value-restriction-in-predecessor-reduction]