Was gewinnen wir, wenn wir „abhängige Typen“ haben?

13

Ich dachte , ich verstand abhängig Typisierung (DT) richtig, aber die Antwort auf diese Frage: /cstheory/30651/why-was-there-a-need-for-martin-l%C3% B6f-to-create-Intuitionistic-Type-Theorie hat mich anders denken lassen.

Nachdem ich mich über DT informiert und versucht habe zu verstehen, was sie sind, frage ich mich, was wir durch diese Vorstellung von DTs gewinnen können. Sie scheinen flexibler und leistungsfähiger zu sein als einfach eingegebene Lambda-Berechnungen (STLC), obwohl ich nicht genau verstehe, wie / warum.

Was können wir mit DTs machen, die mit STLC nicht möglich sind? Scheint, als würde das Hinzufügen von DTs die Theorie komplizierter machen, aber was ist der Vorteil?

Aus der Antwort auf die obige Frage:

Abhängige Typen wurden von de Bruijn und Howard vorgeschlagen, die die Curry-Howard-Korrespondenz von Aussagenlogik zu Logik erster Ordnung erweitern wollten.

Dies scheint auf einer gewissen Ebene sinnvoll zu sein, aber ich kann das Gesamtbild von "wie / warum" immer noch nicht erfassen. Vielleicht könnte ein Beispiel, das diese Erweiterung der CH-Korrespondenz zur FO-Logik explizit zeigt, dazu beitragen, den Punkt zu treffen, an dem es darum geht, zu verstehen, was die große Sache mit DTs ist. Ich bin mir nicht sicher, ob ich das auch verstehe.

PhD
quelle
1
Hast du sie gegoogelt? Haben Sie von Coq gehört, einem Theorembeweiser, der auf abhängigen Typen basiert? Wussten Sie, dass sich das 4-Farben-Theorem mit Coq bewährt hat?
Dave Clarke
2
Ich habe es tatsächlich getan. Was Google schwer fällt, ist die zusätzliche "Kraft" (mangels eines besseren Wortes), die DTs intuitiv zur Typentheorie verleihen?
PhD
1
Warum? Mit abhängigen Typen können Sie mehr Programme eingeben, während Sie noch typsicher sind. Wie? Durch Parametrisierung von Typen mit Programmen.
Martin Berger
@MartinBerger - Können Sie bitte "mehr Programme" näher erläutern? Was "mehr" kann oder muss ich aus theoretischer Sicht tun?
PhD
2
@ DaveClarke Dass Coq mit seinen ausgefallenen Typen verwendet wurde, um ausgefallene Dinge zu tun, bedeutet nicht, dass diese ausgefallenen Dinge diese ausgefallenen Typen erfordern. Zum Beispiel hatte Twelf große Erfolge (wie zum Beispiel einen Beweis für die Richtigkeit von SML) und es ist nur zweiter Ordnung, nicht höherer Ordnung. Ich habe einige ziemlich große Systeme gesehen, die nur mit Logik erster Ordnung bewiesen wurden.
Gilles 'SO- hör auf böse zu sein'

Antworten:

22

Erweitern meines Kommentars: Abhängige Typen können mehr Programme eingeben. "Mehr" bedeutet einfach, dass die Menge der mit abhängigen Typen typisierbaren Programme eine angemessene Obermenge der Programme ist, die im einfach typisierten Kalkül (STLC) typisierbar sind . Ein Beispiel wäre, L i s t 2 * 3 + 4 ( α ) , die Listen der Länge 10 , Tragelemente des Typs α . Der Ausdruck 2 3 + 4 ist gleichzeitig Programm und Teil eines Typs. Dies ist in der STLC nicht möglich.λList23+4(α)10α23+4

Die Schlüsselregel, die abhängige von nicht abhängigen Typen unterscheidet, lautet application:

ΓM:ABΓN:AΓMN:BΓM:ΠxA.BΓN:AΓMN:B{N/x}

Auf der linken Seite haben Sie die STLC, wo Programme in den Räumlichkeiten nur in das Programm des Abschlusses "fließen". Im Gegensatz dazu fließt in der abhängigen Anwendungsregel auf der rechten Seite das Programm von der rechten Prämisse in den Typ in der Schlussfolgerung 1 .N1

Um Typen durch Programme parametrisieren zu können, muss die Syntax der abhängigen Typen erweitert werden. Um sicherzustellen, dass die Typen wohlgeformt sind, verwenden wir ein zweites „Typensystem“, das Arten genannt wird, die die Typen einschränken. Dieses Sortiersystem ist im Wesentlichen das STLC, aber "eine Ebene höher".

Es gibt viele Erklärungen für abhängige Typen. Einige Beispiele.


1

Martin Berger
quelle
Nun, das macht sehr viel Sinn. Es mag offensichtlich gewesen sein, aber aus irgendeinem Grund konnte ich keinen Finger darauf legen. Schätzen Sie den Übergang von Kommentar zu Antwort. Leider wurde die Frage zum Schließen gewählt, aber ich freue mich über die Antwort :)
PhD
1
Arr nArr 0=natArr (n+1)=natArr n
PVerase(P)erase(V)
FωCoC
@cody Ich denke, es ist ungewöhnlich, diese Art von Löschung zu nennen. Was ist ein besserer Name? Vielleicht Typvereinfachung?
Martin Berger
2

Stellen Sie sich Typdeklarationen nur als Behauptungen vor. Derzeit können Sie nur Dinge wie isInt32 (), isCharPtr () usw. sagen. Diese verschiedenen Zusicherungen sind so ausgewählt, dass sie beim Kompilieren überprüfbar sind. Dieses Konzept kann jedoch auf folgende Dinge erweitert werden: isCharPtr () && isNotNull (). Nullable Pointer sind ein großes Problem. Zeiger sollten als Standardeinstellung nicht nullfähig sein, wobei nullfähige Zeiger ein Typ sind, der nicht dereferenzierbar ist, ohne zu wissen, ob er null ist oder nicht. Ähnliche Probleme sind Dinge wie: isPositiveInteger () oder isEvenNaturalNumber ().

rauben
quelle