Normalisierung durch Auswertung – Wikipedia
In der Programmiersprachen-Semantik Normalisierung durch Bewertung (NBE) ist ein Stil, um die normale Form von Begriffen in der λ-Rechnung zu erhalten, indem man sich auf ihre Denotationssemantik beruft. Ein Begriff steht an erster Stelle interpretiert in ein Denotationsmodell der λ-Termstruktur, und dann wird ein kanonischer (β-normaler und η-langer) Vertreter durch extrahiert reifizieren die Bezeichnung. Ein solcher im Wesentlichen semantischer Ansatz unterscheidet sich von der traditionelleren syntaktischen Beschreibung der Normalisierung als Reduktion in einem Term-Rewrite-System, bei dem β-Reduktionen tief in λ-Termen zulässig sind.
NBE wurde zuerst für den einfach typisierten Lambda-Kalkül beschrieben.[1] Es wurde seitdem sowohl auf schwächere Systeme wie den untypisierten Lambda-Kalkül ausgedehnt[2] unter Verwendung eines domänentheoretischen Ansatzes und zu reicheren Typsystemen wie mehreren Varianten der Martin-Löf-Typentheorie.[3][4]
Gliederung[edit]
Betrachten Sie den einfach typisierten Lambda-Kalkül, bei dem die Typen τ Grundtypen (α), Funktionstypen (→) oder Produkte (×) sein können, die durch die folgende Backus-Naur-Formgrammatik gegeben werden (→ wie üblich rechts assoziieren):
- (Typen) τ :: = α | τ1 → τ2 | τ1 × τ2
Diese können als Datentyp in der Metasprache implementiert werden. Für Standard ML könnten wir beispielsweise Folgendes verwenden:
datatype ty = Basic of string
| Arrow of ty * ty
| Prod of ty * ty
Begriffe werden auf zwei Ebenen definiert.[5] Je niedriger syntaktisch Ebene (manchmal die genannt dynamisch level) ist die Darstellung, die man normalisieren will.
- (Syntaxbegriffe) s,t,… :: = var x | lam ((x, t) | App ((s, t) | Paar ((s, t) | fst t | snd t
Hier lam/.App (bzw. Paar/.fst,snd) sind die Intro / Elim-Formen für → (bzw. ×) und x sind Variablen. Diese Begriffe sollen als erste Ordnung in der Metasprache implementiert werden:
datatype tm = var of string
| lam of string * tm | app of tm * tm
| pair of tm * tm | fst of tm | snd of tm
Die Denotationssemantik von (geschlossenen) Begriffen in der Metasprache interpretiert die Konstrukte der Syntax in Bezug auf Merkmale der Metasprache; so, lam wird als Abstraktion interpretiert, App als Anwendung usw. Die konstruierten semantischen Objekte sind wie folgt:
- (Semantische Begriffe) S.,T.,… :: = LAM (λx. S. x) | PAAR ((S., T.) | SYN t
Beachten Sie, dass die Semantik keine Variablen oder Eliminierungsformen enthält. Sie werden einfach als Syntax dargestellt. Diese semantischen Objekte werden durch den folgenden Datentyp dargestellt:
datatype sem = LAM of (sem -> sem)
| PAIR of sem * sem
| SYN of tm
Es gibt zwei typindizierte Funktionen, die sich zwischen der syntaktischen und der semantischen Ebene hin und her bewegen. Die erste Funktion, normalerweise geschrieben ↑τ, spiegelt der Begriff Syntax in die Semantik, während der zweite reifiziert die Semantik als syntaktischer Begriff (geschrieben als ↓τ). Ihre Definitionen rekursiv wie folgt:
Diese Definitionen lassen sich leicht in der Metasprache implementieren:
(* reflect : ty -> tm -> sem *)
fun reflect (Arrow (a, b)) t =
LAM (fn S => reflect b (app t (reify a S)))
| reflect (Prod (a, b)) t =
PAIR (reflect a (fst t)) (reflect b (snd t))
| reflect (Basic _) t =
SYN t
(* reify : ty -> sem -> tm *)
and reify (Arrow (a, b)) (LAM S) =
let x = fresh_var () in
Lam (x, reify b (S (reflect a (var x))))
end
| reify (Prod (a, b)) (PAIR S T) =
Pair (reify a S, reify b T)
| reify (Basic _) (SYN t) = t
Durch Induktion auf die Struktur von Typen folgt, dass wenn das semantische Objekt S. bezeichnet einen gut typisierten Begriff s vom Typ τ, dann das Objekt erneut bestätigen (dh ↓τ S) erzeugt die β-normale η-lange Form von s. Alles, was bleibt, ist daher, die anfängliche semantische Interpretation zu konstruieren S. von einem syntaktischen Begriff s. Diese Operation, geschrieben ∥s∥Γ, wobei Γ ein Kontext von Bindungen ist, erfolgt die Induktion ausschließlich über den Begriff Struktur:
In der Implementierung:
(* meaning : ctx -> tm -> sem *)
fun meaning G t =
case t of
var x => lookup G x
| lam (x, s) => LAM (fn S => meaning (add G (x, S)) s)
| app (s, t) => (case meaning G s of
LAM S => S (meaning G t))
| pair (s, t) => PAIR (meaning G s, meaning G t)
| fst s => (case meaning G s of
PAIR (S, T) => S)
| snd t => (case meaning G t of
PAIR (S, T) => T)
Beachten Sie, dass es viele nicht erschöpfende Fälle gibt. wenn jedoch auf a angewendet geschlossen Keiner dieser fehlenden Fälle ist jemals aufgetreten. Die NBE-Operation zu geschlossenen Bedingungen lautet dann:
(* nbe : ty -> tm -> tm *)
fun nbe a t = reify a (meaning empty t)
Betrachten Sie als Beispiel für seine Verwendung den syntaktischen Begriff SKK
unten definiert:
val K = lam ("x", lam ("y", var "x"))
val S = lam ("x", lam ("y", lam ("z", app (app (var "x", var "z"), app (var "y", var "z")))))
val SKK = app (app (S, K), K)
Dies ist die bekannte Codierung der Identitätsfunktion in der kombinatorischen Logik. Das Normalisieren auf einen Identitätstyp erzeugt:
- nbe (Arrow (Basic "a", Basic "a")) SKK;
val it = lam ("v0",var "v0") : tm
Das Ergebnis ist tatsächlich in η-langer Form, wie leicht durch Normalisieren auf einen anderen Identitätstyp zu sehen ist:
- nbe (Arrow (Arrow (Basic "a", Basic "b"), Arrow (Basic "a", Basic "b"))) SKK;
val it = lam ("v1",lam ("v2",app (var "v1",var "v2"))) : tm
Siehe auch[edit]
Verweise[edit]
- ^ Berger, Ulrich; Schwichtenberg, Helmut (1991). “Eine Umkehrung der Bewertungsfunktion für typisierten λ-Kalkül”. LICS.
- ^ Filinski, Andrzej; Rohde, Henning Korsholm (2004). “Ein Bezeichnungsbericht über untypisierte Normalisierung durch Bewertung”. FOSSACS.
- ^ Abel, Andreas; Aehlig, Klaus; Dybjer, Peter (2007). “Normalisierung durch Evaluation für die Martin-Löf-Typentheorie mit einem Universum” (PDF). MFPS.
- ^ Abel, Andreas; Coquand, Thierry; Dybjer, Peter (2007). “Normalisierung durch Bewertung für die Martin-Löf-Typentheorie mit typisierten Gleichheitsurteilen” (PDF). LICS.
- ^ Danvy, Olivier (1996). “Typgerichtete Teilbewertung” (PostScript gzippt). POPL: 242–257.
Recent Comments