SICP的话说:“著名的逻辑学家在这里犯了令人尴尬的错误。” 这指的是什么?


14

这是上下文(计算机程序的结构和解释,第1.1.8节,在“本地名称”下):

过程的形式参数在过程定义中具有非常特殊的作用,因为形式参数的名称无关紧要。这样的名称称为绑定变量,我们说过程定义绑定了它的形式参数。如果在整个定义中始终对绑定变量进行重命名,则过程定义的含义不变。

最后一行的末尾有一个脚注(26),其中:

一致重命名的概念实际上是微妙的,很难正式定义。著名的逻辑学家在这里犯了令人尴尬的错误。

文本指的是谁?为什么定义“一致的重命名”会很困难,哪些逻辑学家在定义该定义时犯了错误,这些错误是什么?


3
我告诉我的学生,理解“一致地重命名绑定变量”的唯一方法是正确实现该死的事情。许多逻辑书籍都避免了该问题,给出了不完整的重命名过程,或者至少忽略了给定重命名过程正确的证据。但是我不知道这本书指的是什么八卦。
安德烈·鲍尔

5
精确地处理变量重命名,新名称,避免捕获的替换等是最琐碎的事情之一,很快在定义和证明上就变得非常麻烦。对于这样一个琐碎的问题,人们不希望花费多于琐碎的心理周期,而要花更多的钱来避免很多棘手的捕获/碰撞等。定义,然后调用“ Barendregt约定”并忽略该问题,并在需要时在此处和此处略微滥用“新鲜”。

1
如果可以的话,请在下方的“答案”框中提供更具体的答案。这些评论仍然使问题听起来很神秘,因为您已将它们写给已经熟悉手头的人阅读,而我不是
ubadub

特别是@chi,如果您有任何建议,我将很高兴阅读与该主题相关的建议。在此先感谢
ubadub

Answers:


11

这是部分答案:我不知道SICP指的是哪些错误或人员。我只能提供一些提示,说明“为什么”变量重命名可能难以精确处理。

首先,定义它似乎微不足道。例如,我们可以重命名索引和中的绑定变量

xe=y(e{y/x})

ee{y/x}xy

好吧,如果我们盲目地应用上述规则,我们将得到

x(x+y)=y(y+y)

ye

现在,考虑这种正确的重命名

xy(x+y)=xz(x+z)

xy

e{y/x}yeye

然后,我们定义自由出现的次数:

free(x)={x}free(e+t)=free(e)free(t)free(xe)=free(e){x}

最后,捕获避免替换:

  • x{t/y}tx=yx
  • (e+e){t/y}=e{t/y}+e{t/y}
  • (xe){t/y}=??

x=yxxe

yx(xe){t/y}=x(e{t/y})xt

zytxe(xe){t/y}=z(e{z/x}{t/y})

我希望我做对了。(顺便说一句,我的第一次尝试是错误的)

zz

αλx

现在,想象一下每次我们要在PL理论上证明某些东西时都必须处理这个复杂的定义。我们可以,但我们不想这么做。它无聊,乏味,容易出错,使证据混乱并且对读者没有洞察力。出于这个原因,许多PL的作者只是简单地跳过了这些细节,只是说(甚至认为是理所当然的!)术语应“按变量重命名”,所有绑定变量都假定与他们需要区别的内容有所区别,我们假设“ Barendregt约定”或具有相同效果的东西。

老实说,这是在作弊。我们还可以添加“眨眼眨眼,轻推微动,再也不说了!” 本着同样的精神。我们本质上是在求饶,并告诉读者:“看,这很无聊,我不想这样做,你不想阅读它-我们俩都知道,我们需要付出巨大的努力,才能将这一证明重写为包括所有详细信息”。

从技术上讲,这可能利用此快捷方式证明虚假陈述。但是,经验丰富的证明审阅者知道什么是“道德上不错的”,并且可以(非常努力)做到完美,以及什么是可疑的。后者可能包含一些取决于绑定名称的实际选择的内容(因此,我们实际上并没有像承诺的那样“最多”工作!)。在这种情况下,审核将要求提供更多详细信息,以便可以说服他。

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.