Um contexto é uma noção sintática. Um contexto é um termo com um buraco nele. (Ocasionalmente, existem contextos com vários orifícios, a definição será dada claramente nesse caso.) A sintaxe dos contextos é definida usando a sintaxe dos termos e permitindo que um subtermo seja um orifício [] vez de um termo. Em BNF (eu uso a lambda-cálculo como um exemplo, sem booleans e se afirmações que não trazem nada para o exemplo.):
C::=[]∣x∣tC∣Ct∣λx.C
Juntamente com a definição de um contexto, vem a definição de colocar um termo em um contexto. Se é um contexto e t é um termo, então C [ t ] é o termo obtido colocando t na árvore de sintaxe onde o orifício [ ] está em C [ t ]C[]tC[t]t[]C[t] . Essa é basicamente uma substituição na qual a variável é garantida para ocorrer exatamente uma vez (mas observe que a “variável” substituída é uma variável no nível meta, , não uma variável no cálculo lambda ou em outro idioma dos termos t ).[]t
Os contextos são usados para formular várias definições em semântica. Um exemplo comum é que a maioria das noções de avaliação envolve a definição de contextos nos quais a avaliação pode ser realizada. Por exemplo, considere o cálculo lambda. A noção fundamental de avaliação é dada pela regra da redução beta:
onde M { x ← N } é a substituição x
(λx.M)N→βM{x←N}
M{x←N} aplicado a
M .
x↦NM
Esta não é a definição completa de redução beta: dado um termo , ele pode reduzir beta se houver subtermos M e N e uma variável x tal que t = ( λ x . M )tMNx ; mas mais geralmente t pode reduzir betase houver um subtermo t ' tal que t ' = ( λ x . M )t=(λx.M)Ntt′t′=(λx.M)N . Outra maneira de expressar isso é que pode reduzir beta se houver um contexto C e alguns termos M e N e uma variável x tal que t = C [ ( λ x . M )tCMNx . Quando existe tal redução, o lado direito é C [ M { x ← N }t=C[(λx.M)N] . Para usar uma notação formal, a redução beta é definida pelas seguintes regras de dedução:
C[M{x←N}]
A mesma definição pode ser expressa explicitando todos os tipos de contextos:
(λ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@>)
Essa definição gera redução beta, ou seja, uma noção de avaliação que permite reduzir qualquer subtermo. Cálculos como realizados em linguagens de programação geralmente não permitem reduzir subtermos dentro de funções: a regra de redução pode ser aplicada apenas no nível superior, ou no lado esquerdo ou no lado direito de um aplicativo. Podemos expressar isso através da definição de um novo tipo de contexto que não permite que todas as formas sintáticas:
Podemos usar esta sintaxe para definir a noção semântica de avaliação não parcial:
D::=[]∣x∣tD∣Dt
Também poderíamos apresentar essa definição expandindo-a, como fizemos acima para a redução beta completa:
(λ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 seria chamado de contexto de avaliação porque é usado para definir uma noção de avaliação. Um contexto de avaliação não é um tipo especial de contexto; em vez disso,
chamá-lo de contexto de avaliação é uma questão de como o contexto é usado .
V
V::=xV1…Vn∣λx.M
E::=[]∣ME∣EV
Compared with
D above, the hole can be on the function side of an application if the argument of the application is a value. Define then the following notion of reduction:
(λx.M)V→cbvaM{x←V}(βcbva)M→βNE[M]→cbvaE[N](γcbva)
With the restriction that the argument of the function must be a value in the first rule and that lambda abstractions are not contexts, we're defining a call-by-value evaluation strategy. With the further restriction that the argument is evaluated before the function, this is applicative order call by value.