Voici le contexte ( Structure et interprétation des programmes informatiques , section 1.1.8, sous la rubrique "Noms locaux"):
Un paramètre formel d'une procédure a un rôle très spécial dans la définition de la procédure, en ce que le nom du paramètre formel n'a pas d'importance. Un tel nom est appelé une variable liée , et nous disons que la définition de la procédure lie ses paramètres formels. La signification d'une définition de procédure est inchangée si une variable liée est renommée de manière cohérente dans toute la définition.
À la fin de cette dernière ligne, il y a une note de bas de page (26) qui dit:
Le concept de changement de nom cohérent est en fait subtil et difficile à définir formellement. Des logiciens célèbres ont commis des erreurs embarrassantes ici.
À quoi ou à qui le texte fait-il référence? Pourquoi la définition d'un «renommage cohérent» serait-elle difficile, quels logiciens ont fait des erreurs en essayant de le définir, et quelles étaient ces erreurs?
Réponses:
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
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
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
si nous voulons renommerx 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éfinire{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:
Enfin, capturez en évitant la substitution:
Le dernier cas est douloureux. Six=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 .
Siy≠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 laissonsz ê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)
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.
la source