Abhängiger Typ



Alles Wissen, das die Menschen im Laufe der Jahrhunderte über Abhängiger Typ angesammelt haben, ist jetzt im Internet verfügbar, und wir haben es für Sie auf möglichst zugängliche Weise zusammengestellt und geordnet. Wir möchten, dass Sie schnell und effizient auf alles zugreifen können, was Sie über Abhängiger Typ wissen möchten, dass Ihre Erfahrung angenehm ist und dass Sie das Gefühl haben, wirklich die Informationen über Abhängiger Typ gefunden zu haben, nach denen Sie gesucht haben.

Um unsere Ziele zu erreichen, haben wir uns nicht nur bemüht, die aktuellsten, verständlichsten und wahrheitsgetreuesten Informationen über Abhängiger Typ zu erhalten, sondern wir haben auch dafür gesorgt, dass das Design, die Lesbarkeit, die Ladegeschwindigkeit und die Benutzerfreundlichkeit der Seite so angenehm wie möglich sind, damit Sie sich auf das Wesentliche konzentrieren können, nämlich alle verfügbaren Daten und Informationen über Abhängiger Typ zu kennen, ohne sich um irgendetwas anderes kümmern zu müssen, das haben wir bereits für Sie erledigt. Wir hoffen, dass wir unser Ziel erreicht haben und dass Sie die gewünschten Informationen über Abhängiger Typ gefunden haben. Wir heißen Sie also willkommen und ermutigen Sie, die Erfahrung der Nutzung von scientiade.com weiterhin zu genießen.

In der Informatik und Logik ist ein abhängiger Typ ein Typ, dessen Definition von einem Wert abhängt. Es ist ein überlappendes Merkmal von Typtheorie und Typsystemen . In der intuitionistischen Typentheorie werden abhängige Typen verwendet, um die Quantoren der Logik wie "für alle" und "es existiert" zu codieren . In funktionalen Programmiersprachen wie Agda , ATS , Clojure , Coq , F* , Epigram und Idris helfen abhängige Typen, Fehler zu reduzieren, indem sie dem Programmierer ermöglichen, Typen zuzuweisen, die die Menge möglicher Implementierungen weiter einschränken.

Zwei gängige Beispiele für abhängige Typen sind abhängige Funktionen und abhängige Paare. Der Rückgabetyp einer abhängigen Funktion kann vom Wert (nicht nur vom Typ) eines ihrer Argumente abhängen . Zum Beispiel kann eine Funktion, die eine positive ganze Zahl akzeptiert, ein Array der Länge zurückgeben , wobei die Arraylänge Teil des Typs des Arrays ist. (Beachten Sie, dass sich dies von Polymorphismus und generischem Programmieren unterscheidet , die beide den Typ als Argument enthalten.) Ein abhängiges Paar kann einen zweiten Wert haben, dessen Typ vom ersten Wert abhängt. Um beim Array-Beispiel zu bleiben, kann ein abhängiges Paar verwendet werden, um ein Array typsicher mit seiner Länge zu paaren.

Abhängige Typen erhöhen die Komplexität eines Typsystems. Die Entscheidung über die Gleichheit abhängiger Typen in einem Programm kann Berechnungen erfordern. Wenn in abhängigen Typen beliebige Werte zulässig sind, kann die Entscheidung über die Typgleichheit die Entscheidung beinhalten, ob zwei beliebige Programme das gleiche Ergebnis erzeugen; daher kann die Typprüfung unentscheidbar werden .

Geschichte

Im Jahr 1934 bemerkte Haskell Curry, dass die Typen, die im typisierten Lambda-Kalkül und in seinem Gegenstück zur kombinatorischen Logik verwendet werden , dem gleichen Muster folgten wie Axiome in der Aussagenlogik . Weitergehend gab es für jeden Beweis in der Logik eine passende Funktion (Begriff) in der Programmiersprache. Eines von Currys Beispielen war die Entsprechung zwischen einfach typisiertem Lambda-Kalkül und intuitionistischer Logik .

