Un contexto es una noción sintáctica. Un contexto es un término con un agujero en él. (Ocasionalmente hay contextos de múltiples agujeros, la definición se dará claramente en ese caso.) La sintaxis de los contextos se define tomando la sintaxis de los términos y permitiendo que un subterráneo sea un agujero lugar de un término. En BNF (uso el cálculo lambda como ejemplo, sin booleanos y sentencias if que no aportan nada al ejemplo):
[]
C::=[]∣x∣tC∣Ct∣λx.C
Junto con la definición de un contexto viene la definición de poner un término en un contexto. Si es un contexto y es un término, entonces es el término obtenido al poner en el árbol de sintaxis donde el agujero está en . Esto es básicamente una sustitución en la que se garantiza que la variable ocurra exactamente una vez (pero tenga en cuenta que la "variable" que se sustituye es una variable en el nivel meta, , no una variable en el cálculo lambda u otro lenguaje de los términos ).C[]tC[t]t[]C[t][]t
Los contextos se utilizan para formular varias definiciones en semántica. Un ejemplo común es que la mayoría de las nociones de evaluación implican la definición de contextos en los que se puede realizar la evaluación. Por ejemplo, considere el cálculo lambda. La noción fundamental de evaluación viene dada por la regla de reducción beta:
donde es la sustitución aplicada a .
(λx.M)N→βM{x←N}
M{x←N}x↦NM
Esta no es la definición completa de reducción beta: dado un término , puede reducir beta si hay subterms y y una variable tal que ; pero más generalmente puede beta-reducir si hay un subtérmino de tal manera que . Otra forma de expresar esto es que puede reducir beta si hay un contexto y algunos términos y y una variable tal quetMNxt=(λx.M)Ntt′t′=(λx.M)NtCMNxt=C[(λx.M)N]. Cuando existe tal reducción, el lado derecho es . Para usar una notación formal, la reducción beta se define mediante las siguientes reglas de deducción:
La misma definición puede expresarse haciendo explícitos todos los tipos de contextos:
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@>)
Esta definición produce una reducción beta, es decir, una noción de evaluación que permite reducir cualquier subterráneo. Los cálculos realizados en lenguajes de programación a menudo no permiten la reducción de subterms dentro de las funciones: la regla de reducción solo se puede aplicar en el nivel superior, o en el lado izquierdo o derecho de una aplicación. Podemos expresar esto definiendo un nuevo tipo de contexto que no permita todas las formas sintácticas:
Podemos usar esta sintaxis para definir la noción semántica de evaluación no parcial:
También podríamos presentar esta definición expandiéndola, como hicimos anteriormente para la reducción 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 se llamaría contexto de evaluación porque se utiliza para definir una noción de evaluación. Un contexto de evaluación no es un tipo especial de contexto; más bien,
llamarlo contexto de evaluación es una cuestión de para qué se utiliza el contexto .
Daré un ejemplo más de contexto. Definamos los valores acuerdo con la siguiente sintaxis:
Ahora definamos otro tipo de contextos:
Comparado con arriba, el agujero puede estar en el lado de la función de una aplicación si el argumento de la aplicación es un valor. Defina entonces la siguiente noción de reducción:
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 restricción de que el argumento de la función debe ser un valor en la primera regla y que las abstracciones lambda no son contextos, estamos definiendo una estrategia de evaluación llamada por valor. Con la restricción adicional de que el argumento se evalúa antes de la función, esta es una llamada de orden aplicativo por valor.