Deixe a expressão - Let expression

Na ciência da computação, uma expressão "let" associa uma definição de função a um escopo restrito .

A expressão "let" também pode ser definida em matemática, onde associa uma condição booleana a um escopo restrito.

A expressão "let" pode ser considerada como uma abstração lambda aplicada a um valor. Dentro da matemática, uma expressão let também pode ser considerada como uma conjunção de expressões, dentro de um quantificador existencial que restringe o escopo da variável.

A expressão let está presente em muitas linguagens funcionais para permitir a definição local de expressão, para uso na definição de outra expressão. A expressão let está presente em algumas linguagens funcionais em duas formas; deixe ou "deixe rec". Let rec é uma extensão da expressão let simples que usa o combinador de ponto fixo para implementar a recursão .

História

A linguagem LCF de Dana Scott foi um estágio na evolução do cálculo lambda para as linguagens funcionais modernas. Essa linguagem introduziu a expressão let, que apareceu na maioria das linguagens funcionais desde então.

As linguagens Scheme , ML e, mais recentemente, Haskell herdaram expressões let do LCF.

Linguagens imperativas com estado, como ALGOL e Pascal, essencialmente implementam uma expressão let, para implementar escopo restrito de funções, em estruturas de bloco.

A estreitamente relacionadas "onde " cláusula, juntamente com a sua variante recursiva " onde rec ", já apareceu em Peter Landin é A avaliação mecânica de expressões .

Descrição

Uma expressão "let" define uma função ou valor para uso em outra expressão. Além de ser uma construção usada em muitas linguagens de programação funcionais, é uma construção de linguagem natural frequentemente usada em textos matemáticos. É uma construção sintática alternativa para uma cláusula where.

Deixe expressão Cláusula Where

Deixar

e

no

Onde

e

Em ambos os casos, a construção inteira é uma expressão cujo valor é 5. Como if-then-else, o tipo retornado pela expressão não é necessariamente booleano.

Uma expressão let vem em 4 formas principais,

Forma E Recursiva Definição / Restrição Descrição
Simples Não Não Definição Definição simples de função não recursiva.
Recursiva Não sim Definição Definição de função recursiva (implementada usando o combinador Y ).
Mútuo sim sim Definição Definição de função mutuamente recursiva.
Matemático sim sim Limitação Definição matemática que suporta uma condição let booleana geral.

Em linguagens funcionais, a expressão let define funções que podem ser chamadas na expressão. O escopo do nome da função é limitado à estrutura da expressão let.

Em matemática, a expressão let define uma condição, que é uma restrição da expressão. A sintaxe também pode suportar a declaração de variáveis ​​quantificadas existencialmente locais para a expressão let.

A terminologia, sintaxe e semântica variam de idioma para idioma. Em Scheme , let é usado para a forma simples e let rec para a forma recursiva. No ML deixe marcar apenas o início de um bloco de declarações com diversão marcando o início da definição da função. Em Haskell, let pode ser recursivo mutuamente, com o compilador descobrindo o que é necessário.

Definição

Uma abstração lambda representa uma função sem nome. Esta é uma fonte de inconsistência na definição de uma abstração lambda. No entanto, abstrações lambda podem ser compostas para representar uma função com um nome. Neste formulário, a inconsistência é removida. O termo lambda,

é equivalente a definir a função por na expressão , que pode ser escrita como a expressão let ;

A expressão let é compreensível como uma expressão de linguagem natural. A expressão let representa a substituição de um valor por uma variável. A regra de substituição descreve as implicações da igualdade como substituição.

Vamos definição em matemática

Em matemática, a expressão let é descrita como a conjunção de expressões. Em linguagens funcionais, a expressão let também é usada para limitar o escopo. Em matemática, o escopo é descrito por quantificadores. A expressão let é uma conjunção dentro de um quantificador existencial.

onde E e F são do tipo Booleano.

A expressão let permite que a substituição seja aplicada a outra expressão. Essa substituição pode ser aplicada dentro de um escopo restrito, a uma subexpressão. O uso natural da expressão let está em aplicação a um escopo restrito (chamado de eliminação de lambda ). Essas regras definem como o escopo pode ser restrito;