Die Prädikatenlogik ist eine Erweiterung der Aussagenlogik, die Quantoren hinzufügt. Howard und de Bruijn erweiterten den Lambda-Kalkül, um dieser leistungsfähigeren Logik zu entsprechen, indem sie Typen für abhängige Funktionen erstellten, die "für alle" entsprechen, und abhängige Paare, die "da existiert" entsprechen.

(Aufgrund dieser und anderer Arbeiten von Howard ist Proposition-as-Types als Curry-Howard-Korrespondenz bekannt .)

Formale Definition

Typ

Grob gesagt ähneln abhängige Typen dem Typ einer indizierten Familie von Mengen. Formaler kann man, wenn ein Typ in einem Universum von Typen gegeben ist , eine Familie von Typen haben , die jedem Begriff einen Typ zuordnet . Wir sagen, dass der Typ B(a) mit a variiert .

Eine Funktion, deren Rückgabewert mit ihrem Argument variiert (dh es gibt keinen festen Kobereich ), ist eine abhängige Funktion und der Typ dieser Funktion wird abhängiger Produkttyp , pi-Typ oder abhängiger Funktionstyp genannt . Aus einer Familie von Typen können wir den Typ abhängiger Funktionen konstruieren , deren Terme Funktionen sind, die einen Term annehmen und einen Term in zurückgeben . In diesem Beispiel wird der abhängige Funktionstyp normalerweise als or . geschrieben

Wenn es sich um eine konstante Funktion handelt, entspricht der entsprechende abhängige Produkttyp einem gewöhnlichen Funktionstyp . Das heißt, ist urteilsmäßig gleich, wenn B nicht von x abhängt .

Der Name pi-type kommt von der Idee, dass diese als kartesisches Produkt von Typen angesehen werden können. Pi-Typen können auch verstanden werden als Modelle von Allzeichen .

Wenn wir zum Beispiel für n- Tupel reeller Zahlen schreiben , dann wäre das der Typ einer Funktion, die bei einer gegebenen natürlichen Zahl n ein Tupel reeller Zahlen der Größe n zurückgibt . Der übliche Funktionsraum entsteht als Sonderfall, wenn der Bereichstyp nicht wirklich von der Eingabe abhängt. ZB ist die Art der Funktionen von natürlichen Zahlen zu den reellen Zahlen, die wie im typisierten Lambda-Kalkül geschrieben werden.

Für ein konkreteres Beispiel, nehmen wir an, dass A gleich der Familie der vorzeichenlosen ganzen Zahlen von 0 bis 255 ist (die man in 8 Bits oder 1 Byte einpassen kann) und B(a) = X a für 256 beliebige X a 's , zerfällt dann in das Produkt von X 0 × X 1 × X 2 × ... × X 253 × X 254 × X 255, gerade weil die endliche Menge der ganzen Zahlen von 0 bis 255 letztendlich an den eben erwähnten Grenzen enden würde, was zu eine endliche Kodomäne der abhängigen Funktion.

Typ

Das Dual des abhängigen Produkttyps ist der abhängige Paartyp , der abhängige Summentyp , der Sigma-Typ oder (verwirrenderweise) der abhängige Produkttyp . Sigma-Typen können auch als existenzielle Quantoren verstanden werden . Um das obige Beispiel fortzusetzen : Wenn es im Universum der Typen einen Typ und eine Typenfamilie gibt , dann gibt es einen abhängigen Paartyp . (Die alternativen Notationen ähneln denen von -Typen.)

Der abhängige Paartyp fängt die Idee eines geordneten Paares ein, bei dem der Typ des zweiten Termes vom Wert des ersten abhängt. Wenn dann und . Wenn B eine konstante Funktion ist, dann wird der abhängige Paartyp (ist urteilsgleich mit) der Produkttyp , dh ein gewöhnliches kartesisches Produkt .

