«Des logiciens célèbres ont commis des erreurs embarrassantes ici», écrit le SICP. À quoi cela fait-il référence?

14

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?

ubadub
la source
3
Je dis à mes élèves que la seule façon de comprendre "renommer systématiquement les variables liées" est d'implémenter correctement cette fichue chose. De nombreux livres de logique évitent le problème, fournissent des procédures de changement de nom incomplètes ou, à tout le moins, omettent de prouver que les procédures de changement de nom données sont correctes. Mais je ne sais pas à quels potins en particulier le livre fait référence.
Andrej Bauer
5
Traiter avec précision le changement de nom des variables, les nouveaux noms, la substitution évitant la capture, etc., est l'une des choses les plus triviales qui devient rapidement très lourde en termes de définitions et de preuves. Pour un problème aussi insignifiant, on ne veut pas dépenser plus qu'une quantité insignifiante de cycles mentaux, mais beaucoup plus que cela serait nécessaire pour éviter beaucoup de captures / collisions / etc. délicates. Souvent, les personnes PL font attention à leur définitions, mais ensuite invoquer la "convention de Barendregt" et ignorer le problème, abusant quelque peu "frais" ici et là, si nécessaire.
chi
1
J'apprécierais des réponses plus concrètes, ci-dessous dans la boîte de réponse, si possible. Ces commentaires rendent toujours le problème mystérieux car vous les avez écrits pour être lus par quelqu'un qui est déjà au courant du problème, alors que je ne suis pas
ubadub
@chi en particulier, j'apprécierais de lire des recommandations qui traitent de ce sujet, si vous en avez. Merci d'avance
ubadub

Réponses:

11

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})

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

xy(x+y)=xz(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 yx , 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.

chi
la source