Welchen Teil von Hindley-Milner verstehen Sie nicht?


851

Ich schwöre, es gab früher ein T-Shirt zum Verkauf mit den unsterblichen Worten:


Welchen Teil von

Hindley-Milner

verstehst du nicht


In meinem Fall wäre die Antwort ... alles!

Insbesondere sehe ich in Haskell-Zeitungen oft eine solche Notation, aber ich habe keine Ahnung, was dies bedeutet. Ich habe keine Ahnung, welcher Zweig der Mathematik es sein soll.

Ich erkenne natürlich die Buchstaben des griechischen Alphabets und Symbole wie "∉" (was normalerweise bedeutet, dass etwas kein Element einer Menge ist).

Andererseits habe ich noch nie "⊢" gesehen ( Wikipedia behauptet, es könnte "Partition" bedeuten ). Ich bin auch mit der Verwendung des Vinculums hier nicht vertraut. ( In der Regel bezeichnet er einen Bruchteil, aber das bedeutet nicht erscheinen hier der Fall zu sein.)

Wenn mir zumindest jemand sagen könnte, wo ich anfangen soll, um zu verstehen, was dieses Meer von Symbolen bedeutet, wäre das hilfreich.


8
Wenn Sie sich für eine gute Erklärung des Algorithmus suchen, das Beste , was ich bisher gefunden habe , ist in Kapitel 30 von Shriram Krishnamurthi der Programmiersprachen: Anwendung und Interpretation (! CC - Lizenz).
Laslowh

2
@laslowh Danke! Ich lese es. Neuere Version: cs.brown.edu/courses/cs173/2012/book/book.pdf
SnowOnion

Antworten:


652
  • Der horizontale Balken bedeutet "[oben] impliziert [unten]".
  • Wenn es mehrere Ausdrücke in [oben], dann betrachten sie anded zusammen; Alle [oben] müssen wahr sein, um das [unten] zu garantieren.
  • :Mittel hat Typ
  • Mittel ist in . (Bedeutet ebenfalls "ist nicht in".)
  • Γwird normalerweise verwendet, um sich auf eine Umgebung oder einen Kontext zu beziehen ; In diesem Fall kann es sich um eine Reihe von Typanmerkungen handeln, bei denen ein Bezeichner mit seinem Typ gepaart wird. Daher x : σ ∈ Γbedeutet, dass die Umgebung Γdie Tatsache enthält, dass xTyp hat σ.
  • kann gelesen werden als beweist oder bestimmt. Γ ⊢ x : σMittel , dass die Umgebung Γbestimmt , dass xTyp hat σ.
  • ,ist eine Möglichkeit , mit bestimmten zusätzlichen Voraussetzungen in eine Umgebung Γ.
    Daher Γ, x : τ ⊢ e : τ'bedeutet die Umwelt Γ, mit dem zusätzlichen, zwingende Voraussetzung , daß xTyp hatτ , zeigt , dass eTyp hat τ'.

Wie gewünscht: Operatorrang, vom höchsten zum niedrigsten:

  • Sprachspezifische Infix und mixfix Operatoren wie λ x . e, ∀ α . σund τ → τ', let x = e0 in e1und Leerzeichen für Funktionsanwendung.
  • :
  • und
  • , (linksassoziativ)
  • Leerzeichen, die mehrere Sätze trennen (assoziativ)
  • die horizontale Leiste

19
Was sind die Vorrangregeln der Operatoren?
Randomblue

:und sind insofern sehr ähnlich, als sie bedeuten, dass eine Sache in einer anderen Sache enthalten ist - eine Menge enthält Elemente, und ein Typ enthält gewissermaßen Werte. Der entscheidende Unterschied besteht darin x ∈ S, dass eine Menge Sbuchstäblich ein Element enthält x, während dies Γ ⊢ x : Tbedeutet, xdass abgeleitet werden kann, um den Typ Tim Kontext zu bewohnen Γ. In Anbetracht dessen lautet die Var-Regel: »Wenn x buchstäblich im Kontext enthalten ist, kann es (trivial) daraus abgeleitet werden«.
David

