Cálculo lambda: diferença entre contextos e contextos de avaliação

12

Em primeiro lugar, gostaria de dizer que meu texto abaixo pode conter erros, portanto, sinta-se à vontade para apontar quaisquer erros na minha formulação da pergunta.

Considere um cálculo lambda sem tipo com booleanos e instruções if cujos termos são dados por esta sintaxe:

 t ::= v | t t | if t t t | x
 v ::= \x.t | #t | #f

Os contextos C, neste caso, seriam dados de acordo com esta sintaxe:

C ::= [-] | \x. C | C t | t C | if C t t | if t C t | if t t C 

Além disso, pode-se definir os contextos de avaliação E de acordo com essa outra sintaxe:

E ::= [-] | \x. E | v E | E t | if E t t 

Dividi minha pergunta em três sub-pontos que gostaria de abordar.

  1. Quando as duas noções são usadas? Sei, por exemplo, que contextos de avaliação são usados ​​para definir a semântica do cálculo, mas o uso de contextos ainda me escapa. Também gostaria de alguma confirmação do meu conhecimento aqui.
  2. Quando um deve ser preferido em relação ao outro e por quê?
  3. Você poderia apontar para artigos relevantes que poderiam me ajudar a resolver esse problema?

fonte

Respostas:

15

O contexto é usado para muitos propósitos, mas geralmente para definir congruências em programas. Contextos de avaliação são um subconjunto de contextos. Eles geralmente são usados ​​para definir relações de redução. Deixe-me dar um exemplo de cada um.

Uma maneira formal de definir a igualdade de programas é dizer que dois programas e N são contextualmente iguais e podem se substituir em cada contexto sem uma mudança de comportamento. Podemos definir isso da seguinte maneira: M e N são contextualmente iguais, desde que todos os contextos de fechamento C [ ] para M e N : C se nem C [ M ]MNMNC[]MN se e somente se C [ N ] t . Dizemos que um contexto está sefechando para M , NC[M]tC[N]tM,NC[M] nem possuem variáveis ​​livres. A expressão M t significa que o programa M reduz em um número finito de etapas o valor t . (Como um aparte, observe que a definição de equivalência contextual está mais envolvida para noções ricas de computação, por exemplo, processos concorrentes.)C[N]MtMt

Por outro lado, contextos de avaliação são contextos que não bloqueiam a avaliação. Mais precisamente, um contexto de avaliação é um termo com um orifício no ponto em que a próxima etapa de redução atômica deve ocorrer (ou pode ocorrer para computação não determinística). Portanto, a seguinte regra deve ser válida para os contextos de avaliação: Como exemplo de uso de contextos de avaliação, considere as regras de redução para ocálculo dovalor-λ-cálculo, onde não reduzimos emλ. Portanto, mesmo quandoMN, não temos uma reduçãoλx. Mλx. N. Isso pode ser facilmente expresso com a regra contextual geral acima, juntamente com uma gramática para contextos de avaliação que omitemexpressõesλ. Os contextos de avaliação foram usados ​​pela primeira vez em

MNE[M]E[N]
λλMNλx.Mλx.NλO relatório revisado sobre as teorias sintáticas do controle e estado seqüenciais por Felleisen e Hieb.
Martin Berger
fonte
14

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::=[]xtCCtλ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{xN}
M{xN} aplicado a M .xNM

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)Nttt=(λ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{xN}] A mesma definição pode ser expressa explicitando todos os tipos de contextos:

(λx.M)NβM{xN}(β)MβNC[M]βC[N](γ)
(λx.M)NβM{xN}(β)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::=[]xtDDt
Também poderíamos apresentar essa definição expandindo-a, como fizemos acima para a redução beta completa:
(λx.M)NnpM{xN}MnpND[M]npD[N]
(λx.M)NnpM{xN}(β)MnpNMPnpNP(C@<)MnpNPMnpPN(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::=xV1Vnλx.M
E::=[]MEEV
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)VcbvaM{xV}(β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.
Gilles 'SO- stop being evil'
fonte
1
Your latter definition of evaluation contexts are closer to the original Felleisen and Hieb notion. They are a syntactic means to help express the evaluation order of terms of a calculus. An evaluation context is a special kind of context, as it allows one to uniquely factorise a term into a context and a redex (when possible), thereby indicating, deterministically, where the next reduction step should occur.
Dave Clarke
@DaveClarke As an aside, you can also use evaluation contexts to define evaluation for non-deterministic notions of computation, where you don't have a unique decomposition into evaluation context and redex.
Martin Berger
@MartinBerger: Indeedy.
Dave Clarke
@DaveClarke Do you mean “a deterministic evaluation context is a special kind of context”? I can take an arbitrary set of contexts and define an evaluation strategy based on it.
Gilles 'SO- stop being evil'
@Gilles: Evaluation contexts can define a deterministic reduction strategy. I don't think I have seen the phrase "deterministic evaluation context". They are of course a special kind of context. I agree with your comment; the point is more that your answer misses the historical significance of evaluation contexts, which was to define a deterministic notion of reduction.
Dave Clarke