Lambda演算:上下文与评估上下文之间的差异


12

首先,我想说的是,我的下面的文本可能包含错误,请随时指出我在提出问题时的任何错误。

考虑一个具有布尔值和if语句的无类型lambda演算,其条件由以下语法给出:

 t ::= v | t t | if t t t | x
 v ::= \x.t | #t | #f

在这种情况下,上下文C将根据以下语法给出:

C ::= [-] | \x. C | C t | t C | if C t t | if t C t | if t t C 

另外,可以根据另一种语法定义评估上下文E:

E ::= [-] | \x. E | v E | E t | if E t t 

我将问题分为三个要点。

  1. 什么时候使用这两个概念?例如,我知道评估上下文用于定义演算的语义,但是上下文的使用在某种程度上仍使我难以理解。我也想在这里确认我的知识。
  2. 什么时候比另一个更好?为什么?
  3. 您能否指出相关文章以帮助我解决此问题?

Answers:


15

上下文用于许多目的,但通常用于定义程序上的一致性。评估上下文是上下文的子集。它们通常用于定义归约关系。让我举一个例子。

定义程序相等性的一种正式方法是说,两个程序和在上下文上相等,它们可以在每个上下文中相互替换而无需更改行为。:我们可以如下定义该和是以内容等于规定的所有封闭上下文对于和:当且仅当 。我们说如果和都没有自由变量则的上下文将关闭。表达式Ñ 中号Ñ Ç [ ] 中号Ñ Ç [ 中号] Ç [ Ñ ] 中号Ñ Ç [ 中号] Ç [ Ñ ] 中号中号MNMNC[]MNC[M]tC[N]tM,NC[M]C[N]Mt表示程序以有限的步数减少到值。(顺便说一句,请注意,上下文等价的定义更多地涉及丰富的计算概念,例如并发进程。)Mt

相反,评估上下文是不妨碍评估的上下文。更准确地说,评估上下文是一个术语,在必须进行下一个原子还原步骤(或可能发生于非确定性计算的位置)上有一个孔。因此,以下规则应适用于评估上下文: 作为使用评估上下文的示例,请考虑按值调用的简化规则-微积分,在下不减少。因此,即使当,我们也没有减少 λλ中号ÑλX中号→交通λXñλ

MNE[M]E[N]
λλMNλx.Mλx.N。这很容易用上面的通用上下文规则以及省略 -expressions的评估上下文语法来表示。Feleisen和Hieb 在“顺序控制和状态的句法理论修订报告”中首次使用了评估上下文。λ

14

上下文是句法概念。上下文是其中有一个洞的术语。(有时存在多个孔上下文,在这种情况下会给出明确的定义。)上下文的语法是通过采用术语的语法并允许一个子术语成为孔而不是术语来定义的。在BNF中(我使用lambda演算作为示例,没有布尔值,并且if语句对示例没有任何影响。): []

C::=[]xtCCtλx.C

与上下文的定义一起出现的是将术语置于上下文中的定义。如果是上下文并且是项,则是通过将放入hole在中的语法树中获得的项。这基本上是一种替换,其中保证该变量只发生一次(但请注意,被替换的“变量”是元级别的变量,而不是lambda微积分或术语其他语言中的变量))。C[]tC[t]t[]C[t][]t

上下文用于表达语义中的各种定义。一个常见的示例是,大多数评估概念都涉及定义可以执行评估的上下文。例如,考虑lambda演算。评估的基本概念由beta减少规则给出: 其中是替代施加到。

(λx.M)NβM{xN}
M{xN}xNM

这不是beta归约的完整定义:给定项,如果存在子项和以及变量使得 x。M,则它可以beta归约。但是更普遍的是,如果存在子项使得可以beta减少。表示这种情况的另一种方式是,如果存在上下文以及某些项和以及变量,使得,则可以beta减少tMNxt=(λx.M)Nttt=(λx.M)NtCMNxt=C[(λx.M)N]。当有这样的减少时,右侧为。要使用正式的符号,应通过以下扣除规则定义beta减少: 通过使所有种类的上下文都明确可以表达相同的定义: C[M{xN}]

(λx.M)NβM{xN}(β)MβNC[M]βC[N](γ)
(λx.M)NβM{xN}(β)MβNλx.Mβλx.N(Cλ)MβNMPβNP(C@<)MβNPMβPN(C@>)

此定义产生beta减少,即允许减少任何子项的评估概念。用编程语言执行的计算通常不允许在函数内部归约子条件:归约规则只能在应用程序的顶层或左侧或右侧使用。我们可以通过定义一种不允许所有语法形式的新上下文来表达这一点: 我们可以使用此语法来定义语义概念部分评估的结果: 我们也可以通过扩展此定义来呈现此定义,就像上面为减少完整beta所做的一样:

D::=[]xtDDt
(λx.M)NnpM{xN}MnpND[M]npD[N]
(λx.M)NnpM{xN}(β)MnpNMPnpNP(C@<)MnpNPMnpPN(C@>)
D之所以称为评估上下文,是因为它用于定义评估的概念。评估上下文不是一种特殊的上下文;确切地说,将其称为评估上下文取决于上下文用于什么

我将再提供一个上下文示例。让我们根据以下语法定义值: 现在让我们定义另一种上下文: 与上面的相比,如果应用程序的参数为,则孔可以位于应用程序的函数侧一个值。然后定义以下归约概念: V

V::=xV1Vnλx.M
E::=[]MEEV
D
(λx.M)VcbvaM{xV}(βcbva)MβNE[M]cbvaE[N](γcbva)
由于函数的参数必须是第一条规则中的值并且lambda抽象不是上下文的限制,我们正在定义按值调用评估策略。由于参数在函数之前求值的进一步限制,这是按值的应用顺序调用。

1
您对评估上下文的后一个定义更接近原始的Felleisen和Hieb概念。它们是帮助表达微积分项的评估顺序的句法手段。评估上下文一种特殊的上下文,因为它允许人们将一个术语唯一地分解为上下文和redex(如果可能),从而确定性地指示下一个简化步骤应该在哪里进行。
戴夫·克拉克

@DaveClarke顺便说一句,您还可以使用评估上下文来为非确定性计算概念定义评估,而不必对评估上下文和redex进行唯一的分解。
Martin Berger 2014年

@MartinBerger:的确如此。
戴夫·克拉克2014年

@DaveClarke您的意思是“ 确定性评估上下文是一种特殊的上下文”吗?我可以采用任意一组上下文,并根据其定义评估策略。
吉尔斯(Gilles)'“ SO-别再邪恶了”

@吉尔斯:评估环境可以定义确定性的减少策略。我认为我没有看到“确定性评估上下文”这一短语。它们当然是一种特殊的上下文。我同意你的评论;关键是您的答案错过了评估上下文的历史意义,这是定义还原的确定性概念。
戴夫·克拉克2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.