Für ein konkreteres Beispiel, wenn man A wieder gleich der Familie der vorzeichenlosen ganzen Zahlen von 0 bis 255 und B(a) wieder gleich X a für 256 willkürlichere X a nimmt , dann zerfällt in die Summe X 0 + X 1 + X 2 + ... + X 253 + X 254 + X 255 aus den gleichen Gründen wie bei dem, was mit der Kodomäne der abhängigen Funktion passiert ist.

Beispiel als existenzielle Quantifizierung

Sei ein Typ und lass . Durch die Curry-Howard-Korrespondenz kann B als logisches Prädikat auf Termen von A interpretiert werden . Ob der Typ B(a) bewohnt ist, zeigt für ein gegebenes an , ob a dieses Prädikat erfüllt. Die Entsprechung kann auf existentielle Quantifizierung und abhängige Paare ausgedehnt werden: Der Satz ist genau dann wahr, wenn der Typus bewohnt ist.

Zum Beispiel ist weniger als oder gleich , wenn und nur wenn es eine andere natürliche Zahl vorhanden ist, so dass m + k = n . In der Logik wird diese Aussage durch die existenzielle Quantifizierung kodifiziert:

Dieser Satz entspricht dem abhängigen Paartyp:
Das heißt, ein Beweis für die Aussage, dass m kleiner oder gleich n ist, ist ein Paar, das sowohl eine nicht negative Zahl k , die die Differenz zwischen m und n ist , als auch einen Beweis für die Gleichheit m + k = n . enthält .

Systeme des Lambda-Würfels

Henk Barendregt hat den Lambda-Würfel entwickelt, um Typensysteme entlang dreier Achsen zu klassifizieren. Die acht Ecken des resultierenden würfelförmigen Diagramms entsprechen jeweils einem Typsystem mit einfach typisiertem Lambda-Kalkül in der am wenigsten ausdrucksstarken Ecke und Konstruktionsrechnung in der ausdrucksstärksten. Die drei Achsen des Würfels entsprechen drei verschiedenen Erweiterungen des einfach typisierten Lambda-Kalküls: dem Hinzufügen abhängiger Typen, dem Hinzufügen von Polymorphismus und dem Hinzufügen von höherwertigen Typkonstruktoren (zum Beispiel Funktionen von Typen zu Typen). Der Lambda-Würfel wird durch reine Typsysteme weiter verallgemeinert .

Theorie des abhängigen Typs erster Ordnung

Das System reiner abhängiger Typen erster Ordnung, das dem logischen Framework LF entspricht , erhält man durch Verallgemeinerung des Funktionsraumtyps des einfach typisierten Lambda-Kalküls auf den abhängigen Produkttyp.

Theorie des abhängigen Typs zweiter Ordnung

Das System der abhängigen Typen zweiter Ordnung wird erhalten, indem die Quantifizierung über Typkonstruktoren ermöglicht wird. In dieser Theorie subsumiert der Operator des abhängigen Produkts sowohl den Operator des einfach typisierten Lambda-Kalküls als auch den Binder von System F .

Abhängig typisierter polymorpher Lambda-Kalkül höherer Ordnung

Das System höherer Ordnung erstreckt sich auf alle vier Abstraktionsformen des Lambda-Würfels : Funktionen von Begriffen zu Begriffen, Typen zu Typen, Begriffe zu Typen und Typen zu Begriffen. Das System entspricht der Konstruktionsrechnung, deren Ableitung, die induktive Konstruktionsrechnung, das zugrundeliegende System des Coq-Beweisassistenten ist .

Simultane Programmiersprache und Logik

Die Curry-Howard-Korrespondenz impliziert, dass Typen konstruiert werden können, die beliebig komplexe mathematische Eigenschaften ausdrücken. Wenn der Benutzer einen konstruktiven Beweis dafür liefern kann , dass ein Typ bewohnt ist (dh dass ein Wert dieses Typs existiert), kann ein Compiler den Beweis überprüfen und ihn in ausführbaren Computercode umwandeln, der den Wert durch Ausführen der Konstruktion berechnet. Die Korrekturprüfungsfunktion macht abhängig typisierte Sprachen eng mit Korrekturassistenten verwandt . Der Aspekt der Codegenerierung bietet einen leistungsfähigen Ansatz für die formale Programmverifikation und den beweistragenden Code , da der Code direkt aus einem mechanisch verifizierten mathematischen Beweis abgeleitet wird.

