自底向上的 β 归约:上链与 λ - DAGs
1. 归约阶段的终止处理
在进行自底向上的 β 归约时,上复制(upcopy)阶段的终止是一个需要处理的细节。有两种处理方式:
- 方式一 :在遍历有向无环图(DAG)向上移动时,检查是否到达正在归约的 λ 表达式。若到达,则将新项保存到某个位置,然后停止进一步的向上复制并返回。
- 方式二 :假设正在收缩归约式 $(λx.b) n$,其中 $b$ 和 $n$ 是任意子项。在归约操作开始时,首先检查 $x$ 是否没有引用(即其上行链集合是否为空)。如果是,答案就是 $b$,归约完成。
- 若 $x$ 有引用,从正在归约的 λ 表达式开始向下扫描,直到遇到非 λ 表达式节点(变量或应用)。
- 如果停止在变量上,该变量必定是 $x$。此时,只需回溯嵌套的 λ 表达式链,在回溯过程中用新的 λ 表达式包裹 $n$。
- 一般情况下,向下扫描会在子项 $b$ 的最顶层应用节点 $a$ 处停止。此时,制作 $a$ 的一个相同副本 $a’$,它与 $a$ 共享函数和参数子节点,并将 $a’$ 安装到 $a$ 的缓存槽中。
- 接着可以启动 $x → n$ 的上复制操作。由于 DAG 的关键不变性(从变量引用向上到根的所有路径都必须经过绑定该变量的 λ 节点),所有向上复制操作必定会在之前复制的应用节点处终止。$a$ 节点的缓存槽中有 $a’$ 存在,可防止向上复制超过 $a$ 节点。$a$ 节点起到搜索哨兵的作用,这样可以从代码中消除根检查,节省时间。
- 上复制阶段完成后,将 $a’$ 通过从 $a$ 回到顶层 $λx.b$ 项的嵌套
超级会员免费看
订阅专栏 解锁全文
1269

被折叠的 条评论
为什么被折叠?



