有人知道Context-Environment(CE)Machine(解释器)吗?

时间:2011-03-01 00:45:31

标签: programming-languages functional-programming semantics

我目前正在研究使用Context-Environment机器进行lambda演算的小步骤语义。

在这种机器中,或者说解释器,闭包的定义是开放的lambda术语,与定义闭包中自由变量含义的环境组件配对。

在定义环境组件时,文献说:

ρ ∈ Env = Var ⇀ Clo.

将变量映射到闭包。

我的问题是:  为什么关闭?理解起来并非易事。

例如,您可以想象:  根据closure的定义,每个表达式都有它的环境,因而是一个闭包,那么如果要计算的当前表达式是一个变量v,那么我们可以引用它的v环境,它会返回一个闭包吗?那是什么?如果变量的值是5,为什么不给我5,而不是闭包

1 个答案:

答案 0 :(得分:1)

这些例子通常在没有的λ演算的背景下定义 常数:

terms ::=
        | x       variable
        | t₁ t₂   application
        | λx.t    abstraction

在这种情况下,只有抽象是值:唯一(正常 形式的封闭术语)的形式为λx.t;的确,x不是 一个封闭的术语,t₁ t₂可以进一步减少。

使用(t,ρ)术语 - 环境对时(想法是ρ 保留t的自由变量的定义,而不是替换 他们离开这是一项昂贵的操作),ρ中的值可能是免费的 变量本身,因此需要自己携带 环境:环境应该是Var → (Value * Env)。就像在这 受限制的例子,唯一可能的值是抽象,我们命名 一对lambda及其环境是一个“闭包”,因此Var → Clo

现在您可能想要为您的语言添加其他内容,例如 常量(5true等),对,let-definitions,continuations, 在每种情况下,术语的定义都将得到扩展 值的定义也可能会发生变化,例如2 + 3不会 一个值,但5将。值可能会也可能不会从中捕获变量 环境:(λf.f x)确实如此,但5没有。但是,我们保持 统一定义Env := Var → (Value * Env),以便我们不这样做 必须区分那些。

您实际上并不需要捕获的环境完全 与价值时的环境相同 施工。您只需要保留绑定值即可 实际上是在值中捕获的,例如x中的(λf. f x)(这是 被称为“弱化”)。特别是,你总能表达出来 5的“封闭”为(5, ∅)