Erstens, um einen von Codys Punkten zu wiederholen, unterscheidet sich der Calculus of Inductive Constructions (auf dem Coqs Kernel basiert) stark vom Calculus of Constructions. Es wird am besten angenommen, dass Sie mit der Martin-Löf-Typentheorie mit Universen beginnen und dann eine Sortierstütze am Ende der Typhierarchie hinzufügen. Dies ist ein ganz anderes Biest als das ursprüngliche CoC, das man sich am besten als abhängige Version von F-Omega vorstellen kann. (Zum Beispiel hat CiC satztheoretische Modelle und das CoC nicht.)
Allerdings wird der Lambda-Würfel (dem der CoC angehört) aus Gründen der Wirtschaftlichkeit in Bezug auf die Anzahl der Schreibregeln in der Regel als reines Typensystem dargestellt. Indem Sie Sorten, Typen und Terme als Elemente derselben syntaktischen Kategorie behandeln, können Sie viel weniger Regeln aufschreiben und Ihre Beweise werden auch einiges weniger redundant.
Zum besseren Verständnis kann es jedoch hilfreich sein, die verschiedenen Kategorien explizit voneinander zu trennen. Wir können drei syntaktische Kategorien einführen, Arten (die von der Metavariable überlagert werden k
), Typen (die von der Metavariable überlagert werden A
) und Ausdrücke (die von der Metavariable überlagert werden e
). Dann können alle acht Systeme als Variationen dessen verstanden werden, was auf jeder der drei Ebenen erlaubt ist.
λ → (einfach eingegebene Lambda-Rechnung)
k ::= ∗
A ::= p | A → B
e ::= x | λx:A.e | e e
Dies ist die grundlegende typisierte Lambda-Rechnung. Es gibt eine einzige Art ∗
, nämlich die Art der Typen. Die Typen selbst sind atomare Typen p
und Funktionstypen A → B
. Begriffe sind Variablen, Abstraktionen oder Anwendungen.
λω_ (STLC + Operatoren höherer Art)
k ::= ∗ | k → k
A ::= a | p | A → B | λa:k.A | A B
e ::= x | λx:A.e | e e
Die STLC erlaubt nur Abstraktion auf der Ebene von Begriffen. Wenn wir es auf der Ebene der Typen hinzufügen, fügen wir eine neue Art hinzu k → k
, nämlich die Art der Funktionen auf Typebene und die Abstraktion λa:k.A
und Anwendung auch A B
auf Typebene. Wir haben also keinen Polymorphismus, aber wir haben Typoperatoren.
Wenn Speicher zur Verfügung steht, verfügt dieses System über keine größere Rechenleistung als die STLC. Es gibt Ihnen nur die Möglichkeit, Typen abzukürzen.
λ2 (System F)
k ::= ∗
A ::= a | p | A → B | ∀a:k. A
e ::= x | λx:A.e | e e | Λa:k. e | e [A]
Anstatt Typoperatoren hinzuzufügen, hätten wir auch Polymorphismus hinzufügen können. Auf der Typebene fügen wir hinzu, ∀a:k. A
was ein polymorpher Typbildner ist, und auf der Begriffsebene fügen wir Abstraktion über Typen Λa:k. e
und Typanwendung hinzu e [A]
.
Dieses System ist viel leistungsfähiger als das STLC - es ist so stark wie Arithmetik zweiter Ordnung.
λω (System F-Omega)
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]
Wenn wir sowohl Typoperatoren als auch Polymorphismus haben, erhalten wir F-Omega. Dieses System ist mehr oder weniger die Kernel-Typ-Theorie der meisten modernen funktionalen Sprachen (wie ML und Haskell). Es ist auch weitaus leistungsfähiger als System F - es entspricht in seiner Stärke einer Arithmetik höherer Ordnung.
λP (LF)
k ::= ∗ | Πx:A. k
A ::= a | p | Πx:A. B | Λx:A.B | A [e]
e ::= x | λx:A.e | e e
Anstelle von Polymorphismus hätten wir uns in Richtung Abhängigkeit von einfach typisierter Lambda-Rechnung bewegen können. Wenn Sie dem Funktionstyp erlaubt haben, sein Argument im Rückgabetyp zu verwenden (dh Πx:A. B(x)
statt zu schreiben A → B
), erhalten Sie λP. Um dies wirklich nützlich zu machen, müssen wir die Menge der Arten mit einer Art von Typoperatoren erweitern, die Terme als Argumente verwenden Πx:A. k
, und daher müssen wir auch auf der Typebene eine entsprechende Abstraktion Λx:A.B
und Anwendung hinzufügen A [e]
.
Dieses System wird manchmal als LF oder Edinburgh Logical Framework bezeichnet.
Es hat die gleiche Rechenstärke wie der einfach typisierte Lambda-Kalkül.
λP2 (kein spezieller Name)
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]
Wir können auch Polymorphismus zu λP hinzufügen, um λP2 zu erhalten. Dieses System wird nicht oft verwendet und hat daher keinen bestimmten Namen. (Das eine Papier, in dem ich gelesen habe, dass es die Induktion von Herman Geuvers ist, lässt sich nicht in der Theorie abhängiger Typen zweiter Ordnung herleiten .)
Dieses System hat die gleiche Stärke wie System F.
λPω_ (kein spezieller Name)
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
Wir könnten auch Typoperatoren zu λP hinzufügen, um λPω_ zu erhalten. Dazu gehört das Hinzufügen einer Art Πa:k. k'
für Typoperatoren sowie die entsprechende Abstraktion Λx:A.B
und Anwendung auf Typebene A [e]
.
Da es im Vergleich zum STLC wieder keinen Sprung in der Rechenleistung gibt, sollte dieses System auch eine gute Basis für ein logisches Framework bilden, aber niemand hat es getan.
λPω (Konstruktionsrechnung)
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]
Schließlich kommen wir zu λPω, der Berechnung von Konstruktionen, indem wir λPω_ nehmen und einen polymorphen Typbildner und eine ∀a:k.A
Abstraktion Λa:k. e
und Anwendung e [A]
auf Termebene hinzufügen .
Die Typen dieses Systems sind viel ausdrucksvoller als bei F-Omega, aber es hat die gleiche Rechenstärke.
soft-question
. Eine aktuelle technische Frage sehe ich hier nicht. Vielleicht können Sie etwas präziser sein, was Sie fragen?