Проблема представлення зв'язаних змінних у синтаксисі, зокрема, заміщення, що уникає захоплення, є загальновідомою та має ряд рішень: названі змінні з альфа-еквівалентністю, індекси de Bruijn, локальні безіменності, номінальні множини тощо.
Але, мабуть, існує ще один досить очевидний підхід, який я все-таки не бачив ніде. А саме, у базовому синтаксисі у нас є лише один термін "змінної", написаний сказати , а потім окремо ми надаємо функцію, яка відображає кожну змінну до в'яжучого, в області якого вона лежить. Тож -терм подобається
буде написано , і функція буде відображати першу до першої а другу для другої . Тож це на зразок індексів де Бруйна, лише замість того, щоб "рахувати ", коли ви виходите з терміна, щоб знайти відповідне в'яжуче, ви просто оціните функцію. (Якщо представляти це як структуру даних у реалізації, я б подумав оснастити кожен змінний термін об'єктом простим покажчиком / посиланням на відповідний об'єкт-зв'язувальний термін.)∙ λ ∙ λ λ
Очевидно, що це не є розумним для написання синтаксису на сторінці для того, щоб люди читали, але тоді вони також не є індексами де Бруйна. Мені здається, що це має ідеальний сенс математично, і, зокрема, робить підстановку, що уникає захоплення, дуже просто: просто опустіть термін, який ви замінюєте, і прийміть об'єднання функцій зв'язування. Це правда, що він не має поняття "вільна змінна", але тоді (знову ж таки) також не мають індексів де Бреййн насправді; в будь-якому випадку термін, що містить вільні змінні, представляється терміном зі списком "контекстних" в'яжучих спереду.
Я щось пропускаю, і є причина, чому це представлення не працює? Чи є проблеми, які роблять це набагато гірше, ніж інші, про що не варто замислюватися? (Єдиною проблемою, про яку я зараз можу подумати, є те, що набір термінів (разом із їх обов'язковими функціями) не визначений індуктивно, але це не здається нездоланним.) Або дійсно є місця, де він був використаний?