onde F não é do tipo Boolean . Desta definição, a seguinte definição padrão de uma expressão let, conforme usada em uma linguagem funcional, pode ser derivada.

Para simplificar, o marcador que especifica a variável existencial,, será omitido da expressão onde é claro no contexto.

Derivação

Para derivar este resultado, primeiro suponha,

então

Usando a regra de substituição,

então para todos L ,

Deixe onde K é uma nova variável. então,

Então,

Mas a partir da interpretação matemática de uma redução beta,

Aqui, se y é uma função de uma variável x, não é o mesmo x que em z. A renomeação alfa pode ser aplicada. Portanto, devemos ter,

tão,

Este resultado é representado em uma linguagem funcional de forma abreviada, onde o significado é inequívoco;

Aqui, a variável x é implicitamente reconhecida como parte da equação que define x e a variável no quantificador existencial.

Sem levantamento de Boolean

Uma contradição surge se E for definido por . Nesse caso,

torna-se,

e usando,

Isso é falso se G for falso. Para evitar essa contradição, F não pode ser do tipo Booleano. Para o Booleano F, a declaração correta da regra de eliminação usa implicação em vez de igualdade,

Pode parecer estranho que uma regra diferente se aplique ao Boolean do que outros tipos. A razão para isso é que a regra,

só se aplica onde F é booleano. A combinação das duas regras cria uma contradição, portanto, onde uma regra é válida, a outra não.

Juntando expressões let

Deixe as expressões podem ser definidas com várias variáveis,

então pode ser derivado,

tão,

Leis relacionadas ao cálculo lambda e às expressões let

A redução Eta fornece uma regra para descrever abstrações lambda. Essa regra, juntamente com as duas leis derivadas acima, definem a relação entre o cálculo lambda e as expressões let.

Nome Lei
Equivalência Eta-redução
Equivalência Let-lambda (onde é um nome de variável.)
Deixe combinação

Deixe a definição definida a partir do cálculo lambda

Para evitar os problemas potenciais associados à definição matemática , Dana Scott originalmente definiu a expressão let do cálculo lambda. Isso pode ser considerado como a definição de baixo para cima, ou construtiva, da expressão let , em contraste com a de cima para baixo, ou definição matemática axiomática.

A expressão let simples e não recursiva foi definida como sendo um açúcar sintático para a abstração lambda aplicada a um termo. Nessa definição,

A definição simples da expressão let foi então estendida para permitir a recursão usando o combinador de ponto fixo .

Combinador de ponto fixo

O combinador de ponto fixo pode ser representado pela expressão,

Esta representação pode ser convertida em um termo lambda. Uma abstração lambda não suporta referência ao nome da variável, na expressão aplicada, então x deve ser passado como um parâmetro para x .

Usando a regra de redução eta,

dá,

Uma expressão let pode ser expressa como uma abstração lambda usando,

dá,

Esta é possivelmente a implementação mais simples de um combinador de ponto fixo no cálculo lambda. No entanto, uma redução beta fornece a forma mais simétrica do combinador Y de Curry.

Expressão let recursiva

A expressão let recursiva chamada "let rec" é definida usando o combinador Y para expressões let recursivas.

Expressão let mutuamente recursiva

Essa abordagem é então generalizada para oferecer suporte à recursão mútua. Uma expressão let mutuamente recursiva pode ser composta reorganizando a expressão para remover quaisquer condições e. Isso é obtido substituindo várias definições de função por uma única definição de função, que define uma lista de variáveis ​​igual a uma lista de expressões. Uma versão do combinador Y, chamado combinador de ponto fixo polivariadico Y *, é então usada para calcular o ponto fixo de todas as funções ao mesmo tempo. O resultado é uma implementação mutuamente recursiva da expressão let .

Valores múltiplos

Uma expressão let pode ser usada para representar um valor que é membro de um conjunto,

Sob a aplicação da função, de uma expressão para outra,

Mas uma regra diferente se aplica para aplicar a expressão let a si mesma.

Parece não haver uma regra simples para combinar valores. O que é necessário é uma forma geral de expressão que representa uma variável cujo valor é membro de um conjunto de valores. A expressão deve ser baseada na variável e no conjunto.

