Der CoC soll der Höhepunkt aller drei Dimensionen des Lambda-Würfels sein. Das ist mir überhaupt nicht klar. Ich glaube, ich verstehe die einzelnen Dimensionen, und die Kombination von beiden scheint zu einer relativ einfachen Vereinigung zu führen (vielleicht fehlt mir etwas?). Aber wenn ich mir das CoC ansehe, anstatt wie eine Kombination aus allen dreien auszusehen, sieht es ganz anders aus. Aus welcher Dimension stammen Type, Prop und Small / Large-Typen? Wohin sind abhängige Produkte verschwunden? Und warum wird der Fokus auf Aussagen und Beweise anstatt auf Typen und Programme gelegt? Gibt es eine Entsprechung, die sich auf Typen und Programme konzentriert?
Bearbeiten: Falls es nicht klar ist, bitte ich um eine Erklärung, wie der CoC der einfachen Vereinigung der Lambda-Würfel-Dimensionen entspricht. Und gibt es irgendwo, wo ich studieren kann, eine tatsächliche Vereinigung aller drei (dh in Bezug auf Programme und Typen, nicht in Bezug auf Beweise und Sätze)? Dies ist eine Antwort auf Kommentare zu der Frage, nicht auf aktuelle Antworten.
soft-question
. Eine aktuelle technische Frage sehe ich hier nicht. Vielleicht können Sie etwas präziser sein, was Sie fragen?Antworten:
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 werdenA
) und Ausdrücke (die von der Metavariable überlagert werdene
). Dann können alle acht Systeme als Variationen dessen verstanden werden, was auf jeder der drei Ebenen erlaubt ist.λ → (einfach eingegebene Lambda-Rechnung)
Dies ist die grundlegende typisierte Lambda-Rechnung. Es gibt eine einzige Art
∗
, nämlich die Art der Typen. Die Typen selbst sind atomare Typenp
und FunktionstypenA → B
. Begriffe sind Variablen, Abstraktionen oder Anwendungen.λω_ (STLC + Operatoren höherer Art)
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 auchA 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)
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 hinzue [A]
.Dieses System ist viel leistungsfähiger als das STLC - es ist so stark wie Arithmetik zweiter Ordnung.
λω (System F-Omega)
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)
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 schreibenA → 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ügenA [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)
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)
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 TypebeneA [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)
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 Anwendunge [A]
auf Termebene hinzufügen .Die Typen dieses Systems sind viel ausdrucksvoller als bei F-Omega, aber es hat die gleiche Rechenstärke.
quelle
Ich wollte oft versuchen, jede Dimension des Würfels und deren Repräsentation zusammenzufassen, also gebe ich diesem einen Versuch .λ
Aber zuerst sollte man wahrscheinlich versuchen, verschiedene Themen zu entwirren. Der interaktive Theorembeweiser von Coq basiert auf einer zugrunde liegenden Typentheorie, die manchmal liebevoll als Berechnung induktiver Konstruktionen mit Universen bezeichnet wird . Sie werden feststellen, dass dies mehr als nur ein "Calculus of Constructions" ist, und in der Tat gibt es viel mehr Dinge als nur das CoC. Ich bin insbesondere der Meinung, dass Sie sich nicht sicher sind, welche Funktionen in CoC korrekt sind. Insbesondere werden die Unterscheidung von Set / Prop und Universen in CoC nicht angezeigt.
Ich werde hier keinen vollständigen Überblick über Pure Type Systems geben, aber die wichtige Regel (für funktionierende PTS wie das CoC) ist die folgende
Und so haben wir 4 Regeln, die 4 verschiedenen Zwecken entsprechen:
Ich werde jede dieser Details näher erläutern.
Mit diesen zusätzlichen Sortierungen und Regeln erhalten Sie etwas, das kein PTS ist, sondern etwas Nahes. Dies ist (fast) die erweiterte Konstruktionsrechnung , die näher an der Basis von Coq liegt. Das große fehlende Stück hier sind die induktiven Typen, auf die ich hier nicht näher eingehen werde.
Bearbeiten: Es gibt eine nette Referenz, die verschiedene Merkmale von Programmiersprachen im Rahmen von PTS beschreibt, indem sie ein PTS beschreibt, das ein guter Kandidat für eine Zwischendarstellung einer funktionalen Programmiersprache ist:
Henk: Eine typisierte Zwischensprache , SP Jones & E. Meijer.
quelle