我正在通过Types and Programming Languages工作,皮尔斯通过降价策略调用,给出了术语id (id (λz. id z))
的示例。内部重新引用id (λz. id z)
首先缩减为λz. id z
,在外部重新索引缩减为正常形式id (λz. id z)
之前,将λz. id z
作为第一次缩减的结果。
但按价值顺序调用被定义为“只有最外层的重新索引被减少”,并且“仅当其右侧已减少到某个值时,才会减少重新索引”。在示例id (λz. id z)
出现在最外层redex的右侧,并且减少了。这与只有最外层的重新索引减少的规则有什么相似?
“最外层”和“最内层”的答案是否仅指代lambda抽象?因此,对于t
中的λz. t
项,t
无法减少,但在重新索引s t
中,t
会减少为v
如果可能,那么s v
会减少吗?
答案 0 :(得分:5)
简短回答:是的。你永远不能减少lambda术语,你只能从右边开始减少术语。
lambda-calculus中的评估上下文按值定义如下:
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
你可以在皮尔斯的第19.5.3章看到上下文的另一个定义。
答案 1 :(得分:2)
“最外层”和“最内层”的答案是否仅指代lambda抽象?因此对于λz中的项t。 t,t不能减少,但在redex s t中,如果可能的话,t减小到一个值v,然后减小s v?
是的,这是完全正确的。