Система F

Материал из testwiki
Перейти к навигации Перейти к поиску

Система F (полиморфное лямбда-исчисление, система λ2, типизированное лямбда-исчисление второго порядка) — система типизированного лямбда-исчисления, отличающаяся от просто типизированной системы наличием механизма универсальной квантификации над типами. Эту систему разработал в 1972 году Жан-Ив Жирар [1] в контексте теории доказательств в логике. Независимо от него подобную систему предложил в 1974 году Джон Рейнольдс[2]. Система F позволяет формализовать концепцию параметрического полиморфизма в языках программирования и служит теоретической основой для таких языков программирования как Haskell и ML.

Система F допускает конструирование термов, зависящих от типов. Технически это достигается через механизм абстрагирования терма по типу, что в результате даёт новый терм. Традиционно для такой абстракции используют символ большой лямбды Λ. Например, взяв терм λxα.x типа αα и абстрагируясь по переменной типа α, получаем терм Λα.λxα.x. Этот терм представляет собой функцию из типов в термы. Применяя эту функцию к различным типам, мы будем получать термы с идентичной структурой, но разными типами:

(Λα.λxα.x)Bool β λxBool.x — терм типа BoolBool;
(Λα.λxα.x)Nat β λxNat.x — терм типа NatNat.

Видно, что терм Λα.λxα.x обладает полиморфным поведением, то есть задаёт общий интерфейс для различных типов данных. В Системе F этому терму приписывается тип α.αα. Квантор всеобщности в типе подчёркивает возможность подстановки вместо переменной типа α любого допустимого типа.

Формальное описание

Синтаксис типов

Типы Системы F конструируются из набора переменных типа с помощью операторов и . По традиции для переменных типа используют греческие буквы. Правила формирования типов таковы:

  • (Переменная типа) Если α — переменная типа, то α — это тип;
  • (Стрелочный тип) Если A и B являются типами, то (AB) — это тип;
  • (Универсальный тип) Если α является переменной типа, а B — типом, то (α.B) — это тип.

Внешние скобки часто опускают, оператор считают правоассоциативным, а действие оператора продолжающимся вправо насколько это возможно. Например, α.β.αβα — стандартное сокращение для (α.(β.(α(βα)))).

Синтаксис термов

Термы Системы F конструируются из набора термовых переменных (x, y, z и т.д.) по следующим правилам

  • (Переменная) Если x — переменная, то x — это терм;
  • (Абстракция) Если x является переменной, A — типом, а M — термом, то (λxA.M) — это терм;
  • (Применение) Если M и N являются термами, то (MN) — это терм;
  • (Универсальная абстракция) Если α является переменной типа, а M — термом, то (Λα.M) — это терм;
  • (Универсальное применение) Если M является термом, а A — типом, то (MA) — это терм.

Внешние скобки часто опускают, оба сорта применения считают левоассоциативными, а действие абстракций — продолжающимся вправо насколько это возможно.

Различают две версии просто типизированной системы. Если, как в приведённых выше правилах, термовые переменные в лямбда-абстракции аннотируются типами, то систему называют типизированной по Чёрчу. Если же правило абстракции заменить на

  • (Абстракция по Карри) Если x является переменной, а M — термом, то (λx.M) — это терм,

и отбросить два последних правила, то систему называют типизированной по Карри. Фактически, термы системы, типизированной по Карри, те же, что и в бестиповом лямбда-исчислении.

Правила редукции

Помимо стандартного для лямбда-исчисления правила β-редукции

(λaA.M)N β M[a:=N]

в системе F в стиле Чёрча вводится дополнительное правило,

(Λα.M)A β M[α:=A],

позволяющее вычислять применение терма к типу через механизм подстановки типа вместо переменной типа.

Контексты типизации и утверждение типизации

Контекстом, как и в просто типизированном лямбда-исчислении, называется множество утверждений о приписывании типов различным переменным, разделённых запятой

Γ=x1:A1,x2:A1,,xn:An

В контекст можно добавить «свежую» для этого контекста переменную: если Γ — допустимый контекст, не содержащий переменной x, а B — тип, то Γ,x:B — тоже допустимый контекст.

Общий вид утверждения о типизации таков:

ΓM:A

Это читается следующим образом: в контексте Γ терм M имеет тип A.

Правила типизации по Чёрчу

В Системе F, типизированной по Чёрчу, приписывание типов термам осуществляется в соответствии со следующими правилами:

(Начальное правило) Если переменная x присутствует с типом A в контексте Γ, то в этом контексте x имеет тип A. В виде правила вывода

