Universelle und existenzielle Typen

9

Ich versuche, mich mit den Konzepten universeller und existenzieller Typen zu beschäftigen, aber überall, wo ich hinschaue, sehe ich entweder logische oder operative Intuitionen (oder Implementierungen) (z. B. TAPL-Buch von B. Pierce), was gut ist , aber ich würde gerne die Definitionen sehen (wo wir sie als Mengen betrachten) - und daraus Ableitungen einiger Gesetze sowie Rechtfertigungen für unsere Intuitionen.

Da ich diese Definitionen nicht finden kann, habe ich mich dazu entschlossen, dies selbst zu tun, und ich denke, dass dies vernünftig sein kann:

x.T:=defStypeT[x:=S]
x.T:=defStypeT[x:=S]

Aber in dem oben erwähnten TAPL-Buch erhalten wir diese Definition (obwohl ich es eine Identität nennen würde)

x.T:=defy.(x.Ty)y()

Ich habe zwei Probleme damit:

  1. Auf der LHS von würde ich erwarten, dass die einzige freie Variable von (denn wie kann man einen Typ "noch nicht erstellt" mit einigen darin baumelnden freien Variablen anzeigen?), Aber auf der RHS scheint es so kann einen Einfluss auf , daher ist es besser, eine freie Variable in . Daher kann LHS nicht gleich RHS sein, da sich die Mengen der freien Variablen von auf beiden Seiten unterscheiden, oder?x T y T T T.()xTyTTT
  2. Selbst wenn ich die Bedenken an Punkt 1 außer Acht lasse. - Ich habe versucht, RHS mithilfe meiner Definitionen neu zu schreiben und zu prüfen, ob ich meine Definition des existenziellen Typs erhalten kann, aber ich bin festgefahren:
    RHS=S(x.Ty)[y:=S]S=S(RT[x:=R,y:=S]S)S

Es ähnelt nicht einmal im entferntesten meiner Definition. Ist es möglich, die Formel, zu der ich gekommen bin, zu vereinfachen? Intuitiv, weil es Funktionstypen gibt, wird es wahrscheinlich nie meiner Definition entsprechen. Aber wenn sie nicht gleich sind - sind sie zumindest in gewissem Sinne "isomorph"? Wenn nicht - was ist "schief gelaufen"?

umständlich
quelle
1
Ihre Gleichung (*) enthält einen Tippfehler: Sie sollte und nicht . yYy
Cody
1
Auch in Ihrer letzten Gleichung: erscheint möglicherweise nicht in ! T.yT
Cody

Antworten:

9

Die Mengenlehre schadet Ihnen hier und je früher Sie sich davon befreien, desto besser wird es für Ihr Verständnis der Informatik.

Vergessen Sie die Kreuzungen und Gewerkschaften. Die Leute kommen auf die Idee, dass und wie und , was die polnische Schule vor langer Zeit mit Booleschen Algebren gemacht hat, aber es ist wirklich nicht der richtige Weg (definitiv nicht im Computer) Wissenschaft).

Sie möchten diese als Sets betrachten. Ok, aber dann müssen wir Größenprobleme ignorieren und so tun, als gäbe es eine Menge aller Mengen. (Es ist möglich, die Größenprobleme zu beheben, indem Sie an eine andere Kategorie übergeben.) Der Typ ist wirklich wie das kartesische Produkt Das heißt, ein Element von ist eine Funktion von Mengen zu Mengen: Für jede Menge gibt es ein Element vom Typ . Zum Beispiel ist ein Element von eine Funktion die eine Menge annimmtX . T : = S : S e t T [ X S ] . X . T f S f ( S ) T [ x S ] X . ( X X ) ( X X ) f S ( S S ) x.T

X.T:=S:SetT[XS].
X.T fSf(S)T[xS]X.(XX)(XX)fSund gibt eine Funktion vom Typ . Hier sind einige solcher Funktionen: Wir erhalten also eine für jede natürliche Zahl, und es ist schwierig, sich andere Beispiele vorzustellen . (Übung: Google "Kirchencodierung natürlicher Zahlen".)f 0 ( S ) ( g ) ( x ) : = x f 1 ( S ) ( g ) ( x ) : = g ( x ) f 2 ( S ) ( g ) ( x ) : = g ( g ( x ) ) f 3 ( S )(SS)(SS)
f0(S)(g)(x):=xf1(S)(g)(x):=g(x)f2(S)(g)(x):=g(g(x))f3(S)(g)(x):=g(g(g(x)))

Als nächstes betrachten wir die existenziellen Typen. Zunächst wird die richtige Codierung hinsichtlich ist wobei die Variable nicht in erscheint ! (Dies sollte in Pierces TAPL erwähnt werden.) Bevor wir uns diese Codierung ansehen, lassen Sie uns tun direkt in Mengen. Diesmal ist es ein Nebenprodukt: Ein Element von ist ein Paar wobei eine Menge und ein Element von ist

