Eu estava assistindo a palestra de Jim Weirich, intitulada ' Aventuras em programação funcional '. Nesta palestra, ele introduz o conceito de combinadores Y, que essencialmente encontra o ponto fixo para funções de ordem superior.
Uma das motivações, como ele menciona, é ser capaz de expressar funções recursivas usando o cálculo lambda, para que a teoria de Church (qualquer coisa que seja efetivamente computável possa ser computada usando o cálculo lambda) permaneça.
O problema é que uma função não pode se chamar simplesmente, porque o cálculo lambda não permite funções nomeadas, ou seja,
não pode ostentar o nome ' ', deve ser definido anonimamente:
Por que é importante que o cálculo lambda tenha funções que não são nomeadas? Qual princípio é violado se houver funções nomeadas? Ou será que eu apenas entendi errado o vídeo de jim?
fonte
Respostas:
O principal teorema sobre esse assunto é devido a um matemático britânico do final do século XVI, chamado William Shakespeare . Seu artigo mais conhecido sobre o assunto, intitulado " Romeu e Julieta ", foi publicado em 1597, embora o trabalho de pesquisa tenha sido realizado alguns anos antes, inspirado, mas precursores como Arthur Brooke e William Painter.
Seu principal resultado, afirmado no Ato II. Cena II , é o famoso teorema :
Esse teorema pode ser entendido intuitivamente como "nomes não contribuem para o significado".
A maior parte do artigo é dedicada a um exemplo que complementa o teorema e mostra que, embora os nomes não contribuam com significado, eles são a fonte de problemas sem fim.
Conforme apontado por Shakespeare, os nomes podem ser alterados sem alterar o significado, uma operação que mais tarde foi chamada de conversão por Alonzo Church e seus seguidores. Como conseqüência, não é necessariamente simples determinar o que é indicado por um nome. Isso levanta uma variedade de questões, como o desenvolvimento de um conceito de ambiente em que a associação nome-significado é especificada e regras para saber qual é o ambiente atual quando você tenta determinar o significado associado a um nome. Isso confundiu os cientistas da computação por um tempo, dando origem a dificuldades técnicas, como o infame problema de Funargα . Os ambientes continuam sendo um problema em algumas linguagens de programação populares, mas geralmente é considerado fisicamente inseguro mais específico, quase tão letal quanto o exemplo elaborado por Shakespeare em seu artigo.
Essa questão também se aproxima dos problemas levantados na teoria da linguagem formal , quando alfabetos e sistemas formais precisam ser definidos até um isomorfismo , de modo a ressaltar que os símbolos dos alfabetos são entidades abstratas , independentemente de como elas "se materializam". elementos de algum conjunto.
Esse importante resultado de Shakespeare mostra também que a ciência estava divergindo da magia e da religião, onde um ser ou um significado pode ter um nome verdadeiro .
A conclusão de tudo isso é que, para o trabalho teórico, muitas vezes é mais conveniente não ser sobrecarregado por nomes, embora possa parecer mais simples para o trabalho prático e a vida cotidiana. Mas lembre-se de que nem todo mundo chamado mamãe é sua mãe.
Nota :
A questão foi abordada mais recentemente pelo lógico americano do século 20, Gertrude Stein . No entanto, seus colegas matemáticos ainda estão ponderando as implicações técnicas precisas de seu principal teorema :
publicado em 1913 em uma comunicação curta intitulada "Emily Sagrada".
fonte
Gostaria de arriscar uma opinião diferente da de @babou e @YuvalFilmus: é vital que o -calculus puro tenha funções anônimas. O problema de ter apenas funções nomeadas é que você precisa saber com antecedência quantos nomes precisará. Mas no -calculus puro, você não tem um limite a priori do número de funções usadas (pense em recursão); portanto, você usa (1) funções anônimas ou (2) segue a rota -calculus e fornece um novo combinador de nomes ( in -calculus) que fornece um suprimento inesgotável de novos nomes em tempo de execução.λ λ π νx.P π
A razão pela qual -calculus puro não possui um mecanismo explícito de recursão é que o -calculus puro foi originalmente planejado para ser um fundamento da matemática por A. Church, e a recursão torna esse fundamento trivialmente doentio. Então, foi um choque quando Stephen Kleene e JB Rosser descobriram que o puro é inadequado como fundamento da matemática ( paradoxo Kleene-Rosser ). Haskell Curry analisou o paradoxo de Kleene-Rosser e percebeu que sua essência é o que hoje conhecemos como Y-Combinator.λ λ λ
Adicionado após o comentário de @ babou: não há nada errado em ter nomeado funções. Você pode fazer o seguinte: é uma abreviação de na chamada por valor -calculus.letf=MinN (λf.N)M λ
fonte
Acredito que a ideia é que nomes não sejam necessários. Tudo o que parece exigir nomes pode ser escrito como funções anônimas.
Você pode pensar no cálculo lambda como linguagem assembly. Alguém em uma palestra sobre montagem pode dizer "Não há árvores de herança orientadas a objetos na linguagem assembly". Você pode então pensar em uma maneira inteligente de implementar árvores de herança, mas esse não é o ponto. O ponto é que as árvores de herança não são necessárias no nível mais básico de como um computador físico é programado.
No cálculo lambda, o ponto é que os nomes não são necessários para descrever um algoritmo no nível mais básico.
fonte
Estou gostando das três respostas aqui até agora - principalmente a análise de Shakespearen de @bouou -, mas elas não esclarecem o que eu acho que é a essência da pergunta.
O cálculo λ liga nomes a funções sempre que você aplica uma função a uma função. A questão não é a falta de nomes.
"O problema é que uma função não pode se chamar simplesmente" referindo-se ao seu nome.
(No Lisp puro, a ligação name -> function não está no escopo dentro do corpo da função. Para que uma função se chame por seu nome, a função precisaria se referir a um ambiente que se refere à função. Pure Lisp não tem estruturas de dados cíclicas. O Impure Lisp o faz mutando o ambiente ao qual a função se refere.)
Como @MartinBerger apontou, a razão histórica pela qual o λ-cálculo não permite que uma função se chame pelo nome foi uma tentativa de descartar o paradoxo de Curry ao tentar usar o λ-cálculo como base da matemática, incluindo a lógica dedutiva. Isso não funcionou, já que técnicas como o combinador Y permitem recursão mesmo sem auto-referência.
Da Wikipedia:
fonte
λ.x x x
traduz para Lisp como(lambda (x) (x x))
e para JavaScript comofunction (x) {return x(x);}
.x⇒y
significax implies y
, aproximadamente o mesmo que(NOT x) OR y
. Veja en.wikipedia.org/wiki/Lambda_calculus