x:AΓΓx:A

(Правило введения ) Если в некотором контексте, расширенном утверждением, что a имеет тип A, терм M имеет тип B, то в упомянутом контексте (без a), лямбда-абстракция λaA.M имеет тип AB. В виде правила вывода

Γ,a:AM:BΓ(λaA.M):(AB)

(Правило удаления ) Если в некотором контексте терм M имеет тип AB, а терм N имеет тип A, то применение MN имеет тип B. В виде правила вывода

ΓM:(AB)ΓN:AΓ(MN):B

(Правило введения ) Если в некотором контексте терм M имеет тип A, то в этом контексте терм Λα.M имеет тип α.A. В виде правила вывода

ΓM:AΓ(Λα.M):(α.A)

Это правило требует оговорки: переменная типа α не должна встречаться в утверждениях типизации контекста Γ.

(Правило удаления ) Если в некотором контексте терм M имеет тип α.A, и B — это тип, то в этом контексте терм MB имеет тип A[α:=B]. В виде правила вывода

ΓM:(α.A)Γ(MB):(A[α:=B])

Правила типизации по Карри

В Системе F, типизированной по Карри, приписывание типов термам осуществляется в соответствии со следующими правилами:

(Начальное правило) Если переменная x присутствует с типом A в контексте Γ, то в этом контексте x имеет тип A. В виде правила вывода

x:AΓΓx:A

(Правило введения ) Если в некотором контексте, расширенном утверждением, что a имеет тип A, терм M имеет тип B, то в упомянутом контексте (без a), лямбда-абстракция λa.M имеет тип AB. В виде правила вывода

Γ,a:AM:BΓ(λa.M):(AB)

(Правило удаления ) Если в некотором контексте терм M имеет тип AB, а терм N имеет тип A, то применение MN имеет тип B. В виде правила вывода

ΓM:(AB)ΓN:AΓ(MN):B

(Правило введения ) Если в некотором контексте терм M имеет тип A, то в этом контексте этому терму M может быть приписан и тип α.A. В виде правила вывода

ΓM:AΓM:(α.A)

Это правило требует оговорки: переменная типа α не должна встречаться в утверждениях типизации контекста Γ.

(Правило удаления ) Если в некотором контексте терм M имеет тип α.A, и B — это тип, то в этом контексте этому терму M может быть приписан и тип A[α:=B]. В виде правила вывода

ΓM:(α.A)ΓM:(A[α:=B])

Пример. По начальному правилу:

x:(α.αα)x:(α.αα)

Применим правило удаления , взяв в качестве B тип α.αα

x:(α.αα)x:(α.αα)(α.αα)

Теперь по правилу удаления имеем возможность применить терм x сам к себе

x:(α.αα)(xx):(α.αα)

и, наконец, по правилу введения

(λx.xx):(α.αα)(α.αα)

Это пример терма, типизируемого в Системе F, но не в просто типизированной системе.

Представление типов данных

Система F обладает достаточными выразительными средствами, для того чтобы напрямую реализовать многие типы данных, используемые в языках программирования. Будем работать в версии Чёрча системы F.

Пустой тип. Тип

  α.α

необитаем в системе F, то есть в ней отсутствуют термы с таким типом.

Единичный тип. У типа

  α.αα

в системе F имеется единственный находящийся в нормальной форме обитатель — терм

𝚒𝚍  Λα.λxα.x.

Булев тип. В системе F задается так:

𝙱𝚘𝚘𝚕  α.ααα.

У этого типа ровно два обитателя, отождествляемых с двумя булевыми константами

𝚝𝚛𝚞𝚎  Λα.λxα.λyα.x
𝚏𝚊𝚕𝚜𝚎  Λα.λxα.λyα.y

Конструкция условного оператора

𝚒𝚏𝚃𝚑𝚎𝚗𝙴𝚕𝚜𝚎  Λα.λb𝙱𝚘𝚘𝚕.λxα.λyα.bαxy

Эта функция удовлетворяет естественным требованиям

𝚒𝚏𝚃𝚑𝚎𝚗𝙴𝚕𝚜𝚎A𝚝𝚛𝚞𝚎MN=M

и

𝚒𝚏𝚃𝚑𝚎𝚗𝙴𝚕𝚜𝚎A𝚏𝚊𝚕𝚜𝚎MN=N

для произвольного типа A и произвольных M:A и N:A. В этом легко убедиться, раскрыв определения и выполнив β-редукции.

Тип произведения. Для произвольных типов A и B тип их декартова произведения

A×Bα.(ABα)α

населён парой