@Randomblue Ich habe die Vorrangstellung von Symbolen durch Hinzufügen von Klammern überall deutlich gemacht, z. B. (Γ,(x:τ))⊢(x:σ)siehe overleaf.com/read/ddmnkzjtnqbd#/61990222
SnowOnion

327

Diese Syntax mag zwar kompliziert aussehen, ist aber eigentlich ziemlich einfach. Die Grundidee stammt aus der formalen Logik: Der gesamte Ausdruck ist eine Implikation, wobei die obere Hälfte die Annahmen und die untere Hälfte das Ergebnis sind. Das heißt, wenn Sie wissen, dass die oberen Ausdrücke wahr sind, können Sie daraus schließen, dass auch die unteren Ausdrücke wahr sind.

Symbole

Eine andere Sache zu beachten ist, dass einige Buchstaben traditionelle Bedeutungen haben; Insbesondere repräsentiert Γ den "Kontext", in dem Sie sich befinden - das sind die Arten anderer Dinge, die Sie gesehen haben. So etwas wie Γ ⊢ ...bedeutet "der Ausdruck, ...wenn Sie die Typen jedes Ausdrucks in kennen Γ.

Das Symbol bedeutet im Wesentlichen, dass Sie etwas beweisen können. So Γ ⊢ ...heißt es in einer Aussage: "Ich kann ...in einem Kontext beweisen Γ. Diese Aussagen werden auch als Typurteile bezeichnet."

Eine andere Sache zu beachten: In der Mathematik bedeutet genau wie ML und Scala, x : σdass xTyp hat σ. Sie können es genauso lesen wie Haskell x :: σ.

Was jede Regel bedeutet

Wenn wir das wissen, wird der erste Ausdruck leicht zu verstehen: Wenn wir das wissen x : σ ∈ Γ( xdh σin einem bestimmten Kontext einen Typ haben Γ), dann wissen wir das Γ ⊢ x : σ(das heißt, in Γ, xhat einen Typ σ). Das sagt Ihnen also wirklich nichts sehr Interessantes. Es zeigt Ihnen nur, wie Sie Ihren Kontext verwenden.

Die anderen Regeln sind ebenfalls einfach. Nehmen Sie zum Beispiel [App]. Diese Regel hat zwei Bedingungen: e₀ist eine Funktion von einem Typ τzu einem Typ τ'und e₁ist ein Wert vom Typ τ. Jetzt wissen Sie , welche Art Sie durch die Anwendung erhalten e₀zu e₁! Hoffentlich ist das keine Überraschung :).

Die nächste Regel hat eine neue Syntax. Insbesondere Γ, x : τbedeutet nur der Kontext Γund das Urteil x : τ. Wenn wir also wissen, dass die Variable xeinen Typ von τund der Ausdruck eeinen Typ hat τ', kennen wir auch den Typ einer Funktion, die nimmt xund zurückgibt e. Dies sagt uns nur, was zu tun ist, wenn wir herausgefunden haben, welchen Typ eine Funktion hat und welchen Typ sie zurückgibt. Es sollte also auch nicht überraschend sein.

Der nächste zeigt Ihnen nur, wie Sie mit letAnweisungen umgehen . Wenn Sie wissen, dass ein Ausdruck e₁einen Typ hat τ, solange er xeinen Typ hat σ, hat ein letAusdruck, der lokal an xeinen Wert vom Typ σgebunden ist, e₁einen Typ τ. Dies sagt Ihnen nur, dass Sie mit einer let-Anweisung den Kontext im Wesentlichen mit einer neuen Bindung erweitern können - genau das lettut es!

Die [Inst]Regel behandelt die Untertypisierung. Es heißt, wenn Sie einen Wert vom Typ haben σ'und es sich um einen Untertyp handelt σ( der eine partielle Ordnungsbeziehung darstellt), dann ist dieser Ausdruck auch vom Typ σ.

