TL; DR. Метаматематика связывания является тонкой : они кажутся тривиальными, но это не так - независимо от того, имеете ли вы дело с (более высокого порядка) логикой или 𝜆-исчислением. Они настолько тонки, что связывающие представления образуют открытую область исследований с конкуренцией ( проблема POPLmark ) несколько лет назад. В этой области люди даже шутят о сложности подходов к связыванию.
Так что, если вы заботитесь о метаматематике (а большинство математиков не заботятся), вам нужно разобраться с связыванием. Но многие математики могут спокойно относиться к формализации связывания, как если бы это была «фундаментальная» проблема.
Другое дело, что связывание было единственной «новой» проблемой в языках с функциями более высокого порядка, потому что теория языков со связыванием - это просто алгебра (для констант) + связывание. «Основы языков программирования» Митчелла на самом деле представляют вещи в таком порядке и довольно поучительно.
Мне известно о том, как его работа проложила путь для λ-исчисления и как влияет «оно» на вычисления и функциональное программирование в целом. Мой вопрос в основном касается времени «до» создания λ-исчисления и «после» статьи Шенфинкеля.
Должно быть, я что-то упустил, но это замечание, похоже, не имеет значения. Связывание в логике высшего порядка и связывание в λ-исчислении кажутся такими же трудными, поэтому, пока люди заботятся о логике высшего порядка, им приходится иметь дело с связыванием. Я смещен с помощью доказательств теоремы Карри-Говарда, основанных на изоморфизме, которые реализуют логику, просто реализуя теорию типов (где типы - это формулы, а программы - проверочные термины), так что я просто один раз имею дело с привязкой.
С другой стороны, IIRC, в то время действительно мало кто заботился о работе Шенфинкеля - отчасти из-за того, как он (не) публиковал ее - бумаги были в основном написаны коллегами на основе проведенного им исследования (см. Здесь , стр. 4) ; Затем Карри заново открыл теорию самостоятельно.
Предостережение: я не историк, а аспирант по PL, поэтому у меня современный (и, надеюсь, точный) взгляд на тему.
РЕДАКТИРОВАТЬ:
Почему привязка тонкая, немного конкретнее
У этого есть два аспекта - во-первых, реализовать это сложно. Во-вторых, метаматематика - это математика манипулирования доказательствами: эта манипуляция, как правило, автоматическая, то есть это алгоритм - так что, по сути, вы сталкиваетесь со всеми трудностями реализации, а также с доказательствами о них. Ниже я привожу примеры. Примеры имеют современную перспективу - они о фактически формализованных доказательствах. Тем не менее, некоторые трудности будут распространяться на точные ручные доказательства - если вы не обманываете детали.
Это показывает, что Шенфинкель просто дал первое решение этой проблемы, но это было далеко не окончательно.
Реализация это тонко из-за затенения
Основная проблема в реализации - это слежка. Обычно нельзя использовать одно и то же имя для разных связанных переменных. Но вы не можете избежать этого в лямбда-исчислении, хотя бы потому, что функции (и связанные с ними переменные) дублируются: сводится к . Это еще не проблема, но, начиная с вы и затем : теперь вам нужно разобраться с затенением. Вы можете избежать этого за счет усложнения правила бета-сокращения.( λ f, е 1 + ф 2 ) ( λ х . Х )( λ x . x ) 1 + ( λ x . x ) 2 ( λ fх . е( фх ) ) ( λ г Y, грамм Y) z ( λ y . ( λ g y . g y ) y ) z( λ гY, грамм Y) ( λ г Y, грамм Y) z ( λ y, ( λ гY, грамм Y) у ) z
Если у вас есть разные переменные с одинаковым именем, вам также нужно предотвратить захват. Простейший пример захвата - это применение функции (вернуть первый аргумент) не должен давать (тождественная функция), но (постоянная функция).y λ y . y λ y ′ . Yλ x y, ИксYλ y, Yλ y', Y
Хуже всего то, что контрпримеры к наивным алгоритмам сложно построить, когда вы уже знаете проблему, не говоря уже о том, когда вы этого не знаете. Ошибки в почти правильных алгоритмах часто остаются незамеченными годами. Я слышал, что даже хорошие студенты, как правило, не могут придумать (самостоятельно) правильное определение замены, избегающей захвата. На самом деле, аспиранты (включая меня) и профессора не освобождаются от этой проблемы.
Это одна из причин, почему некоторые (в том числе один из лучших учебников по языкам программирования « Типы и языки программирования » Бенджамина Пирса) рекомендуют безымянное представление (не совсем комбинаторную логику, хотя она и используется, а скорее индексы де Бруйина).
Доказательства об этом неуловимы
Оказывается, что доказательства привязки не проще, чем реализация, как упоминалось выше. Конечно, существуют правильные алгоритмы, и доказательства о них существуют - но без продвинутых механизмов, для каждого языка, использующего связывание, вам нужно повторять доказательства, и эти доказательства просто очень большие и раздражающие, если вы используете определения для связывания на ручке и бумаге. ,
В качестве примера алгоритмов , участвующих в метаматематике, рассмотрим теорему дедукции в логике, что позволяет сочиняет доказательство предполагающей и доказательство , чтобы получить доказательство . Для того, чтобы доказать , что теорема, вы на самом деле демонстрируют алгоритм , который работает на синтаксисе двух доказательств , участвующих и производит синтаксис для доказательства . Этот алгоритм должен иметь дело с привязкой.A A B BВAAВВ
Затем я посмотрел мой лучший пример того, «что пойдет не так, если вы попытаетесь формализовать стандартное определение». Рассел О'Коннор (который находится на этом сайте) формализовал первую теорему Гёделя о неполноте в Coq (доказатель теорем упомянутого выше типа) - и эта теорема включает логику (со всеми соответствующими алгоритмами) в другой логике (с синтаксисом первая логика закодирована как числа). Он использовал определения, которые используются на бумаге, и формализовал их напрямую. Ищите «подстановка» или «переменная» и подсчитывайте, как часто они появляются в связи с проблемами, чтобы получить впечатление.
http://r6.ca/Goedel/goedel1.html
Я никогда не использую эти определения в своей работе, но у каждого альтернативного подхода есть свои недостатки.