M;NΛα.λf(ABα).fMN

для каждых M:A и N:B. Проекции пары задаются функциями

𝚏𝚜𝚝  Λα.Λβ.λpα×β.pα(λxα.λyβ.x):α.β.α×βα
𝚜𝚗𝚍  Λα.Λβ.λpα×β.pβ(λxα.λyβ.y):α.β.α×ββ

Эти функции удовлетворяют естественным требованиям 𝚏𝚜𝚝ABM;N=M и 𝚜𝚗𝚍ABM;N=N.

Тип суммы. Для произвольных типов A и B тип их суммы

A+Bα.(Aα)(Bα)α

населён либо термом типа A, либо термом типа B, в зависимости от применённого конструктора

𝚒𝚗𝚓𝙻MΛα.λfAα.λgBα.fM
𝚒𝚗𝚓𝚁NΛα.λfAα.λgBα.gN

Здесь M:A, N:B. Функция, осуществляющая разбор случаев (сопоставление с образцом), имеет вид

𝚖𝚊𝚝𝚌𝚑Λα.Λβ.Λγ.λsα+β.λfαγ.λgβγ.sγfg:α.β.γ.α+β(αγ)(βγ)γ

Эта функция удовлетворяет следующим естественным требованиям

𝚖𝚊𝚝𝚌𝚑ABC(𝚒𝚗𝚓𝙻M)FG=FM

и

𝚖𝚊𝚝𝚌𝚑ABC(𝚒𝚗𝚓𝚁N)FG=GN

для произвольных типов A, B и C и произвольных термов F:AC и G:BC.

Числа Чёрча. Тип натуральных чисел в системе F

𝙽𝚊𝚝  α.α(αα)α

населён бесконечным количеством различных элементов, получаемых посредством двух конструкторов 𝚣𝚎𝚛𝚘:𝙽𝚊𝚝 и 𝚜𝚞𝚌𝚌:𝙽𝚊𝚝𝙽𝚊𝚝:

𝚣𝚎𝚛𝚘  Λα.λzα.λsαα.z
𝚜𝚞𝚌𝚌  λn𝙽𝚊𝚝.Λα.λzα.λsαα.s(nαzs)

Натуральное число n может быть получено n-кратным применением второго конструктора к первому или, эквивалентно, представлено термом

n  Λα.λzα.λsαα.s(s(s(snz)))

Свойства

  • Просто типизированная система обладает свойством типовой безопасности: при β-редукциях тип лямбда-терма остаётся неизменным, а сама типизация не мешает продвижению вычислений.
  • В своей диссертации Жан-Ив Жирар показал[1], что Система F обладает свойством сильной нормализации: любой допустимый терм за конечное число β-редукций приводится к единственной нормальной форме.
  • Система F является Шаблон:Не переведено системой, поскольку переменная типа, связываемая квантором всеобщности при определении универсального типа, может замещаться самим определяемым объектом. Например, терм id единичного типа α.αα может быть применён к собственному типу, порождая терм типа . Как показал Джо Уэллс в 1994 году[3], задача вывода типов для версии Карри Системы F неразрешима. Поэтому при практической реализации языков программирования обычно используют ограниченные, предикативные версии полиморфизма: пренекс-полиморфизм (полиморфизм в стиле ML), полиморфизм ранга 2 и т.п. В случае пренекс-полиморфизма областью определения переменных типа служат только типы без кванторов. В этих системах задача вывода типов разрешима, такой вывод базируется на алгоритме Хиндли — Милнера.
  • Соответствие Карри — Ховарда связывает Систему F с минимальной интуиционистской Шаблон:Не переведено, формулы которой построены из пропозициональных переменных с помощью импликации и универсальной квантификации по высказываниям. При этом значения (истина), (ложь), связки ¬ (отрицание), (конъюнкция) и (дизъюнкция), а также (квантор существования) могут быть определены так
α.αα
α.α
¬AA
ABα.(ABα)α
ABα.(Aα)(Bα)α
α.M[α]γ.(α.M[α]γ)γ

Отметим, что соответствие Карри — Ховарда ставит в соответствие истине — единичный тип, лжи — пустой тип, конъюнкции — произведение типов, а дизъюнкции — их сумму.

Примечания

Шаблон:Примечания

Литература

  1. 1,0 1,1 Ошибка цитирования Неверный тег <ref>; для сносок Girard72 не указан текст
  2. Ошибка цитирования Неверный тег <ref>; для сносок Reynolds74 не указан текст
  3. Ошибка цитирования Неверный тег <ref>; для сносок Wells94 не указан текст