Die letzte Regel befasst sich mit der Verallgemeinerung von Typen. Ein kurzer Hinweis: Eine freie Variable ist eine Variable, die nicht durch eine let-Anweisung oder ein Lambda in einem Ausdruck eingeführt wird. Dieser Ausdruck hängt jetzt vom Wert der freien Variablen aus ihrem Kontext ab. Die Regel besagt, dass, wenn es in Ihrem Kontext eine Variable gibt, αdie in nichts "frei" ist, jeder Ausdruck, dessen Typ Sie kennen, mit Sicherheit gesagt werden kann e : σwird diesen Typ für jeden Wert von haben α.

Wie man die Regeln benutzt

Was machen Sie mit diesen Regeln, nachdem Sie die Symbole verstanden haben? Nun, Sie können diese Regeln verwenden, um die Art der verschiedenen Werte herauszufinden. Schauen Sie sich dazu Ihren Ausdruck an (sagen wir f x y) und finden Sie eine Regel, deren Schlussfolgerung (unterer Teil) Ihrer Aussage entspricht. Nennen wir das, was Sie versuchen, Ihr "Ziel" zu finden. In diesem Fall würden Sie sich die Regel ansehen, die mit endet e₀ e₁. Wenn Sie dies gefunden haben, müssen Sie jetzt Regeln finden, die alles über der Linie dieser Regel beweisen. Diese Dinge entsprechen im Allgemeinen den Arten von Unterausdrücken, sodass Sie im Wesentlichen auf Teile des Ausdrucks zurückgreifen. Sie tun dies einfach, bis Sie Ihren Proofbaum fertiggestellt haben, der Ihnen einen Proof für die Art Ihres Ausdrucks gibt.

Alles, was diese Regeln tun, ist genau anzugeben - und in den üblichen mathematisch pedantischen Details: P -, wie die Arten von Ausdrücken herauszufinden sind.

Dies sollte Ihnen bekannt vorkommen, wenn Sie jemals Prolog verwendet haben - Sie berechnen den Proof-Baum im Wesentlichen wie einen menschlichen Prolog-Interpreter. Es gibt einen Grund, warum Prolog "Logikprogrammierung" genannt wird! Dies ist auch wichtig, da ich zuerst in den HM-Inferenzalgorithmus eingeführt wurde, indem ich ihn in Prolog implementierte. Das ist eigentlich überraschend einfach und macht klar, was los ist. Sie sollten es auf jeden Fall versuchen.

Hinweis: Ich habe wahrscheinlich einige Fehler in dieser Erklärung gemacht und würde es lieben, wenn jemand darauf hinweisen würde. Ich werde dies in ein paar Wochen im Unterricht behandeln, also bin ich dann sicherer: P.


5
\ alpha ist eine nicht freie Typvariable, keine übliche Variable. Um die Generalisierungsregel zu erklären, muss noch viel mehr erklärt werden.
Nponeccop

2
@nponeccop: Hmm, guter Punkt. Ich habe diese spezielle Regel noch nie gesehen. Könnten Sie mir helfen, es richtig zu erklären?
Tikhon Jelvis

8
@TikhonJelvis: Es ist eigentlich ziemlich einfach, ermöglicht es Ihnen (unter der Annahme zu verallgemeinern Γ = {x : τ}) λy.x : σ → τzu ∀ σ. σ → τ, aber nicht beschränkt auf ∀ τ. σ → τ, weil τfreier Variable in ist Γ. Wikipedia-Artikel über HM erklärt es ganz nett.
Vitus

7
Ich glaube, der Teil der Antwort, der sich darauf bezieht, [Inst]ist etwas ungenau. Dies ist nur zu verstehen , mein bisher, aber die Sigmas in den [Inst]und [Gen]Regeln beziehen sich nicht auf Typen, sondern Regelungen zu geben . Der Operator ist also eine Teilreihenfolge, die nichts mit der Untertypisierung zu tun hat, wie wir sie aus OO-Sprachen kennen. Es hängt mit polymorphen Werten wie zusammen id = λx. x. Die vollständige Syntax für eine solche Funktion wäre id = ∀x. λx. x. Jetzt können wir natürlich eine haben id2 = ∀xy. λx. x, wo ynicht verwendet wird. Dann id2 ⊑ id, was die [Inst]Regel sagt.
Ionuț G. Stan

71

