No -calculus, podemos codificar aritmética, números, booleanos e até calcular fatoriais de números, como mostrado aqui .
Existe codificação de "for" ou "while"?
No -calculus, podemos codificar aritmética, números, booleanos e até calcular fatoriais de números, como mostrado aqui .
Existe codificação de "for" ou "while"?
Respostas:
Certo! Deixe-me mostrar como codificar FOR usando um exemplo.
Suponha que desejemos traduzir um fator FOR simples para o programa
Reescrevemos como
então colocamos todas as variáveis que usamos em uma tupla (um par é suficiente, aqui)
Isso efetivamente aplica a função para o par inicial por vezes.λ⟨x,i⟩.⟨x∗i,i+1⟩ ⟨1,1⟩ N
Como pode ser representado como um numeral da Igreja, obtemosN
A sintaxe acima usa algumas coisas além do cálculo lambda simples. Números e aritmética podem ser feitos com precisão usando números da Igreja. Os pares também têm sua própria codificação da Igreja:
Se você tiver mais de duas variáveis, poderá generalizar a codificação acima para tuplas ou simplesmente representar tuplas como pares aninhados.
QUANDO é melhor lidar com o uso de recursão: em vez de
Onde
p
é um predicado ef
é uma função (parcial), podemos usar algo comoNo cálculo lambda, a recursão é obtida usando um combinador de ponto fixo , por exemplo, da Igreja ou Turing . Temos algo comoY Θ
onde supor que os booleanos sejam codificados pela Igreja.if b then t else e≡bte
Observe também que WHILE é (estritamente) mais poderoso que FOR. Todo FOR pode ser codificado como WHILE, portanto, essa técnica de codificação também pode ser usada para FOR.
fonte
Existem codificações de loops, mas elas não funcionam exatamente como os loops com os quais você está acostumado, porque o cálculo lambda não é uma linguagem imperativa. O cálculo lambda não tem efeitos colaterais (é uma linguagem puramente funcional ); portanto, o equivalente exato de um loop seria inútil.
Estado explícito
Um programa imperativo pode ser traduzido para uma linguagem puramente funcional, passando todo o estado explicitamente como uma variável no programa. Vou usar a sintaxe Python para pseudocódigo imperativo; ele deve ser transparente na maior parte, com a indicação de que
(a, b) = f(…)
os meios que a chamada para a funçãof
retorna um par ea
eb
são atribuídas do primeiro e segundo componente do par, respectivamente. Considere um loopVamos tornar o estado explícito.
Podemos traduzir isso em uma chamada recursiva.
def loop(state):
define uma função chamadaloop
.Isso usa apenas os seguintes conceitos, todos os quais podem ser expressados facilmente no cálculo lambda:
E assim podemos definir umaC B
while
função para uma condição ( ) e um corpo ( ):test_condition
do_stuff
Os loops variam dependendo da linguagem de programação, mas são sempre um caso especial de loops while, para que possam ser codificados da mesma maneira. Se o idioma de origem limitar a expressividade dos loops for, pode haver codificações mais simples. Por exemplo, “repetir vezes” é simplesmente composição da função vezes, onde a função é a transformação de estado que constitui o corpo do loop, e se é um numeral da Igreja, isso simplesmente se aplica à função do corpo do loop.n n n n
Adicionando estado ao idioma
Uma abordagem alternativa ao estado é estender o cálculo lambda com primitivas de manipulação de estado. Se você fizer isso, a ordem da avaliação se tornará importante. Nesse caso, um loop while pode ser expresso diretamente com recursão.
fonte