No cálculo lambda puro, temos o conjunto de termos definido indutivamente (a gramática):
Sob a estratégia de avaliação de valor por chamada, temos as regras de inferência para redução beta e regras sobre como avaliar aplicativos (regras de congruência). Estou tentando entender como os contextos de avaliação podem substituir as regras de congruência sem realmente alterar a sintaxe do idioma. Sem contextos de avaliação, temos o seguinte:
Isso faz sentido, pois se tivermos uma instância de uma expressão , fica claro que é do formato e, portanto,
Se substituirmos as regras de congruência pelos contextos de avaliação: , precisamos de apenas uma regra para expressar as regras de congruência da linguagem:
Estou confuso sobre como os contextos de avaliação podem nos dizer como avaliar a expressão de cima sem alterar a sintaxe do idioma. Não entendo como o contexto da avaliação "funciona" sem reescrever como
onde . Não há razão a priori óbvia para avaliar sob chamada por valor sem o conhecimento de . Eu realmente não tenho idéia de onde estou errado. Alguém pode ajudar a corrigir meu pensamento?
Respostas:
A sutileza reside em onde é feita a distinção entre linguagem e metalinguagem. Como René Magritte colocou:
Quando escrevemos uma regra como
Quando escrevemos a regra
Se chamarmos o contexto( λ f. λ x . fx ) [ ⋅ ] ( λ w . w ) pelo (meta-) nome Et , então t =Et[ ( λ y. y) ( λ z. z) ] . Novamente, essa é uma igualdade entre dois termos lambda, ou seja, o mesmo termo lambda está em ambos os lados do sinal de igual. O que temos à esquerda e à direita são duas meta-notações diferentes para o mesmo termo lambda( λ f. λ x . fx ) ( ( λ y. y) ( λ z. z) ) ( λ w . w ) : um que usa um nome que demos a ele, outro que é um pouco mais complicado envolvendo um contexto ao qual demos um nome.
Dado o termot , como você descobre como isso pode reduzir?
A gramática do contexto da avaliação segue a estrutura das regras de avaliação, portanto, na verdade, não são realmente dois métodos, mas duas maneiras diferentes de expressar a mesma definição.
Para entender isso, recomendo vivamente o seguinte exercício: no seu idioma favorito, implemente a avaliação de chamada por valor de termo lambda de maneira direta, com um tipo representando termos lambda e uma função executando uma etapa de redução.
fonte