По-перше, щоб повторити одну з точок коді, обчислення індуктивних конструкцій (на основі яких є ядро Кока) дуже сильно відрізняється від обчислення конструкцій. Найкраще думати про те, як почати теорію типу Мартіна-Лефа з всесвітів, а потім додати сортувальну опору в нижній частині ієрархії типів. Це зовсім інший звір, ніж оригінальний 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. Тут я не бачу актуального технічного питання. Можливо, ви можете бути трохи більш конкретними щодо того, що ви просите?