Ein Kontext ist ein syntaktischer Begriff. Ein Kontext ist ein Begriff mit einem Loch. (Gelegentlich gibt es Kontexte mit mehreren Löchern. In diesem Fall wird die Definition klar angegeben.) Die Syntax von Kontexten wird definiert, indem die Syntax von Begriffen verwendet wird und ein Subterm ein Loch anstelle eines Begriffs sein darf . In BNF (Ich benutze die Lambda-Kalkül als Beispiel, ohne booleans und wenn Aussagen , die sich auf das Beispiel nichts bringen.):
C : : = [ ] | x | t[ ]
C: : = [ ] | X | tC∣ Ct ≤ λ x . C
Zusammen mit der Definition eines Kontexts entsteht die Definition, einen Begriff in einen Kontext zu setzen. Wenn ein Kontext und t ein Term ist, dann ist C [ t ] der Term, der erhalten wird, indem t in den Syntaxbaum gesetzt wird, in dem sich das Loch [ ] in C [ t ] befindet . Dies ist im Grunde eine Substitution, bei der die Variable garantiert genau einmal vorkommt (beachten Sie jedoch, dass die „Variable“, die substituiert wird, eine Variable auf Metaebene ist, [ ] und keine Variable im Lambda-Kalkül oder in einer anderen Sprache der Begriffe t ).C[ ]tC[ t ]t[ ]C[ t ][ ]t
Kontexte werden verwendet, um verschiedene Definitionen in der Semantik zu formulieren. Ein weit verbreitetes Beispiel ist, dass die meisten Evaluierungsbegriffe die Definition von Kontexten beinhalten, in denen eine Evaluierung durchgeführt werden kann. Betrachten Sie zum Beispiel die Lambda-Rechnung. Der Grundbegriff der Bewertung ergibt sich aus der Beta-Reduktionsregel:
wobei M { x ← N } dieauf M angewendeteSubstitution x ↦ N ist .
( λ x . M)N→βM{ x ← N}
M{ x ← N}x ↦ NM
Dies ist nicht die vollständige Definition von Beta-Reduktion: Wenn ein Term , kann er Beta-Reduktion bewirken , wenn es Subtermen M und N und eine Variable x gibt, so dass t = ( λ x . M )tMNx ; aber allgemeinerkann t beta-reduzieren,wenn es eine Untermenge t 'gibt, so dass t ' = ( λ x . M )t = ( λ x . M)Ntt′t′=(λx.M)N . Eine andere Möglichkeit, dies auszudrücken, ist, dass beta-reduzieren kann, wenn es einen Kontext C und einige Terme M und N und eine Variable x gibt, so dass t = C [ ( λ x . M )tCMNx . Bei einer solchen Reduktion ist die rechte Seite C [ M { x ← N } ] . Um eine formale Notation zu verwenden, wird die Beta-Reduktion durch die folgenden Abzugsregeln definiert:
t=C[(λx.M)N]C[M{x←N}]
Dieselbe Definition kann ausgedrückt werden, indem alle Arten von Kontexten explizit angegeben werden:
(λx.M)N→βM{x←N}(β)M→βNC[M]→βC[N](γ)
(λx.M)N→βM{x←N}(β)M→βNλx.M→βλx.N(Cλ)M→βNMP→βNP(C@<)M→βNPM→βPN(C@>)
Diese Definition führt zu einer Beta-Reduktion, dh einem Evaluationsbegriff, der die Reduzierung von Subtermen ermöglicht. In Programmiersprachen durchgeführte Berechnungen ermöglichen häufig keine Reduzierung von Untertiteln innerhalb von Funktionen: Die Reduzierungsregel kann nur auf der obersten Ebene oder auf der linken oder rechten Seite einer Anwendung angewendet werden. Das können wir ausdrücken , indem eine neue Art von Kontext zu definieren , die nicht alle syntaktischen Formen erlaubt:
Mit dieser Syntax können wir den semantischen Begriff der nicht partiellen Auswertung definieren:
D::=[]∣x∣tD∣Dt
Wir könnten diese Definition auch präsentieren, indem wir sie erweitern, wie wir es oben für die vollständige Beta-Reduktion getan haben:
(λx.M)N→npM{x←N}M→npND[M]→npD[N]
Dwürde als Bewertungskontext bezeichnet, da es zur Definition eines Bewertungsbegriffs verwendet wird. Ein Bewertungskontext ist keine besondere Art von Kontext. Vielmehr
ist es eine Frage, wofür der Kontext verwendetwird
, ihn als Bewertungskontext zu bezeichnen.
(λx.M)N→npM{x←N}(β)M→npNMP→npNP(C@<)M→npNPM→npPN(C@>)
D
Ich werde ein weiteres Beispiel für den Kontext geben. Definieren sie Werte gemäß der folgenden Syntax:
V : : = x V 1 ... V n | & lgr; x . M
Nun wollen wir definieren eine andere Art von Zusammenhängen:
E : : = [ ] | MV
V: : = X V1… Vn∣ λ x . M
E: : = [ ] | ME∣ EV
D( λ x . M)V→c b v aM{ x ← V}( βc b v a)M→βNE[ M] →c b v aE[ N]( γc b v a)