Система F (также полиморфное лямбда-исчисление или лямбда-исчисление второго порядка ) представляет собой типизированное лямбда-исчисление , которое вводит в простое типизированное лямбда-исчисление механизм универсальной количественной оценки типов. Система F формализует параметрический полиморфизм в языках программирования , формируя тем самым теоретическую основу для таких языков, как Haskell и ML . Его открыли независимо логик Жан-Ив Жирар (1972) и ученый-компьютерщик Джон К. Рейнольдс .
В то время как просто типизированное лямбда-исчисление имеет переменные, варьирующиеся по типам, и связующие для них, в системе F дополнительно есть переменные, варьирующиеся по типам , и связующие для них. Например, тот факт, что тождественная функция может иметь любой тип формы A → A, будет формализован в Системе F как суждение
где переменная типа . Прописные буквы традиционно используются для обозначения функций уровня типа, в отличие от строчных букв, которые используются для функций уровня значений. (Надстрочный индекс означает, что связанный x имеет тип ; выражение после двоеточия является типом предшествующего ему лямбда-выражения.)
Как система переписывания терминов , Система F является строго нормализующей . Однако вывод типа в Системе F (без явных аннотаций типов) неразрешим. При изоморфизме Карри-Говарда система F соответствует фрагменту интуиционистской логики второго порядка , который использует только универсальную квантификацию. Систему F можно рассматривать как часть лямбда-куба вместе с еще более выразительными типизированными лямбда-исчислениями, в том числе с зависимыми типами .
По словам Жирара, буква «F» в системе F была выбрана случайно. [1]
Правила типизации Системы F аналогичны правилам просто типизированного лямбда-исчисления с добавлением следующего:
где — типы, — переменная типа и в контексте указывает, что она привязана. Первое правило — это правило применения, а второе — правило абстракции. [2] [3]
Тип определяется как: , где — переменная типа . Это означает: является типом всех функций, которые принимают на входе тип α и два выражения типа α и производят на выходе выражение типа α (обратите внимание, что мы считаем его правоассоциативным ) .
Используются следующие два определения логических значений и , расширяющие определение логических значений Черча :
(Обратите внимание, что две приведенные выше функции требуют трех , а не двух аргументов. Последние два должны быть лямбда-выражениями, а первый должен быть типом. Этот факт отражается в том, что тип этих выражений равен ; квантор универсальности привязка α соответствует привязке Λ к альфе в самом лямбда-выражении. Кроме того, обратите внимание, что это удобное сокращение для , но это не символ самой системы F, а скорее «метасимвол», и они являются . также «метасимволы», удобные сокращения «сборок» Системы F (в смысле Бурбаки); в противном случае, если бы такие функции могли быть названы (внутри Системы F), тогда не было бы необходимости в аппарате лямбда-выражения, способном анонимного определения функций и комбинатора с фиксированной точкой , который обходит это ограничение.)
Затем с помощью этих двух -термов мы можем определить некоторые логические операторы (типа ):
Обратите внимание, что в приведенных выше определениях это аргумент типа для , указывающий, что два других параметра, переданных для, имеют тип . Как и в кодировках Чёрча, нет необходимости в функции IFTHENELSE , поскольку в качестве функций принятия решений можно просто использовать необработанные типизированные термины. Однако, если его запросят:
Сделаю. Предикат — это функция, которая возвращает значение типа -type. Самый фундаментальный предикат — это ISZERO , который возвращает значение тогда и только тогда, когда его аргументом является число Чёрча 0 :
Система F позволяет естественным образом встраивать рекурсивные конструкции, аналогично теории типов Мартина-Лёфа . Абстрактные структуры ( S ) создаются с помощью конструкторов . Это функции, типизированные как:
Рекурсивность проявляется, когда сам S появляется внутри одного из типов . Если у вас есть m таких конструкторов, вы можете определить тип S как:
Например, натуральные числа можно определить как индуктивный тип данных N с помощью конструкторов.
Тип системы F, соответствующий этой структуре, — . Термины этого типа представляют собой печатную версию цифр Чёрча , первые несколько из которых:
Если мы изменим порядок каррированных аргументов ( т.е. ), то число Чёрча для n будет функцией, которая принимает функцию f в качестве аргумента и возвращает n- ю степень f . Другими словами, число Чёрча является функцией более высокого порядка : оно принимает функцию с одним аргументом f и возвращает другую функцию с одним аргументом.
Версия системы F, используемая в этой статье, представляет собой явно типизированное исчисление в стиле Чёрча. Информация о типизации, содержащаяся в λ-термах, упрощает проверку типов . Джо Уэллс (1994) решил «неприятную открытую проблему», доказав, что проверка типов неразрешима для варианта системы F в стиле Карри, то есть такого, в котором отсутствуют явные аннотации типизации. [4] [5]
Результат Уэллса подразумевает, что вывод типа для системы F невозможен. Ограничение системы F, известное как « Хиндли-Милнер » или просто «HM», действительно имеет простой алгоритм вывода типа и используется для многих статически типизированных функциональных языков программирования , таких как Haskell 98 и семейство ML . Со временем, когда ограничения систем типов в стиле HM стали очевидны, языки постепенно перешли к более выразительной логике своих систем типов. GHC - компилятор Haskell, выходит за рамки HM (по состоянию на 2008 год) и использует расширенную систему F с несинтаксическим равенством типов; [6] Функции, не относящиеся к HM, в системе типов OCaml включают GADT . [7] [8]
В интуиционистской логике второго порядка полиморфное лямбда-исчисление второго порядка (F2) было открыто Жираром (1972) и независимо Рейнольдсом (1974). [9] Жирар доказал теорему о представлении : в интуиционистской логике предикатов второго порядка (P2) функции от натуральных чисел до натуральных чисел, полная которых может быть доказана, образуют проекцию из P2 в F2. [9] Рейнольдс доказал теорему абстракции : каждый термин в F2 удовлетворяет логическому отношению, которое может быть встроено в логические отношения P2. [9] Рейнольдс доказал, что проекция Жирара, за которой следует вложение Рейнольдса, образует тождество, т. е. изоморфизм Жирара-Рейнольдса . [9]
В то время как Система F соответствует первой оси лямбда-куба Барендрегта , Система F ω или полиморфное лямбда-исчисление более высокого порядка объединяет первую ось (полиморфизм) со второй осью ( операторы типа ); это другая, более сложная система.
Систему F ω можно определить индуктивно на семействе систем, где индукция основана на видах , разрешенных в каждой системе:
В пределе мы можем определить систему как
То есть F ω — это система, которая переводит функции из типов в типы, где аргумент (и результат) может быть любого порядка.
Обратите внимание: хотя F ω не накладывает никаких ограничений на порядок аргументов в этих отображениях, он ограничивает вселенную аргументов для этих отображений: они должны быть типами, а не значениями. Система F ω не допускает отображения значений в типы ( зависимые типы ), хотя она допускает отображения значений в значения ( абстракция), отображения типов в значения ( абстракция) и отображения типов в типы ( абстракция на уровне типы).
Система F <: , произносится как «F-sub», является расширением системы F с подтипом . Система F <: имеет центральное значение для теории языков программирования с 1980-х годов , поскольку ядро функциональных языков программирования , как и языки семейства ML , поддерживает как параметрический полиморфизм , так и подтипирование записей , которые могут быть выражены в системе F. <: . [10] [11]
Однако в [3] было показано, что очевидные правила преобразования для этой системы, названной случайно F, являются сходящимися.