Wenn mir jemand wenigstens sagen könnte, wo ich anfangen soll, um zu verstehen, was dieses Meer von Symbolen bedeutet

Siehe " Praktische Grundlagen von Programmiersprachen ", Kapitel 2 und 3, zum Stil der Logik durch Urteile und Ableitungen. Das gesamte Buch ist jetzt bei Amazon erhältlich.

Kapitel 2

Induktive Definitionen

Induktive Definitionen sind ein unverzichtbares Werkzeug beim Studium von Programmiersprachen. In diesem Kapitel werden wir das Grundgerüst induktiver Definitionen entwickeln und einige Beispiele für deren Verwendung geben. Eine induktive Definition besteht aus einer Reihe von Regeln zum Ableiten von Urteilen oder Behauptungen verschiedener Formen. Urteile sind Aussagen über ein oder mehrere syntaktische Objekte einer bestimmten Art. Die Regeln legen die notwendigen und ausreichenden Bedingungen für die Gültigkeit eines Urteils fest und bestimmen somit dessen Bedeutung vollständig.

2.1 Urteile

Wir beginnen mit dem Begriff eines Urteils oder einer Behauptung über ein syntaktisches Objekt. Wir werden viele Formen des Urteils anwenden, einschließlich solcher Beispiele:

  • n nat - n ist eine natürliche Zahl
  • n = n1 + n2 - n ist die Summe von n1 und n2
  • τ Typ - τ ist ein Typ
  • e : τ - Ausdruck e hat den Typ τ
  • ev - Ausdruck e hat den Wert v

Ein Urteil besagt, dass ein oder mehrere syntaktische Objekte eine Eigenschaft haben oder in irgendeiner Beziehung zueinander stehen. Die Eigenschaft oder Beziehung selbst wird als Urteilsform bezeichnet , und das Urteil, dass ein Objekt oder Objekte diese Eigenschaft haben oder in dieser Beziehung stehen, wird als Instanz dieser Urteilsform bezeichnet. Eine Urteilsform wird auch als Prädikat bezeichnet , und die Objekte, die eine Instanz bilden, sind ihre Subjekte . Wir schreiben ein J für das Urteil, das besagt , dass J von a gilt . Wenn es nicht wichtig ist, das Thema des Urteils zu betonen (Text wird hier abgeschnitten)


53

Wie verstehe ich die Hindley-Milner-Regeln?

Hindley-Milner ist ein Regelwerk in Form eines sequentiellen Kalküls (kein natürlicher Abzug), das zeigt, dass wir den (allgemeinsten) Typ eines Programms aus der Erstellung des Programms ohne explizite Typdeklarationen ableiten können.

Die Symbole und Notation

Lassen Sie uns zunächst die Symbole erläutern und die Priorität des Operators erörtern

  • 𝑥 ist eine Kennung (informell ein Variablenname).
  • : means ist eine Art von (informell eine Instanz von oder "is-a").
  • 𝜎 (Sigma) ist ein Ausdruck, der entweder eine Variable oder eine Funktion ist.
  • also wird 𝑥: 𝜎 gelesen " 𝑥 ist-a 𝜎 "
  • ∈ bedeutet "ist ein Element von"
  • 𝚪 (Gamma) ist eine Umgebung.
  • (die Behauptungszeichen) Mittel behaupten (oder beweisen, aber kontextuell „behaupten“ besser liest.)
  • ⊦ Γ x : σ wird also gelesen "Γ dass x behauptet, ist-a σ "
  • 𝑒 ist eine tatsächliche Instanz (Element) vom Typ 𝜎 .
  • 𝜏 (Tau) ist ein Typ: entweder einfach, variabel ( 𝛼 ), funktional 𝜏 → 𝜏 ' oder Produkt 𝜏 × 𝜏' (Produkt wird hier nicht verwendet)
  • 𝜏 → 𝜏 ' ist ein Funktionstyp, bei dem 𝜏 und 𝜏' möglicherweise unterschiedliche Typen sind.
  • 𝜆𝑥.𝑒 bedeutet, dass 𝜆 (Lambda) eine anonyme Funktion ist, die ein Argument 𝑥 verwendet und einen Ausdruck 𝑒 zurückgibt .

  • sei 𝑥 = 𝑒₀ in 𝑒₁ bedeutet im Ausdruck 𝑒₁ , ersetze 𝑒₀ wo immer 𝑥 erscheint.

  • bedeutet, dass das vorherige Element ein Subtyp (informell - Unterklasse) des letzteren Elements ist.

  • 𝛼 ist eine Typvariable.
  • 𝛼.𝜎 ist ein Typ, ∀ (für alle) Argumentvariablen, 𝛼 , der 𝜎 Ausdruck zurückgibt
  • frei (𝚪) bedeutet kein Element der im äußeren Kontext definierten freien Typvariablen von 𝚪. (Gebundene Variablen können ersetzt werden.)

