O problema de representar variáveis ligadas na sintaxe, e em particular o de substituição para evitar capturas, é bem conhecido e tem várias soluções: variáveis nomeadas com equivalência alfa, índices de Bruijn, localmente sem nome, conjuntos nominais etc.
Mas parece haver outra abordagem bastante óbvia, que eu ainda não vi usada em nenhum lugar. Nomeadamente, na sintaxe básica, temos apenas um termo "variável", escrito digamos , e então, separadamente, fornecemos uma função que mapeia cada variável para um fichário em cujo escopo está. Então, um -term comoλ
seria escrito , e a função mapeará o primeiro para o primeiro e o segundo para o segundo . Portanto, é como os índices de Bruijn, apenas em vez de ter que "contar s" enquanto você sai do termo para encontrar o fichário correspondente, basta avaliar uma função. (Se representar isso como uma estrutura de dados em uma implementação, eu pensaria em equipar cada objeto de termo variável com um simples ponteiro / referência ao objeto de termo vinculativo correspondente.)∙ λ ∙ λ λ
Obviamente, isso não é sensato para escrever sintaxe em uma página para humanos lerem, mas também não são os índices de De Bruijn. Parece-me que faz todo o sentido matematicamente e, em particular, facilita muito a substituição que evita a captura: apenas solte o termo que você está substituindo e adote a união das funções de ligação. É verdade que ele não tem noção de "variável livre", mas então (novamente) nem os índices de Bruijn realmente; nos dois casos, um termo contendo variáveis livres é representado com uma lista de ligantes de "contexto" à frente.
Estou faltando alguma coisa e há algum motivo para essa representação não funcionar? Existem problemas que o tornam muito pior do que os outros que não vale a pena considerar? (O único problema em que posso pensar agora é que o conjunto de termos (junto com suas funções vinculativas) não é definido indutivamente, mas isso não parece intransponível.) Ou, na verdade, existem lugares onde foi usado?