Skip to content

求值上下文

Evaluation context

用单洞语法集中描述小步语义允许暴露的下一个 redex 及求值顺序。

条目类型
定义

形式陈述

求值上下文是抽象语法中恰含一个洞 [] 的对象;E[e] 表示把项 e 填入洞。上下文文法规定小步语义允许沿哪些语法位置寻找 redex。

对左到右调用值 λ 演算,可令

E::=[]EtvE,

其中 v 是值。产生式 Et 允许计算函数位置;只有函数位置成为值后,vE 才允许进入实参。若根计算规则为 rr,完整求值步统一写为

rrE[r]E[r].

把根收缩 与上下文闭包后的求值 分开,可以防止把计算规则和位置规则混为一谈。

确定策略通常依赖唯一分解定理:每个既非值也非错误的良构闭项,要么明确卡住,要么可唯一写成 E[r],其中 r 是根 redex。证明按项结构分析;每个语法构造的值条件决定应进入哪个子项,上下文文法的互斥性保证唯一。

求值上下文只包含策略允许的下一步位置,不等于上下文等价量化的任意程序上下文。后者可把洞放在函数体、未执行分支或其他任意语法位置,用来测试程序观察;两类上下文的量词范围不同。

直觉

求值上下文把当前控制焦点编码成一个带洞的树。洞外部分记录“算完这里之后还要做什么”,洞内是下一步计算。替换洞内结果便恢复完整程序,不必为每条根规则重复所有外层传播规则。

上下文文法也是策略的可执行规格。是否进入 λ 体、应用先算函数还是参数、条件式是否只算守卫,都集中在这些产生式中;少一项会令合法程序卡住,多一项可能引入非确定性。

求值上下文示意图
例子与边界

对左到右表达式 (1+2)×(3+4),第一步唯一分解为

E=[]×(3+4),r=1+2.

得到 3×(3+4) 后,分解变成 E=3×[]r=3+4。洞的移动准确记录了顺序。

(λx.x)((λy.y)(λw.w)),调用值上下文把参数位置暴露为洞,须先处理内层应用;调用名上下文允许把整个外层应用当作 redex。根 β 规则相同,差别全部位于上下文文法。

若加入 E::=λx.E,语义会进入尚未调用的函数体,接近完整 β-归约而不是通常弱求值。若同时允许 EttE 而不加值侧条件,应用两侧都可先走,同一项便可能有两个分解。含绑定器的上下文还须明确填洞是否允许捕获;上述调用值文法没有进入 λ,因此避开了该问题。

推论与应用

求值上下文可重化为续延:上下文本身就是“取得洞中结果后继续做什么”。抽象机器把嵌套上下文拆成显式栈帧;CEK 机器的参数帧与函数帧正对应调用值应用上下文的两种产生式。

异常沿上下文向外传播,控制算子捕获部分上下文,代数效应处理器搜索最近处理边界。唯一分解还常为确定性和进展定理提供关键引理:先找到唯一 E[r],再对根 redex 应用计算规则。

参考资料
  • Robert Harper, Practical Foundations for Programming Languages, 2nd ed., Cambridge University Press, 2016, Chapter 5。
  • Matthias Felleisen and Robert Hieb, “The Revised Report on the Syntactic Theories of Sequential Control and State,” Theoretical Computer Science 103(2), 1992, pp. 235–271。
  • Gordon D. Plotkin, “A Structural Approach to Operational Semantics,” DAIMI FN-19, 1981; reprinted 2004。
关系图谱14 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

使用的工具

被这些条目使用