Alles über der Linie ist die Prämisse, alles darunter ist die Schlussfolgerung ( Per Martin-Löf )

Vorrang, zum Beispiel

Ich habe einige der komplexeren Beispiele aus den Regeln genommen und redundante Klammern eingefügt, die Vorrang haben:

  • 𝑥: 𝜎 ∈ ∈ könnte geschrieben werden (𝑥: 𝜎) ∈ ∈
  • 𝚪 ⊦ 𝑥 : 𝜎 könnte geschrieben werden 𝚪 ⊦ ( 𝑥 : 𝜎 )

  • 𝚪 ⊦ sei 𝑥 = 𝑒₀ in 𝑒₁ : 𝜏 ist äquivalent 𝚪 ⊦ (( sei ( 𝑥 = 𝑒₀ ) in 𝑒₁ ): 𝜏 )

  • 𝚪 ⊦ 𝜆𝑥.𝑒 : 𝜏 → 𝜏 ' ist äquivalent 𝚪 ⊦ (( 𝜆𝑥.𝑒 ): ( 𝜏 → 𝜏' ))

Dann zeigen große Räume, die Assertionsaussagen und andere Voraussetzungen trennen, eine Reihe solcher Voraussetzungen an, und schließlich bringt die horizontale Linie, die Prämisse von Schlussfolgerung trennt, das Ende der Rangfolge.

Die Regeln

Was hier folgt, sind englische Interpretationen der Regeln, denen jeweils eine lose Anpassung und eine Erklärung folgen.

Variable

VAR-Logikdiagramm

Wenn 𝑥 eine Art von 𝜎 (Sigma) ist, ein Element von 𝚪 (Gamma),
schließen Sie, dass 𝚪 behauptet, 𝑥 sei ein 𝜎.

Anders ausgedrückt, in 𝚪 wissen wir, dass 𝑥 vom Typ 𝜎 ist, weil 𝑥 vom Typ 𝜎 in 𝚪 ist.

Dies ist im Grunde eine Tautologie. Ein Bezeichnername ist eine Variable oder eine Funktion.

Funktionsanwendung

APP-Logikdiagramm

Gegeben 𝚪 behauptet, 𝑒₀ sei ein Funktionstyp und 𝚪 behauptet, 𝑒₁ sei ein 𝜏
schlussfolgern 𝚪 behauptet, die Anwendung der Funktion 𝑒₀ auf 𝑒₁ sei ein Typ 𝜏 '

Um die Regel neu zu formulieren, wissen wir, dass die Funktionsanwendung den Typ 𝜏 'zurückgibt, da die Funktion den Typ 𝜏 → 𝜏' hat und ein Argument vom Typ 𝜏 erhält.

Dies bedeutet, dass wenn wir wissen, dass eine Funktion einen Typ zurückgibt und wir ihn auf ein Argument anwenden, das Ergebnis eine Instanz des Typs ist, von dem wir wissen, dass er zurückgibt.

Funktionsabstraktion

ABS-Logikdiagramm

Wenn 𝚪 und 𝑥 vom Typ 𝜏 behauptet, dass 𝑒 ein Typ ist, 𝜏 '
Schlussfolgerung 𝚪 eine anonyme Funktion behauptet, erts von 𝜆 Ausdruck zurückgibt, 𝑒 vom Typ 𝜏 → 𝜏' ist.

