我目前正在研究使用Context-Environment机器进行lambda演算的小步骤语义。
在这种机器中,或者说解释器,闭包的定义是开放的lambda术语,与定义闭包中自由变量含义的环境组件配对。
在定义环境组件时,文献说:
ρ ∈ Env = Var ⇀ Clo.
将变量映射到闭包。
我的问题是: 为什么关闭?理解起来并非易事。
例如,您可以想象: 根据closure的定义,每个表达式都有它的环境,因而是一个闭包,那么如果要计算的当前表达式是一个变量v,那么我们可以引用它的v环境,它会返回一个闭包吗?那是什么?如果变量的值是5,为什么不给我5,而不是闭包?
答案 0 :(得分:1)
这些例子通常在没有的λ演算的背景下定义 常数:
terms ::=
| x variable
| t₁ t₂ application
| λx.t abstraction
在这种情况下,只有抽象是值:唯一值(正常
形式的封闭术语)的形式为λx.t
;的确,x
不是
一个封闭的术语,t₁ t₂
可以进一步减少。
使用(t,ρ)
术语 - 环境对时(想法是ρ
保留t
的自由变量的定义,而不是替换
他们离开这是一项昂贵的操作),ρ中的值可能是免费的
变量本身,因此需要自己携带
环境:环境应该是Var → (Value * Env)
。就像在这
受限制的例子,唯一可能的值是抽象,我们命名
一对lambda及其环境是一个“闭包”,因此Var → Clo
。
现在您可能想要为您的语言添加其他内容,例如
常量(5
,true
等),对,let-definitions,continuations,
在每种情况下,术语的定义都将得到扩展
值的定义也可能会发生变化,例如2 + 3
不会
一个值,但5
将。值可能会也可能不会从中捕获变量
环境:(λf.f x)
确实如此,但5
没有。但是,我们保持
统一定义Env := Var → (Value * Env)
,以便我们不这样做
必须区分那些。
您实际上并不需要捕获的环境完全
与价值时的环境相同
施工。您只需要保留绑定值即可
实际上是在值中捕获的,例如x
中的(λf. f x)
(这是
被称为“弱化”)。特别是,你总能表达出来
5
的“封闭”为(5, ∅)
。