A aplicação da função aplicada a este formulário deve fornecer outra expressão no mesmo formulário. Desta forma, qualquer expressão em funções de valores múltiplos pode ser tratada como se tivesse um valor.

Não é suficiente que o formulário represente apenas o conjunto de valores. Cada valor deve ter uma condição que determina quando a expressão assume o valor. A construção resultante é um conjunto de pares de condições e valores, denominado "conjunto de valores". Veja o estreitamento dos conjuntos de valores algébricos .

Regras para conversão entre cálculo lambda e expressões let

Serão fornecidas meta-funções que descrevem a conversão entre as expressões lambda e let . Uma metafunção é uma função que recebe um programa como parâmetro. O programa são dados para o metaprograma. O programa e o metaprograma estão em metaníveis diferentes.

As seguintes convenções serão usadas para distinguir o programa do metaprograma,

  • Os colchetes [] serão usados ​​para representar a aplicação da função no metaprograma.
  • Letras maiúsculas serão usadas para variáveis ​​no metaprograma. Letras minúsculas representam variáveis ​​no programa.
  • será usado para iguais no metaprograma.

Para simplificar, a primeira regra dada que as correspondências serão aplicadas. As regras também presumem que as expressões lambda foram pré-processadas para que cada abstração lambda tenha um nome exclusivo.

O operador de substituição também é usado. A expressão significa substituir todas as ocorrências de G em L por S e retornar a expressão. A definição usada é estendida para cobrir a substituição de expressões, a partir da definição dada na página de cálculo Lambda . A correspondência de expressões deve comparar expressões para equivalência alfa (renomeação de variáveis).

Conversão de lambda para expressões let

As regras a seguir descrevem como converter de uma expressão lambda em uma expressão let , sem alterar a estrutura.

A regra 6 cria uma variável única V, como um nome para a função.

Exemplo

Por exemplo, o combinador Y ,

é convertido para,

Regra Expressão lambda
6
4
5
3
8
8
4
2
1

Conversão de expressões let para lambda

Essas regras revertem a conversão descrita acima. Eles convertem de uma expressão let em uma expressão lambda, sem alterar a estrutura. Nem todas as expressões let podem ser convertidas usando essas regras. As regras pressupõem que as expressões já estão organizadas como se tivessem sido geradas por de-lambda .

Não há equivalente estrutural exato no cálculo lambda para expressões let que possuem variáveis ​​livres que são usadas recursivamente. Neste caso, alguma adição de parâmetros é necessária. As regras 8 e 10 adicionam esses parâmetros.

As regras 8 e 10 são suficientes para duas equações mutuamente recursivas na expressão let . No entanto, eles não funcionarão para três ou mais equações recursivas mutuamente. O caso geral precisa de um nível extra de loop, o que torna a metafunção um pouco mais difícil. As regras a seguir substituem as regras 8 e 10 na implementação do caso geral. As regras 8 e 10 foram deixadas para que o caso mais simples possa ser estudado primeiro.

  1. forma lambda - Converte a expressão em uma conjunção de expressões, cada uma na forma variável = expressão .
    1. ...... onde V é uma variável.
  2. lift-vars - Obtenha o conjunto de variáveis ​​que precisam de X como parâmetro, porque a expressão tem X como variável livre.
  3. sub-vars - Para cada variável no conjunto substitua-a pela variável aplicada a X na expressão. Isso torna X uma variável passada como um parâmetro, em vez de uma variável livre no lado direito da equação.
  4. de-let - Eleve cada condição em E para que X não seja uma variável livre no lado direito da equação.

Exemplos

Por exemplo, a expressão let obtida do combinador Y ,

é convertido para,

Regra Expressão lambda
6
1
2
3
7
4
4
5
1
2
3
4
5

Para um segundo exemplo, pegue a versão elevada do combinador Y ,

é convertido para,

Regra Expressão lambda
8
7
1, 2
7, 4, 5
1, 2

Para um terceiro exemplo, a tradução de,

é,

Regra Expressão lambda
9
1
2
7
1
2

Pessoas chave

Veja também

Referências