Un contesto è una nozione sintattica. Un contesto è un termine con un buco in esso. (Occasionalmente ci sono contesti multi-hole, la definizione sarà data chiaramente in quel caso.) La sintassi dei contesti è definita prendendo la sintassi dei termini e permettendo a un sotterma di essere un buco anziché un termine. In BNF (io uso il lambda-calcolo come esempio, senza valori booleani e if che non danno nulla all'esempio.):
[]
C::=[]∣x∣tC∣Ct∣λx.C
Insieme alla definizione di un contesto arriva la definizione di mettere un termine in un contesto. Se è un contesto e è un termine, allora è il termine ottenuto inserendo nell'albero della sintassi dove il foro è in . Questa è sostanzialmente una sostituzione in cui si garantisce che la variabile si verifichi esattamente una volta (ma si noti che la "variabile" che viene sostituita è una variabile a livello meta, , non una variabile nel lambda-calcolo o altra lingua dei termini ).C[]tC[t]t[]C[t][]t
I contesti sono usati per formulare varie definizioni in semantica. Un esempio comune è che la maggior parte delle nozioni di valutazione implica la definizione di contesti in cui la valutazione può essere eseguita. Ad esempio, considera il lambda-calcolo. La nozione fondamentale di valutazione è data dalla regola di riduzione beta:
dove è la sostituzione applicata al .
(λx.M)N→βM{x←N}
M{x←N}x↦NM
Questa non è la definizione completa di beta-riduzione: dato un termine , può beta-ridurre se ci sono sottotermi e e una variabile tale che ; ma più in generale possono beta-ridurre se c'è un sottotermine tale che . Un altro modo per esprimere questo è che può ridurre beta se c'è un contesto e alcuni termini e e una variabile tale chetMNxt=(λx.M)Ntt′t′=(λx.M)NtCMNxt=C[(λx.M)N]. Quando c'è una tale riduzione, il lato destro è . Per usare una notazione formale, la riduzione beta è definita dalle seguenti regole di detrazione:
La stessa definizione può essere espressa rendendo espliciti tutti i tipi di contesti:
C[M{x←N}]
(λ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@>)
Questa definizione produce beta-riduzione, ovvero una nozione di valutazione che consente di ridurre qualsiasi sotterfugio. I calcoli eseguiti nei linguaggi di programmazione spesso non consentono di ridurre i sottotermini all'interno delle funzioni: la regola di riduzione può essere applicata solo al livello superiore, o sul lato sinistro o sul lato destro di un'applicazione. Possiamo esprimerlo definendo un nuovo tipo di contesto che non consente tutte le forme sintattiche:
Possiamo usare questa sintassi per definire la nozione semantica di valutazione non parziale:
Potremmo anche presentare questa definizione espandendola, come abbiamo fatto sopra per la riduzione beta completa:
D::=[]∣x∣tD∣Dt
(λx.M)N→npM{x←N}M→npND[M]→npD[N]
(λx.M)N→npM{x←N}(β)M→npNMP→npNP(C@<)M→npNPM→npPN(C@>)
D verrebbe chiamato contesto di valutazione perché viene utilizzato per definire una nozione di valutazione. Un contesto di valutazione non è un tipo speciale di contesto; piuttosto,
chiamarlo un contesto di valutazione è una questione di ciò per cui il contesto è usato .
Darò un altro esempio di contesto. Definiamo i valori base alla seguente sintassi:
Ora definiamo un altro tipo di contesti:
Rispetto a sopra, il buco può trovarsi sul lato funzionale di un'applicazione se l'argomento dell'applicazione è un valore. Definire quindi la seguente nozione di riduzione:
V
V::=xV1…Vn∣λx.M
E::=[]∣ME∣EV
D(λx.M)V→cbvaM{x←V}(βcbva)M→βNE[M]→cbvaE[N](γcbva)
Con la limitazione che l'argomento della funzione deve essere un valore nella prima regola e che le astrazioni lambda non sono contesti, stiamo definendo una strategia di valutazione call-by-value. Con l'ulteriore limitazione che l'argomento viene valutato prima della funzione, si tratta di una chiamata d'ordine applicativa per valore.