Система 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 одиничного типу α.αα можна застосувати до власного типу, породжуючи терм типу . Як показав Джо Веллз (Joe Wells) 1994 року[3], задача виведення типів для версії Каррі системи F нерозв'язна. Тому при практичній реалізації мов програмування зазвичай використовують обмежені, предикативні версії поліморфізму: пренекс-поліморфізм (поліморфізм у стилі ML), поліморфізм рангу 2 тощо. У разі пренекс-поліморфізму областю визначення змінних типу є лише типи без кванторів. У цих системах задачу виведення типів можна розв'язати, такий висновок базується на алгоритмі Гіндлі — Мілнера.
  • Відповідність Каррі — Говарда пов'язує систему F із мінімальною інтуїціоністською Шаблон:Iw, формули якої побудовано з пропозиційних змінних за допомогою імплікації та універсальної квантифікації за висловлюваннями. При цьому значення (істина), (брехня), зв'язки ¬ (заперечення), (кон'юнкція) та (диз'юнкція), а також (квантор існування) можна визначити так
α.αα
α.α
¬AA
ABα.(ABα)α
ABα.(Aα)(Bα)α
α.M[α]γ.(α.M[α]γ)γ

Зазначимо, що відповідність Каррі — Говарда ставить у відповідність до істини — одиничний тип, брехні — порожній тип, кон'юнкції — добуток типів, а диз'юнкції — їх суму.

Примітки

Шаблон:Reflist

Література

Шаблон:Типи даних

  1. 1,0 1,1 Помилка цитування: Неправильний виклик тегу <ref>: для виносок під назвою Girard72 не вказано текст
  2. Помилка цитування: Неправильний виклик тегу <ref>: для виносок під назвою Reynolds74 не вказано текст
  3. Помилка цитування: Неправильний виклик тегу <ref>: для виносок під назвою Wells94 не вказано текст