Vergleich von Sprachen mit abhängigen Typen

Sprache Aktiv entwickelt Paradigma Taktik Nachweisbedingungen Kündigungsprüfung Typen können davon abhängen Universen Nachweis der Irrelevanz Programmextraktion Extraktion löscht irrelevante Begriffe
Ada 2012 Jawohl Imperativ Jawohl Ja (optional) Beliebiger Begriff Ada
Agda Jawohl Rein funktional Wenig/begrenzt Jawohl Ja (optional) Beliebiger Begriff Ja (optional) Beweis-irrelevante Argumente Beweis-irrelevante Aussagen Haskell , JavaScript Jawohl
ATS Jawohl Funktional / zwingend Nein Jawohl Jawohl Statische Begriffe Jawohl Jawohl Jawohl
Cayenne Nein Rein funktional Nein Jawohl Nein Beliebiger Begriff Nein Nein
Gallina
( Coq )
Jawohl Rein funktional Jawohl Jawohl Jawohl Beliebiger Begriff Jawohl Nein Haskell , Schema und OCaml Jawohl
Abhängige ML Nein Jawohl Natürliche Zahlen
F* Jawohl Funktional und zwingend Jawohl Jawohl Ja (optional) Jeder reine Begriff Jawohl Jawohl OCaml , F# und C Jawohl
Guru Nein Rein funktional hypjoin Jawohl Jawohl Beliebiger Begriff Nein Jawohl Kümmel Jawohl
Idris Jawohl Rein funktional Jawohl Jawohl Ja (optional) Beliebiger Begriff Jawohl Nein Jawohl Ja, aggressiv
Mager Jawohl Rein funktional Jawohl Jawohl Jawohl Beliebiger Begriff Jawohl Jawohl Jawohl Jawohl
Matita Jawohl Rein funktional Jawohl Jawohl Jawohl Beliebiger Begriff Jawohl Jawohl OCaml Jawohl
NuPRL Jawohl Rein funktional Jawohl Jawohl Jawohl Beliebiger Begriff Jawohl Jawohl
PVS Jawohl Jawohl
Weise Nein Rein funktional Nein Nein Nein Nein
Zwölf Jawohl Logikprogrammierung Jawohl Ja (optional) Beliebiger (LF) Begriff Nein Nein

Siehe auch

Fußnoten

  1. ^ Dies bezieht sich auf die Kernsprache , nicht auf irgendeine Taktik ( Prozedur zum Beweis des Theorems) oder eine Untersprache zur Codegenerierung.
  2. ^ Unterliegt semantischen Beschränkungen, wie z. B. Universumsbeschränkungen
  3. ^ Static_Predicate für eingeschränkte Begriffe, Dynamic_Predicate für die Assert-ähnliche Prüfung eines beliebigen Begriffs in Typumwandlung
  4. ^ Ringlöser
  5. ^ Optionale Universen, optionaler Universumspolymorphismus und optionale explizit angegebene Universen
  6. ^ Universen, automatisch abgeleitete Universumsbeschränkungen (nicht dasselbe wie der Universumspolymorphismus von Agda) und optionales explizites Drucken von Universumsbeschränkungen
  7. ^ Wurde durch ATS ersetzt
  8. ^ Das letzte Sage-Papier und der letzte Code-Schnappschuss stammen beide aus dem Jahr 2006

Verweise

Weiterlesen

Externe Links

Opiniones de nuestros usuarios

Christiane Marx

Toller Artikel

Dietmar Baumann

In diesem Beitrag über Abhängiger Typ habe ich Dinge gelernt, die ich nicht wusste, und jetzt kann ich ins Bett gehen

Luise Hofmann

Richtig. Sie liefert die notwendigen Informationen über Abhängiger Typ., Richtig