在“类型和编程语言”的6.1.2节中,他们讨论了用于对lambda表达式中的自由变量进行编号的命名上下文。使用他们提供的示例方案,当λx.xb
和λx.xx
明显不同的术语时,它们的de Bruijn表示为λ.00
。这是如何工作的?
答案 0 :(得分:14)
如您所述,本书使用命名上下文将n
个自由变量映射到0
到n-1
的数字。但是,如果仔细观察本书中的示例,您会注意到它不直接使用这些数字来表示变量。例如,即使λw. y w
的映射为3而不是4,它也将λ. 4 0
表示为y
。
这里发生的是他将变量的嵌套深度添加到数字中。即如果自由变量v
嵌套在d
lambdas中,它将获得索引Γ(v)+d
,而不仅仅是Γ(v)
。
因此,在您的示例中,使用上下文Γ {b -> 0}
λx.xb
将表示为λ. 0 1
,而不是λ. 0 0
。因此没有歧义。