По-перше, щоб повторити одну з точок коді, обчислення індуктивних конструкцій (на основі яких є ядро Кока) дуже сильно відрізняється від обчислення конструкцій. Найкраще думати про те, як почати теорію типу Мартіна-Лефа з всесвітів, а потім додати сортувальну опору в нижній частині ієрархії типів. Це зовсім інший звір, ніж оригінальний CoC, який найкраще розглядати як залежну версію F-омеги. (Наприклад, CiC має задані теоретичні моделі, а CoC - ні.)
При цьому, лямбда-куб (членом якого є Кок) зазвичай представлений як система чистого типу з міркувань економії в кількості правил набору тексту. Трактуючи сорти, типи та терміни як елементи однієї і тієї ж синтаксичної категорії, ви можете записати набагато меншу кількість правил, і ваші докази також стануть трохи менш зайвими.
Однак для розуміння може бути корисним чітке виділення різних категорій. Ми можемо запровадити три синтаксичні категорії, види (розподілені за метавимірюваними k
), типи (діапазон за метавимірюваними A
) та терміни (діапазон по метаваріабельній e
). Тоді всі вісім систем можна розуміти як варіації того, що дозволено на кожному з трьох рівнів.
λ → (просто набране лямбда-числення)
k ::= ∗
A ::= p | A → B
e ::= x | λx:A.e | e e
Це основне набране лямбда-числення. Є єдиний вид ∗
, який є типом. Самі типи - це атомні типи p
та типи функцій A → B
. Терміни - це змінні, абстракції або програми.
λω_ (STLC + оператори вищого типу)
k ::= ∗ | k → k
A ::= a | p | A → B | λa:k.A | A B
e ::= x | λx:A.e | e e
STLC допускає абстрагування лише на рівні термінів. Якщо ми додаємо його на рівні типів, тоді ми додамо новий вид, k → k
який є типом функцій на рівні типу, а також абстрагуванням λa:k.A
та застосуванням A B
на рівні типу. Тому зараз у нас немає поліморфізму, але ми маємо оператори типу.
Якщо пам'ять служить, ця система не має більше обчислювальної потужності, ніж STLC; це просто дає можливість скоротити типи.
λ2 (система F)
k ::= ∗
A ::= a | p | A → B | ∀a:k. A
e ::= x | λx:A.e | e e | Λa:k. e | e [A]
Замість додавання операторів типів ми могли б додати поліморфізм. На рівні типу додаємо, ∀a:k. A
який є колишнім поліморфним типом, а на рівні терміна додаємо абстракцію над типами Λa:k. e
та типовими додатками e [A]
.
Ця система набагато потужніша за STLC - вона така ж сильна, як арифметика другого порядку.
λω (система F-омега)
k ::= ∗ | k → k
A ::= a | p | A → B | ∀a:k. A | λa:k.A | A B
e ::= x | λx:A.e | e e | Λa:k. e | e [A]
Якщо у нас є оператори типу і поліморфізм, ми отримуємо F-омегу. Ця система є більш-менш теорією типу ядра більшості сучасних функціональних мов (наприклад, ML та Haskell). Він також набагато потужніший, ніж Система F - він еквівалентний за силою арифметиці вищого порядку.
λP (LF)
k ::= ∗ | Πx:A. k
A ::= a | p | Πx:A. B | Λx:A.B | A [e]
e ::= x | λx:A.e | e e
Замість поліморфізму ми могли б піти у напрямку залежності від просто набраного лямбдального числення. Якщо ви дозволили типу функції дозволити використовувати його аргумент у типі повернення (тобто записувати Πx:A. B(x)
замість A → B
), то ви отримаєте λP. Щоб зробити це по-справжньому корисним, нам потрібно розширити набір типів операторами типу, які беруть терміни як аргументи Πx:A. k
, і тому нам також потрібно додати відповідну абстракцію Λx:A.B
та додаток A [e]
на рівні типу.
Ця система іноді називається LF, або Edinburgh Logical Framework.
Він має таку ж обчислювальну силу, як і просто набране лямбда-числення.
λP2 (немає спеціальної назви)
k ::= ∗ | Πx:A. k
A ::= a | p | Πx:A. B | ∀a:k.A | Λx:A.B | A [e]
e ::= x | λx:A.e | e e | Λa:k. e | e [A]
Ми також можемо додати поліморфізм до λP, щоб отримати λP2. Ця система не часто використовується, тому не має конкретної назви. (Один документ, який я прочитав, який використовував, - це індукція Германа Гейвера, не виведена в залежності від другого типу теорії залежного типу .)
Ця система має таку ж міцність, що і система F.
λPω_ (немає спеціальної назви)
k ::= ∗ | Πx:A. k | Πa:k. k'
A ::= a | p | Πx:A. B | Λx:A.B | A [e] | λa:k.A | A B
e ::= x | λx:A.e | e e
Ми також можемо додати оператори типу до λP, щоб отримати λPω_. Це включає в себе додавання типу Πa:k. k'
для операторів типів, а також відповідних абстракцій на рівні типу Λx:A.B
та застосування A [e]
.
Оскільки знову не спостерігається стрибка обчислювальної сили над STLC, ця система також повинна створити чудову основу для логічної основи, але ніхто цього не зробив.
λPω (обчислення конструкцій)
k ::= ∗ | Πx:A. k | Πa:k. k'
A ::= a | p | Πx:A. B | ∀a:k.A | Λx:A.B | A [e] | λa:k.A | A B
e ::= x | λx:A.e | e e | Λa:k. e | e [A]
Нарешті, ми дістаємось до λPω, обчислення конструкцій, взявши λPω_ і додавши поліморфний тип колишнього ∀a:k.A
та термінального абстрагування Λa:k. e
та застосувавши e [A]
його.
Типи цієї системи набагато виразніше, ніж у F-омезі, але вона має таку ж обчислювальну силу.
soft-question
. Тут я не бачу актуального технічного питання. Можливо, ви можете бути трохи більш конкретними щодо того, що ви просите?