Wenn wir wieder eine Funktion sehen, die 𝑥 nimmt und einen Ausdruck 𝑒 zurückgibt, wissen wir, dass sie vom Typ 𝜏 → 𝜏 'ist, weil 𝑥 (a 𝜏) behauptet, dass 𝑒 ein 𝜏' ist.

Wenn wir wissen, dass 𝑥 vom Typ 𝜏 ist und somit ein Ausdruck 𝑒 vom Typ 𝜏 'ist, dann ist eine Funktion von 𝑥, die den Ausdruck 𝑒 zurückgibt, vom Typ 𝜏 → 𝜏'.

Lassen Sie die Variablendeklaration

LET Logic Diagram

Gegeben 𝚪 behauptet of vom Typ 𝜎 und 𝚪 und 𝑥 vom Typ 𝜎, behauptet 𝑒₁ vom Typ 𝜏,
schließe 𝚪 behauptet let𝑥 = 𝑒₀ in𝑒₁ vom Typ 𝜏

Locker ist 𝑥 in 𝑒₁ (a 𝜏) an 𝑒₀ gebunden, weil 𝑒₀ ein 𝜎 ist und 𝑥 ein 𝜎 ist, das behauptet, 𝑒₁ sei ein 𝜏.

Das heißt, wenn wir einen Ausdruck 𝑒₀ haben, der ein 𝜎 ist (eine Variable oder eine Funktion), und einen Namen 𝑥, auch ein 𝜎, und einen Ausdruck 𝑒₁ vom Typ 𝜏, dann können wir 𝑒₀ für 𝑥 ersetzen, wo immer er im Inneren erscheint von 𝑒₁.

Instanziierung

INST-Logikdiagramm

Gegeben 𝚪 behauptet 𝑒 vom Typ 𝜎 'und 𝜎' ist ein Subtyp von 𝜎
schlussfolgern 𝚪 behauptet 𝑒 ist vom Typ 𝜎

Ein Ausdruck 𝑒 ist vom übergeordneten Typ 𝜎, da der Ausdruck 𝑒 vom Subtyp 𝜎 'und 𝜎 vom übergeordneten Typ von 𝜎' ist.

Wenn eine Instanz von einem Typ ist, der ein Subtyp eines anderen Typs ist, dann ist es auch eine Instanz dieses Supertyps - des allgemeineren Typs.

Verallgemeinerung

GEN Logikdiagramm

Wenn 𝚪 behauptet, 𝑒 sei ein 𝜎 und 𝛼 kein Element der freien Variablen von 𝚪 ist,
schließen Sie 𝚪 behauptet 𝑒, geben Sie für alle Argumentausdrücke 𝛼 einen 𝜎-Ausdruck zurück

Im Allgemeinen wird 𝑒 für alle Argumentvariablen (𝛼) eingegeben, die 𝜎 zurückgeben, da wir wissen, dass 𝑒 ein 𝜎 und 𝛼 keine freie Variable ist.

Dies bedeutet, dass wir ein Programm verallgemeinern können, um alle Typen für Argumente zu akzeptieren, die nicht bereits im enthaltenen Bereich gebunden sind (Variablen, die nicht lokal sind). Diese gebundenen Variablen sind austauschbar.

Alles zusammenfügen

Unter bestimmten Voraussetzungen (z. B. keine freien / undefinierten Variablen, eine bekannte Umgebung) kennen wir die Arten von:

  • atomare Elemente unserer Programme (variabel),
  • von Funktionen zurückgegebene Werte (Funktionsanwendung),
  • funktionelle Konstrukte (Funktionsabstraktion),
  • let bindings (Let Variable Declarations),
  • übergeordnete Instanztypen (Instanziierung) und
  • alle Ausdrücke (Generalisierung).

Fazit

Diese Regeln zusammen ermöglichen es uns, den allgemeinsten Typ eines behaupteten Programms zu beweisen, ohne dass Typanmerkungen erforderlich sind.


1
so eine gute Zusammenfassung Aaron!
Bhurlow

48

Die Notation stammt aus dem natürlichen Abzug .

⊢ Symbol heißt Drehkreuz .

Die 6 Regeln sind sehr einfach.

