Problem reprezentowania zmiennych powiązanych w składni, a zwłaszcza podstawiania unikania przechwytywania, jest dobrze znany i ma wiele rozwiązań: zmienne nazwane z równoważnością alfa, wskaźniki de Bruijna, lokalna bezimienność, zbiory nominalne itp.
Ale wydaje się, że istnieje inne dość oczywiste podejście, którego jednak nigdzie nie widziałem. Mianowicie, w podstawowej składni mamy tylko jeden termin „zmienny”, zapisany powiedzmy , a następnie osobno dajemy funkcję, która mapuje każdą zmienną na spoiwo, w którego zakresie się ona znajduje. Tak jak termin λ
zostanie napisane , a funkcja odwzorowuje pierwszą ∙ na pierwszą λ, a drugą ∙ na drugą λ . Jest to więc coś w rodzaju wskaźników de Bruijna, tylko zamiast „liczyć λs ”, gdy wycofujesz się z terminu, aby znaleźć odpowiednie spoiwo, po prostu oceniasz funkcję. (Reprezentując to jako strukturę danych w implementacji, pomyślałbym o wyposażeniu każdego obiektu o zmiennej wartości w prosty wskaźnik / odniesienie do odpowiedniego obiektu o charakterze wiążącym).
Oczywiście nie jest to rozsądne, aby pisać składnię na stronie, aby ludzie mogli ją przeczytać, ale wtedy też nie są to wskaźniki de Bruijna. Wydaje mi się, że ma to matematyczny sens, w szczególności sprawia, że bardzo łatwo jest zastąpić unikanie przechwytywania: wystarczy wpisać termin, który zastępujesz i wziąć połączenie funkcji wiążących. To prawda, że nie ma pojęcia „zmiennej zmiennej”, ale (ponownie) tak naprawdę nie ma też indeksów de Bruijna; w obu przypadkach termin zawierający wolne zmienne jest reprezentowany z przodu z listą segregatorów „kontekstowych”.
Czy coś mi brakuje i jest jakiś powód, dla którego ta reprezentacja nie działa? Czy są problemy, które sprawiają, że jest o wiele gorzej niż inne, że nie warto brać pod uwagę? (Jedyny problem, jaki mogę teraz wymyślić, to to, że zestaw terminów (wraz z ich wiążącymi funkcjami) nie jest zdefiniowany indukcyjnie, ale nie wydaje się to nie do pokonania.) Czy są też miejsca, w których zostały użyte?