首先,我从未研究过这些东西或任何东西,所以我可能会问非常愚蠢的问题,我很抱歉,但请放轻松我:)
我正在实施lambda演算,并通过需求评估进行评估。我试图关注这个主题的this paper,其中相关位似乎是第28页描述的自然语义。
无论如何,我对这个评估策略的理解是,据我所知,实际的替换仅在评估变量时才会发生。抽象评估自己,因为它们是值,应用程序仅向缓存添加新条目。
但鉴于此,如何评估像
这样的术语 (λx.λy.x y) λa.a
根据链接文章中描述的自然语义,第一个评估步骤是将条目x -> λa.a
添加到缓存中,并评估应用程序的lhs上的抽象主体,即λy.x y
。但这是一个价值,因此评估结束。此时我们有一个未关闭的术语和一个非空堆。虽然我们确切地知道该术语应该评估为λy.(λa.a) y
。
我误解了什么?这在实际使用此评估策略的语言中如何工作?
答案 0 :(得分:1)
你的减少是正确的。关键在于,该论文中提到的需求策略调用只是一种弱策略,因为它不会在lambda表达式下减少。这在图1中很明显,其中表达式\ x.M是一个值。
在缩减结束时,如果要显式获取lambda术语,则仍需要展开缓存(文献中经常称为环境),这相当于替换术语中缓存中的关联: / p>
λy.x y [x -> λa.a] = λy.(λa.a) y
正如所料。