Var Die Regel ist eine eher triviale Regel. Wenn in Ihrer Typumgebung bereits ein Typ für einen Bezeichner vorhanden ist, nehmen Sie ihn einfach aus der Umgebung, um auf den Typ zu schließen.

AppDie Regel besagt, dass Sie den Anwendungstyp ableiten können , wenn Sie zwei Bezeichner haben e0und e1deren Typ ableiten können e0 e1. Die Regel lautet wie folgt: Wenn Sie das e0 :: t0 -> t1und e1 :: t0(das gleiche t0!) Wissen, ist die Anwendung gut typisiert und der Typ ist t1.

Absund Letsind Regeln, um Typen für Lambda-Abstraktion und Einlass abzuleiten.

Inst Die Regel besagt, dass Sie einen Typ durch einen weniger allgemeinen ersetzen können.


4
Dies ist eine sequentielle Berechnung, keine natürliche Ableitung.
Roman Cheplyaka

12
@ RomanCheplyaka gut, die Notation ist ähnlich. Der Wikipedia-Artikel bietet einen interessanten Vergleich der beiden Techniken: en.wikipedia.org/wiki/Natural_deduction#Sequent_calculus . Der sequentielle Kalkül wurde als direkte Antwort auf die Fehler des natürlichen Abzugs geboren. Wenn also die Frage lautet: "Woher kommt diese Notation?", Ist "natürlicher Abzug" technisch eine korrektere Antwort.
Dan Burton

2
@RomanCheplyaka Eine weitere Überlegung ist, dass die sequentielle Berechnung rein syntaktisch ist (deshalb gibt es so viele strukturelle Regeln), während diese Notation dies nicht ist. Die erste Regel geht davon aus, dass der Kontext eine Menge ist, während es sich bei der sequentiellen Berechnung um ein einfacheres syntaktisches Konstrukt handelt.
Nponeccop

@Cheplyaka eigentlich, nein, es hat etwas, das wie eine "Sequenz" aussieht, aber es ist keine Sequenzrechnung. Haper entwickelt ein Verständnis davon in seinem Lehrbuch als "Urteil höherer Ordnung". Das ist wirklich ein natürlicher Abzug.
Philip JF

15

Es gibt zwei Möglichkeiten, sich e vorzustellen: σ. Einer ist "der Ausdruck e hat den Typ σ", ein anderer ist "das geordnete Paar des Ausdrucks e und des Typs σ".

Betrachten Sie Γ als das Wissen über die Arten von Ausdrücken, implementiert als eine Menge von Ausdrucks- und Typpaaren, e: σ.

Das Drehkreuz ⊢ bedeutet, dass wir aus dem Wissen auf der linken Seite ableiten können, was auf der rechten Seite ist.

Die erste Regel [Var] kann also gelesen werden:
Wenn unser Wissen Γ das Paar e: σ enthält, können wir aus Γ ableiten, dass e den Typ σ hat.

Die zweite Regel [App] kann gelesen werden:
Wenn wir aus Γ ableiten können, dass e_0 den Typ τ → τ 'hat, und wir aus Γ ableiten können, dass e_1 den Typ τ hat, dann können wir aus Γ ableiten, dass e_0 e_1 den hat Typ τ '.

Es ist üblich, Γ, e: σ anstelle von Γ Γ {e: σ} zu schreiben.

Die dritte Regel [Abs] kann also gelesen werden:
Wenn wir aus Γ mit x: τ erweitern können, dass e den Typ τ 'hat, dann können wir aus Γ ableiten, dass λx.e den Typ τ → τ' hat.

Die vierte Regel [Let] bleibt als Übung übrig. :-)

Die fünfte Regel [Inst] kann gelesen werden:
Wenn wir aus Γ ableiten können, dass e den Typ σ 'hat und σ' ein Subtyp von σ ist, können wir aus Γ ableiten, dass e den Typ σ hat.

Die sechste und letzte Regel [Gen] kann gelesen werden:
Wenn wir aus Γ ableiten können, dass e den Typ σ hat und α in keinem der Typen in Γ eine freie Typvariable ist, können wir aus Γ ableiten, dass e den Typ hat ∀α σ.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.