Le problème de la représentation des variables liées dans la syntaxe, et en particulier celui de la substitution évitant la capture, est bien connu et a plusieurs solutions: variables nommées avec équivalence alpha, indices de Bruijn, localement sans nom, ensembles nominaux, etc.
Mais il semble y avoir une autre approche assez évidente, que je n'ai pourtant pas vue utilisée nulle part. À savoir, dans la syntaxe de base, nous n'avons qu'un seul terme "variable", écrit par exemple , puis séparément nous donnons une fonction qui mappe chaque variable à un classeur dans la portée duquel elle se trouve. Donc, un -term comme
serait écrit , et la fonction mapperait le premier au premier et le second au second . C'est donc un peu comme les indices de Bruijn, mais au lieu d'avoir à "compter s" lorsque vous reculez pour trouver le liant correspondant, vous évaluez simplement une fonction. (Si cela représente une structure de données dans une implémentation, je penserais à équiper chaque objet à terme variable d'un simple pointeur / référence vers l'objet à terme de liant correspondant.)∙ λ ∙ λ λ
Évidemment, cela n'est pas judicieux pour écrire la syntaxe sur une page que les humains peuvent lire, mais les indices de Bruijn ne le sont pas non plus. Il me semble que cela a un sens mathématique parfait, et en particulier il rend la substitution évitant la capture très facile: il suffit de laisser tomber le terme que vous remplacez et de prendre l'union des fonctions de liaison. Il est vrai qu'il n'a pas de notion de "variable libre", mais alors (encore) les indices de Bruijn non plus; dans les deux cas, un terme contenant des variables libres est représenté par un terme avec une liste de classeurs "contextuels" devant.
Suis-je en train de manquer quelque chose et il y a une raison pour laquelle cette représentation ne fonctionne pas? Y a-t-il des problèmes qui le rendent tellement pire que les autres que cela ne vaut pas la peine d'être considéré? (Le seul problème auquel je peux penser en ce moment est que l'ensemble des termes (ainsi que leurs fonctions de liaison) ne sont pas définis par induction, mais cela ne semble pas insurmontable.) Ou existe-t-il réellement des endroits où il a été utilisé?