X.T:=Y.(X.(TY))Y
YTX.T
X.T:=S:SetT[XS].
X.T (S,a)SaT[XS] . Ein Beispiel wäre der Typ , deren Elemente Paare wobei eine Menge ist und eine binäre Operation ist. Dies ist auch als Magma bekannt . Wenn Sie etwas schicker werden, können Sie bekannte Strukturen wie Gruppen und Ringe ausdrücken (Sie müssen zuerst die Identitätstypen erfinden ).X.(X×XX)(S,m)Sm:S×SS

Lassen Sie uns sehen, wie die Codierung von in Bezug auf funktioniert. Es ist falsch zu erwarten, dass wir eine Gleichheit zwischen und (NB: ist frisch) - nur die Mengenlehre würde den Menschen solche Erwartungen geben. Wir sollten erwarten, dass die beiden isomorph sind . Die Aufgabe besteht also darin, eine Bijektion zwischen und Dies ist eine Übung inX.TY.(X.(TY))YY

A:=S:SetT[XS]
B:=R:Set(S:Set(T[XS]R))R.
λ-Infinitesimalrechnung. In einer Richtung haben wir die Karte definiert als und in der anderen eine Karte definiert durch (Die Notation bedeutet die Funktion .) Nun können wir prüfen, ob und invers zueinander sind. Eine Richtung ist einfach: Die andere Richtung sieht folgendermaßen aus: f:AB
f(S,a)(R)(h):=h(S)(a)
g:BA
g(ϕ):=ϕ(A)(λS.λa.(S,a)).
λS.λa.(S,a)Sa(S,a)fg
g(f(S,a))=f(S,a)(A)(λS.λa.(S,a))=(λS.λa.(S,a)(S)(a)=(S,a).
f(g(ϕ))(R)(h)=h(π1(g(ϕ))(π2(g(ϕ))).
Wir könnten noch ein bisschen weiter machen, indem wir in umschreiben , aber dann würden wir stecken bleiben!g(ϕ)ϕ(A)(λS.λa.(S,a))

Es stellt sich heraus , dass in der Mengenlehre die Codierung in Bezug auf funktioniert nicht. Es funktioniert jedoch auch in anderen Setups, in denen Typen keine Sets sind. Sie können sich beispielsweise davon überzeugen, dass in der Logik die Anweisungen entspricht wobei über alle Sätze (Wahrheitswerte, logische Aussagen) reicht. Auch hier sollte die Variable in nicht vorkommen .x . ϕ ( x ) P : P r o p . ( x . ( Φ ( x ) P ) ) P , P.

x.ϕ(x)
P:Prop.(x.(ϕ(x)P))P,
PPϕ
Andrej Bauer
quelle
1
Andrej, du bist blitzschnell!
Cody
Das ist aufschlussreich, danke! Aber ich habe immer noch Fragen :) 1) Verstehe ich richtig, dass das von Ihnen vorgestellte Setup immer noch satztheoretisch ist (aber nicht so naiv wie meins) und deshalb nicht gilt und wir keine Hoffnung haben, es angemessen zu finden und ? 2) Ich verstehe, dass diese Aussagen in der Logik äquivalent sind, aber es scheint mir, dass sie ein bisschen von der Typentheorie abweichen (na ja, denn wo sind die Typen? :)). Was wäre also die Einstellung des Typsystems, in dem gilt? 3) Wenn ich eine Sprache implementiere, die auf Lambda-Kalkül basiert - sollte ich vorsichtig sein, wenn ich ? ()fg()()
umständlich
3
Richtig: Das satztheoretische "Modell" (es ist kein Modell, weil wir so tun, als könnten wir kartesische Produkte herstellen, die von allen Mengen indiziert werden ) verletzt die Kodierung von in Bezug auf . Die Typentheorie validiert ebenfalls nicht die Codierung. Stattdessen erhalten Sie einen Rückzug (verwenden Sie einfach das gleiche und oben für die Typentheorie), aber keinen Isomorphismus. Um einen Isomorphismus zu erhalten, benötigen Sie etwas Besonderes. Beispielsweise stellt die Parametrizität sicher, dass sich alle Elemente des kartesischen Produkts gut verhalten, und stellt den Isomorphismus wieder her. fg
Andrej Bauer
@AndrejBauer ist das zugrunde liegende System nicht aussagekräftig? Und im Falle einer positiven Antwort gilt der Isomorphismus für prädikative Systeme?
Giorgio Mossa
@GiorgioMossa: Welches System? Fragen Sie sich, ob man Unbestimmtheit braucht, um die Gültigkeit der Kodierung von exist in Bezug auf festzustellen ? Nein, Parametrizität ist ausreichend, obwohl manchmal Impredikativität hilft (zum Beispiel, wenn wir mit ni a topos ausdrücken ).
Andrej Bauer
3

