Ceci est une réponse partielle: je n'ai aucune idée des erreurs ou des personnes auxquelles le SICP fait référence. Je ne peux que fournir quelques conseils sur le "pourquoi" le changement de nom des variables peut être difficile à gérer avec précision.
Tout d'abord, il semble trivial de définir. Par exemple, nous pouvons renommer des variables liées en sommes indexées
∑xe=∑y(e{y/x})
où e est n'importe quelle expression et e{y/x} désigne le remplacement syntaxique de chaque x par y . Trivial, non?
Eh bien, si nous appliquons aveuglément la règle ci-dessus, nous obtenons
∑x(x+y)=∑y(y+y)
Ce n'est pas bon. Nous devons ajouter l'exigence " y ne se produit pas dans e ", ou nous obtenons un conflit de noms.
Maintenant, considérez ce changement de nom correct
∑x∑y(x+y)=∑x∑z(x+z)
si nous voulons renommer x en y , selon la règle ci-dessus, nous pouvons le faire sur le côté droit, mais pas sur le côté gauche. Ce n'est pas pratique, car les deux ne diffèrent que par un changement de nom, ils doivent donc être traités de la même manière.
Une approche typique ici consiste à redéfinir e{y/x} comme "substitution évitant la capture", et à assouplir l'exigence " y ne se produit pas dans e " et à utiliser à la place " y ne se produit pas librement dans e ".
Nous définissons ensuite les occurrences libres:
free(x)={x}free(e+t)=free(e)∪free(t)free(∑xe)=free(e)∖{x}
Enfin, capturez en évitant la substitution:
- x{t/y} estt six=y , etx sinon.
- (e+e′){t/y}=e{t/y}+e′{t/y} (cas facile)
- (∑xe){t/y}=??
Le dernier cas est douloureux. Si x=y , la substitution est no-op, car nous voulons qu'elle n'affecte que les variables libres, et x est lié. Le résultat est donc juste ∑xe .
Si y≠x , nous voudrions dire que (∑xe){t/y}=∑x(e{t/y}) . Ceci est cependant faux, en général, car si x apparaît librement dans t nous obtenons une capture.
Soupir. Donc, nous laissons z être la "première" variable qui est 1) non y , 2) non libre en t , et 3) non libre en ∑xe . Ici, "premier" signifie que nous devons bien ordonner l'ensemble des noms de variables (par exemple en choisissant une bijection entre les noms et les naturels). Ensuite, on laisse finalement
(∑xe){t/y}=∑z(e{z/x}{t/y}) .
J'espère avoir bien compris. (Ma première tentative a été mauvaise, au fait)
zz
αλx
Maintenant, imaginez devoir traiter avec cette définition complexe chaque fois que nous voulons prouver quelque chose dans la théorie PL. Nous pourrions, mais nous ne voulons pas. Il est ennuyeux, fastidieux, sujet aux erreurs, encombre la preuve et ne fournit aucun aperçu au lecteur. Pour cette raison, de nombreux auteurs de PL sautent simplement les détails en disant (ou même en tenant pour acquis!) Que les termes doivent être pris "jusqu'à renommer les variables", que toutes les variables liées sont supposées distinctes de tout ce dont elles doivent être distinctes, que nous supposons la "convention de Barendregt", ou quelque chose dans le même sens.
Pour être brutalement honnête, c'est tricher dans les preuves. Nous pourrions également ajouter "clin d'oeil clin d'oeil, nudge nudge, dis pas plus!" dans le même esprit. Nous demandons essentiellement grâce et disons au lecteur: "regardez, c'est ennuyeux, je ne veux pas le faire, vous ne voulez pas le lire - nous savons tous les deux qu'avec un effort énorme, nous pourrions réécrire cette preuve à inclure tous les détails ".
Techniquement, il est possible d'exploiter ce raccourci pour prouver une fausse déclaration. Le réviseur expérimenté, cependant, sait ce qui est «moralement bien» et pourrait être parfait (avec beaucoup d'efforts) et ce qui est suspect. Ce dernier pourrait inclure quelque chose qui dépend du choix réel des noms liés (donc nous ne travaillons pas vraiment "jusqu'à" comme promis!). Dans ces cas, la revue demandera plus de détails, afin qu'il puisse être convaincu.