纯lambda表达式需要重命名吗? 在ML中,输入程序表达式必须具有每个绑定变量都是不同的属性。我想知道纯lambda表达式(let-free表达式)是否相同?
答案 0 :(得分:1)
当你有粘合剂时,唯一重要的是变量出现与其粘合剂之间的关系。使用名称只是表达这种关系的一种方便方法(但你可以使用其他技术,如指针,显式连接 - 如交互网 - ,De Bruijn索引等)。
如果使用名称,则对两个嵌套活页夹使用相同的名称时可能会发生冲突。在这种情况下,你需要一些政治来区分它们,并且所有编程语言中的典型解决方案是变量与最内层的绑定器相关联,其名称的范围涵盖变量。
实际上,变量重命名仅在术语(手动)减少期间相关,因为您需要避免变量捕获现象。 例如,考虑术语
(\x.\y.x y) y
最外面的y是自由的。 通过β减少,这是(\ y.x y)[y / x],如果我们天真地执行替换,我们得到术语(\ y.y y)。这是错误的,因为当进入其范围时,参数变量y已被具有相同名称的活页夹秘密捕获。
在这种情况下,我们需要在执行缩减之前重命名变量,例如
(\x.\z.x z) y
在减少之后,为我们提供了新的正确结果\ z.y z。
当然,在类型化设置中,由不同标识符绑定的变量具有不同的类型,因此重命名它们以避免混淆可能是一种好习惯。