Universelle / existenzielle Quantifizierung?

11

Ich kämpfe darum, den Zweck der universellen und existenziellen Quantifizierung von Typen zu verstehen. Ich spiele damit herum, eine Spielzeugsprache zu schreiben, die auf der Berechnung von Konstruktionen basiert . Ich habe über Morte und Henk gelesen , um ein besseres Verständnis zu erlangen.

Ich verstehe nicht, warum der CoC sowohl Lambda als auch Forall-Abstraktion hat.

( x : A . B )

(λx:A.B)
(x:A.B)

Es scheint mir, dass Lambda für alle in einem System subsumiert, in dem Typen manuell übergeben werden. Mit anderen Worten, dass das Folgende

(x:.λa:x.a)

Könnte durch ersetzt werden

(λx:.λa:x.a)

Wenn es zuerst auf den verwendeten Typ angewendet wurde.

Was vermisse ich? Welche Artikel, Blogs oder Artikel gibt es zu lesen, die mir helfen könnten?

Vielen Dank.

oconnor0
quelle

Antworten:

12

Es ist hilfreich, sich daran zu erinnern, dass (oder wie Sie manchmal sehen) ein Typ ist. Es verallgemeinert . Während es also durchaus Sinn macht, zu sagen, macht es keinen Sinn, zu sagen, weil nur ein Typ ist. Sie würden nicht sagen weil nicht für die Berechnung per se ist, sondern dazu da , Lambda-Begriffe zu klassifizieren, die so angewendet werden können .Π(λx:A.M) N(x:A.M) N...(AB) N

Dies war etwas, das mich ebenfalls auslöste, aber so wird der Kalkül der Konstruktionen (wie auch jedes andere abhängig typisierte System definiert).

Die beiden Programme, die Sie geschrieben haben, haben sehr unterschiedliche Absichten und das erste ist schlecht geschrieben. Es ist nicht sinnvoll, zu sagen, da beide Argumente nach Typen benötigt, was bedeutet, dass wir , wenn gut typisiert werden soll, müssen habe . Allerdings ist kein Typ, es kann immer nur ein Typ der Form zugewiesen werden , niemals . Die zweite dagegen ist fast (ich denke, Sie wollten nicht ) eine Funktion und erhält einen Typ mit zwei s.x:A. λx. xx:A.BB:λx.xx:A.Ba xax

Daniel Gratzer
quelle
Ja, ich wollte . a
oconnor0
@ oconnor0 Macht das Sinn :)
Daniel Gratzer
Nicht genau. Ich bin immer noch ein bisschen verwirrt. Ich muss vielleicht mehr darüber nachdenken. Ich habe beide Beispielprogramme geändert, um anstelle von da ich versucht habe, zu implementieren . :)axid
oconnor0
Ich denke, auf einer bestimmten Ebene wollte ich Begriffe und Typen gleich machen. Zwischen Ihrer Antwort und cs.stackexchange.com/questions/49531/… Ich glaube, ich sehe, wo ich schief gelaufen bin. Ich möchte dies in einem stark normalisierenden System tun.
oconnor0
5

Denken Sie daran, dass existenzielle und universelle Typen sehr unterschiedlich sind. Es ist konstruktive Logik, keine klassische Logik, und in der konstruktiven Logik sind und nicht so verwandt wie in der klassischen Logik.

x:A.B(x) ist der Programmtyp, der ein Objekt vom Typ empfängt und ein Objekt vom Typ . Wichtig dabei ist , dass der Typ hängt auf und ist nicht das gleiche für alle . Es kann variieren, je nachdem, was ist. Für eine Eingabe wir eine Ganzzahl ausgeben. Für einen anderen könnten wir eine reelle Zahl ausgeben. Für eine weitere könnten wir eine Funktion über reelle Zahlen ausgeben. Wenn nicht mit variiert dann können Sie mit anstelle , die die Art von Funktionen aus sind zu .AB(x)B(x) xxxxB(x)xABAB

A B A B A B x : A . B ( x ) B ( x ) x : A B ( x ) x : A B x : A x : A . B B x : A A × B.x:A.B(x) ist die abhängige Version der (konstruktiven) Disjunktion. Sie können sich die konstruktive Disjunktion von zwei Typen und als die disjunkte Vereinigung von und . ist die disjunkte Vereinigung einer Sammlung von Typen die durch indiziert sind . Die Tatsache, dass der Van vom Typ abhängig vom Wert von variiert, macht ihn zu einem abhängigen Typ. Vergleichen Sie mit dem Fall, in dem nicht von abhängt : . Wir nehmen eine Kopie davonABABABx:A.B(x)B(x)x:AB(x)x:ABx:Ax:A.BB für jedes . Dies ist isomorph zu .x:AA×B

Jetzt können Sie sich fragen, warum wir abhängige Produkt- und Summentypen benötigen . Weil sie uns mehr Ausdruckskraft geben. Jetzt können wir die Typen vollständig ignorieren und haben eine untypisierte Typentheorie / funktionale Programmierung. Dies beseitigt jedoch in erster Linie die Vorteile von Typen, z. B. werden Sie nicht wissen, ob alle Programme immer beendet werden (starke Normalisierung). Siehe Lambda-Würfel und abhängiger Typ . Ich denke, ein guter Weg, um abhängige Typen gut zu verstehen, besteht darin, die Regeln für die Einführung und Eliminierung der abhängigen Typen in Martin-Lofs Typentheorie zu betrachten .

Der Hauptpunkt abhängiger Typen ist: Wir möchten aus verschiedenen Gründen (z. B. Vermeidung von Fehlern, automatischer Kündigungsnachweis usw.) in einer gut typisierten Theorie bleiben. Wir wollen nicht zu so etwas wie untypisiertem Lambda-Kalkül gehen, wo wir das Ausdrücken so machen können, wie Sie es angegeben haben, und viel mächtigeres Zeug. Wir können sagen, dass abhängige Typen erfunden wurden, um mehr Dinge auszudrücken und gleichzeitig in einer schönen Typentheorie zu bleiben.

Kaveh
quelle
1
Was bedeutet "∃x: AB (x) ∃x: AB (x) ist die abhängige Version der (konstruktiven) Disjunktion". bedeuten?
oconnor0