在 lambda 演算中按值调用

Posted

技术标签:

【中文标题】在 lambda 演算中按值调用【英文标题】:Call by value in the lambda calculus 【发布时间】:2011-09-04 08:24:26 【问题描述】:

我正在研究Types and Programming Languages,而 Pierce,对于按价值减少策略的调用,给出了术语 id (id (λz. id z)) 的示例。内部 redex id (λz. id z) 首先减少到 λz. id z,在外部 redex 减少到正常形式 λz. id z 之前,第一次减少的结果是 id (λz. id z)

但是按值顺序调用被定义为“仅减少最外层的redex”,并且“仅当redex 的右侧已经减少为一个值时才减少redex”。在示例中,id (λz. id z) 出现在最外层 redex 的右侧,并且被缩小。这与仅减少最外层redexes 的规则有何关系?

“最外层”和“最内层”的答案是否仅指 lambda 抽象?因此,对于λz. t 中的术语tt 不能减少,但在redex 中s tt 减少为值v,如果可能的话,然后s v减少了吗?

【问题讨论】:

【参考方案1】:

简短的回答:是的。你永远不能在 lambda 项内归约,你只能在外面归约,从右开始。

lambda-calculus by value 中的评估上下文集定义如下:

E = [ ] | (λ.t)E | Et

E 是你能看重的。

例如,在 lambda 演算中,计算上下文是:

E = [ ] | Et | fE

因为即使术语不是值,您也可以减少应用程序。 例如,(λx.x)(z λx.x) 卡在按值调用中,但在按名称调用中,它减少为 (z λx.x),这是一种正常形式。 在上下文语法中f 是一个普通形式(按名称调用)定义为:

f = λx.t | L  
L = x | L f

您可以在 Pierce 的第 19.5.3 章中看到上下文的另一种定义。

【讨论】:

一个更简单的例子是 (λx.x)(x),因为右侧无法进一步评估,所以它被卡在按值调用中。【参考方案2】:

“最外层”和“最内层”的答案是否仅指 lambda 抽象?所以对于 λz 中的项 t。 t, t 不能减少,但是在 redex s t 中,如果可能的话,t 减少到一个值 v,然后 s v 减少?

是的,完全正确。

【讨论】:

以上是关于在 lambda 演算中按值调用的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中按值调用

在 C++11 中按值或引用使用 lambda 默认捕获的缺点?

如何在lambda中按值捕获`this`和局部变量?

Lambda演算 - 简述Y组合子的作用

在 lambda 中,引用的按值捕获是不是会复制底层对象?

C ++ 0x lambda按值捕获总是const?