Zu Frage 1): Die Variable darf nicht in erscheinen , sondern muss nicht eingeschränkt werden. Wenn Sie hoffen möchten, dass die lhs gleich den rhs sind, sollten Sie auf jeder Seite die gleiche Anzahl freier Variablen haben, was unmöglich ist, wenn in erfasst wird . Die Intuition ist, dass gleich der unendlichen Konjunktion sein sollte für jeden möglichen Typ . In der Tat ist es nicht schwer, für einen bestimmten Typ zu zeigen, dassY YYTT

((x.TU0)U0)((x.TU1)U1)
UiU
x.T((x.TU)U)

In Worten:

Der Beweis, dass, wenn es ein (beliebiges) so dass gilt, gilt, ist dasselbe wie der Beweis, dass für jedes , wenn gilt, .xT(x)U xT(x)U

Beachten Sie, dass selbst nicht von abhängen darf .Ux

Die Intuition hinter der Gleichheit ist, dass diese Tatsache für jedes möglicheU ausreicht, um den existenziellen Quantifizierer zu charakterisieren.

Für 2) ist die satztheoretische Intuition hier leider etwas schwierig. Es ist nicht naiv möglich, Typen als Mengen von Elementen und Pfeilen als satztheoretische Funktionen zwischen ihnen zu betrachten. Wenn jedoch eine Kreuzung nicht leer ist, sollte intuitiv nicht leer sein. In Ihrem Fall ergibt dies SA(S)A()

(R(T[x:=R]))

(Beachten Sie die Klammern), die nicht leer sein dürfen. Der einzige Weg dafür ist, dass es ein so dass leer ist, was bedeutet, dass nicht leer sein muss.RT[x:=R]T[x:=R]

Cody
quelle
1
Nein! Keine unendliche Konjunktion. Es ist ein unendliches Produkt . Die Konjunktion vergisst, was bei jedem Typ und das ist böse. (Lassen Sie uns nicht jemand sagen , dass in den Realisierbarkeit Modelle von System F die Allquantor ist Kreuzung.)Ui
Andrej Bauer
@AndrejBauer: Das ist fair, obwohl es manchmal nützlich ist, Informationen zu vergessen ... meine Intuition basiert teilweise auf der Eliminierungsregel von .
Cody
Sie können Informationen nur unter geeigneten Umständen vergessen, die garantieren, dass Sie trotzdem damit durchkommen. Zum Beispiel können wir in den Realisierbarkeitsmodellen, in denen tatsächlich ist, Informationen aufgrund der erstaunlichen Einheitlichkeit der Realisierer vergessen. Wenn Sie Informationen vergessen, wenn Sie dies nicht tun sollten, machen Sie die Gesetze einfach ungültig.
Andrej Bauer
1

Ich schlage vor, die operative Intuition nicht aufzugeben. Operativ ist primär, alle Semantiken werden abgeleitet und sind nur Beweisverfahren für die operative Semantik. Die Schlüsselideen sind wie folgt.

Ein Programm verwendet eine Variable universell-polymorph , vorausgesetzt, macht nichts mit , was Kenntnisse über den Typ von erfordert . Zum Beispiel könnten im Kalkül die folgenden Operationen polymorph sein (ob sie sind oder nicht, hängt von der genauen Sprachsemantik ab).Px Pxxλ

  • Weiterleitung, zB ,λx.x.
  • Neuordnung, zB .λ(x,y,z).(z,x,y)
  • Duplizieren, zB .λx.(x,x)
  • fallen lassen, zB .λx.7

Der existenzielle Polymophismus ist nun das exakte Dual des universellen Polymorphismus: Ein Programm verwendet eine Variable existenziell-polymophial , wenn nur für Kontexte bereitstellt , die keine Kenntnis des Typs von erfordern . Mit anderen Worten, liefert nur für Kontexte, die universell-polymorph verwenden.x P x x P x xPx PxxPxx

Meiner Meinung nach wird diese schöne Symmetrie verdeckt, wenn man über universellen / existenziellen Polymorphismus im Kalkül nachdenkt. Der Grund ist die starke Abhängigkeit vom Funktionsraumoperator, der leider kein Dualisierungsoperator ist, sondern etwas Komplizierteres (Kovariante in einem Argument, Kontravariante im anderen).λ

Martin Berger
quelle
Eine interessante Sichtweise (obwohl ich es nicht ganz verstehe :)). Die Idee ist dann zu prüfen, ob Gesetze, die in einer solchen allgemeinen Ansicht abgeleitet wurden, in konkreten Einstellungen von Typsystemen gelten. Und wo finde ich einen Einführungstext dazu?
umständlich
@socumbersome Die meisten vorhandenen Implementierungen des Polymorphismus verstehen das nicht ganz richtig. In der Tat wird die existenzielle Quantifizierung selten direkt implementiert. Ich fürchte, es gibt keinen Einführungstext, der die Dualität beschreibt. Wir haben es hier erklärt, aber es ist für ein spezialisiertes Publikum geschrieben.
Martin Berger