Система F (также полиморфное лямбда-исчисление или лямбда-исчисление второго порядка ) — типизированное лямбда-исчисление , которое вводит в простое типизированное лямбда-исчисление механизм универсальной квантификации по типам. Система F формализует параметрический полиморфизм в языках программирования , тем самым формируя теоретическую основу для таких языков, как Haskell и ML . Она была открыта независимо логиком Жаном-Ивом Жираром (1972) и компьютерным ученым Джоном К. Рейнольдсом .
В то время как просто типизированное лямбда-исчисление имеет переменные, ранжирующиеся по терминам, и связующие элементы для них, Система F дополнительно имеет переменные, ранжирующиеся по типам , и связующие элементы для них. Например, тот факт, что функция тождества может иметь любой тип формы A → A, будет формализован в Системе F как суждение
где — переменная типа . Верхний регистр традиционно используется для обозначения функций уровня типа, в отличие от нижнего регистра , который используется для функций уровня значения. (Верхний индекс означает, что граница x имеет тип ; выражение после двоеточия — это тип лямбда-выражения, предшествующего ему.)
Как система переписывания терминов , система F является строго нормализующей . Однако вывод типов в системе F (без явных аннотаций типов) неразрешим. При изоморфизме Карри–Ховарда система F соответствует фрагменту интуиционистской логики второго порядка , которая использует только универсальную квантификацию. Систему F можно рассматривать как часть лямбда-куба вместе с еще более выразительными типизированными лямбда-исчислениями, включая те, которые имеют зависимые типы .
По словам Жирара, буква «F» в аббревиатуре System F была выбрана случайно. [1]
Правила типизации Системы F аналогичны правилам простого типизированного лямбда-исчисления с добавлением следующего:
где есть типы, есть переменная типа, а в контексте указывает, что связан. Первое правило — это правило применения, а второе — правило абстракции. [2] [3]
Тип определяется как: , где — переменная типа . Это означает: — тип всех функций, которые принимают на входе тип α и два выражения типа α, и производят на выходе выражение типа α (обратите внимание, что мы считаем его правоассоциативным . )
Используются следующие два определения для булевых значений , расширяющие определение булевых значений Чёрча :
(Обратите внимание, что две приведенные выше функции требуют трех — а не двух — аргументов. Последние два должны быть лямбда-выражениями, но первый должен быть типом. Этот факт отражен в том факте, что тип этих выражений — ; квантор всеобщности, связывающий α, соответствует Λ, связывающему альфа в самом лямбда-выражении. Также обратите внимание, что — удобное сокращение для , но это не символ самой системы F, а скорее «мета-символ». Аналогично, и также являются «мета-символами», удобными сокращениями «сборок» системы F (в смысле Бурбаки); в противном случае, если бы такие функции могли быть названы (в системе F), то не было бы необходимости в аппарате лямбда-выражений, способном определять функции анонимно, и в комбинаторе с фиксированной точкой , который работает в обход этого ограничения.)
Затем с помощью этих двух -термов мы можем определить некоторые логические операторы (которые имеют тип ):
Обратите внимание, что в определениях выше, является аргументом типа для , указывающим, что два других параметра, которые заданы для , имеют тип . Как и в кодировках Чёрча, нет необходимости в функции IFTHENELSE , поскольку можно просто использовать необработанные типизированные термины в качестве функций принятия решений. Однако, если запрошено:
будет делать. Предикат — это функция, которая возвращает типизированное значение. Самый фундаментальный предикат — ISZERO , который возвращает значение только в том случае, если его аргумент — это число Чёрча 0 :
Система F позволяет встраивать рекурсивные конструкции естественным образом, как в теории типов Мартина-Лёфа . Абстрактные структуры ( S ) создаются с помощью конструкторов . Это функции, типизированные как:
Рекурсия проявляется, когда S сам появляется внутри одного из типов . Если у вас есть m таких конструкторов, вы можете определить тип S как:
Например, натуральные числа можно определить как индуктивный тип данных N с конструкторами
Тип системы F, соответствующий этой структуре, — . Термины этого типа включают в себя типизированную версию числительных Чёрча , первые несколько из которых:
Если мы изменим порядок каррированных аргументов ( т.е. ), то число Чёрча для n будет функцией, которая принимает функцию f в качестве аргумента и возвращает n -ю степень f . То есть число Чёрча будет функцией более высокого порядка — она принимает функцию f с одним аргументом и возвращает другую функцию с одним аргументом.
Версия System F, используемая в этой статье, является явно типизированным исчислением или исчислением в стиле Чёрча. Информация о типизации, содержащаяся в λ-термах, делает проверку типов простой. Джо Уэллс (1994) решил «неловкую открытую проблему», доказав, что проверка типов неразрешима для варианта System F в стиле Карри, то есть для такого, в котором отсутствуют явные аннотации о типизации. [4] [5]
Результат Уэллса подразумевает, что вывод типа для System F невозможен. Ограничение System F, известное как « Хиндли–Милнер », или просто «HM», имеет простой алгоритм вывода типа и используется для многих статически типизированных функциональных языков программирования , таких как Haskell 98 и семейство ML . Со временем, по мере того как ограничения систем типов в стиле HM становились очевидными, языки неуклонно переходили к более выразительной логике для своих систем типов. GHC , компилятор Haskell, выходит за рамки HM (по состоянию на 2008 год) и использует System 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 случайно, сходятся.