El problema de representar las variables ligadas en la sintaxis, y en particular el de la sustitución para evitar la captura, es bien conocido y tiene una serie de soluciones: variables nombradas con equivalencia alfa, índices de Bruijn, anonimato local, conjuntos nominales, etc.
Pero parece haber otro enfoque bastante obvio, que sin embargo no he visto usado en ningún lado. Es decir, en la sintaxis básica tenemos solo un término "variable", escrito say , y luego le damos por separado una función que asigna cada variable a una carpeta en cuyo ámbito se encuentra. Entonces, a -term likeλ
se escribiría , y la función asignaría la primera a la primera y la segunda a la segunda . Por lo tanto, es como los índices de Bruijn, solo que en lugar de tener que "contar s" a medida que retrocede del término para encontrar la carpeta correspondiente, solo evalúa una función. (Si representa esto como una estructura de datos en una implementación, pensaría en equipar cada objeto de término variable con un puntero / referencia simple al objeto de término de carpeta correspondiente).∙ λ ∙ λ λ
Obviamente, esto no es sensato para escribir la sintaxis en una página para que los humanos la lean, pero tampoco lo son los índices de Bruijn. Me parece que tiene un sentido matemático perfecto y, en particular, hace que la sustitución para evitar la captura sea muy fácil: simplemente deje caer el término que está sustituyendo y tome la unión de las funciones de enlace. Es cierto que no tiene una noción de "variable libre", pero (de nuevo) tampoco los índices de Bruijn realmente; en cualquier caso, un término que contiene variables libres se representa como un término con una lista de carpetas de "contexto" al frente.
¿Me estoy perdiendo algo y hay alguna razón por la cual esta representación no funciona? ¿Hay problemas que lo hacen mucho peor que los demás que no vale la pena considerar? (El único problema que se me ocurre en este momento es que el conjunto de términos (junto con sus funciones vinculantes) no está definido inductivamente, pero eso no parece insuperable). ¿O hay realmente lugares donde se ha utilizado?