O cálculo lambda não parecia abstrato. E eu não consigo ver o objetivo disso

18

A questão subjacente:

O que o cálculo lambda faz por nós que não podemos fazer com as propriedades básicas da função e notação geralmente aprendidas na álgebra do ensino médio?

Antes de tudo, o que significa abstrato no contexto do cálculo lambda? Minha compreensão da palavra abstrato é algo que está separado da maquinaria, o resumo conceitual de um conceito.

No entanto, as funções lambda, eliminando os nomes das funções, impedem um certo nível de abstração. Por exemplo:

f(x) = x + 2
h(x, y) = x + 5 y

Mas mesmo sem definir o mecanismo dessas funções, podemos facilmente falar sobre sua composição. Por exemplo:

1. h(x, y) . f(x) . f(x) . h(x, y) or 
2. h . f . f . h

Podemos incluir os argumentos, se quisermos, ou podemos abstrair completamente para dar uma visão geral do que está acontecendo. E podemos reduzi-los rapidamente a uma única função. Vejamos a composição 2. Posso ter camadas de detalhes dos alunos com as quais posso escrever, dependendo da minha ênfase:

g = h . f . f . h
g(x, y) = h(x, y) . f(x) . f(x) . h(x, y)
g(x, y) = h . f . f . h = x + 10 y + 4

Vamos executar o acima com cálculo lambda, ou pelo menos definir as funções. Não sei se isso está certo, mas acredito que a primeira e a segunda expressões aumentam em 2.

(λuv.u(u(uv)))(λwyx.y(wyx))x

E multiplicar por 5y.

(λz.y(5z))

Em vez de ser abstrato, isso parece entrar no próprio mecanismo do que significa somar, multiplicar etc. Abstração, na minha opinião, significa nível superior, e não inferior.

Além disso, estou lutando para ver por que o cálculo lambda é mesmo uma coisa. Qual é a vantagem de

(λuv.u(u(uv)))(λwyx.y(wyx))x

sobre

h(x) = x + 5 y

ou uma notação combinada

Hxy.x+5y

ou até a notação de Haskell

h x y = x + 5 * y

Novamente, o que o cálculo lambda faz por nós que não podemos fazer com as propriedades da função f (x) e a notação com as quais muitos estão familiarizados.

JDG
fonte
9
É engraçado que você dê um exemplo de Haskell, pois Haskell é baseado no cálculo lambda. O cálculo Lambda não se refere a nenhuma notação específica. É um modelo computacional, equivalente às máquinas de Turing, no qual "tudo é uma função".
Yuval Filmus
2
Sim, disseram-me que é baseado no cálculo lambda. A pergunta que eu ainda tenho que ver respondida de uma maneira que faz sentido para mim é por que o haskell se baseia no cálculo lambda em vez de apenas. . . os atributos básicos das funções que aprendi na escola primária. Essa é realmente a essência de toda essa questão.
JDG
6
Não é "nenhum propósito imediatamente vem à mente" quase a definição de "abstrato"? :-)
David Richerby
1
Eu não diria que é depreciativo. Esse tratamento de funções é útil através do cálculo. Mas posso ver como ser rotulado como ensino médio poderia ser assim interpretado. Eu vou ajustá-lo.
JDG
6
Duvido que você realmente tenha uma definição formal de "notação de função de álgebra no ensino médio". Se você tem alguma definição para tais funções, é provavelmente o conjunto teórico que não tem significado computacional. Parte do objetivo do cálculo lambda é entender essa notação em seus próprios termos e, ouso dizer, abstraída de aplicações particulares como funções polinomiais ou cálculo.
Derek Elkins saiu de SE

Respostas:

24

Existem muitas razões pelas quais o cálculo lambda é tão importante.

Uma razão muito importante é que o cálculo lambda nos permite ter um modelo de computação no qual as funções computáveis ​​são cidadãos de primeira classe.

Não se pode expressar funções de ordem superior na linguagem da álgebra do ensino médio.

Tome como exemplo a expressão lambda

λf.λg.λx.f(g(x))

Essa expressão simples nos mostra que, dentro do cálculo lambda, a composição da função é ela própria uma função. Na álgebra do ensino médio, isso não é facilmente expresso.

No cálculo lambda, é muito fácil expressar que uma função retornará uma função como resultado.

Aqui está um pequeno exemplo. A expressão (onde eu assumo aqui um cálculo lambda aplicado com adição e constantes inteiras)

(λf.λg.λx.f((g(x)))(λx.x+2)

reduzirá para

λg.λx.g(x)+2

Observe também que dentro do cálculo lambda, funções são expressões e não definições da forma . Isso nos liberta da necessidade de nomear funções e distinguir entre uma categoria sintática de expressões e uma categoria sintática de definições.f(x)=e

Além disso, quando se torna impossível (ou apenas notadamente complicado) expressar funções de ordem superior, também se pode ter problemas ao atribuir tipos a expressões.

A composição da função possui o tipo polimórfico

α.β.γ.(βγ)((αβ)γ)

no sistema do tipo Hindley-Milner.

Um ponto de venda muito forte para o cálculo lambda é precisa a noção de cálculo lambda digitado . Os vários sistemas de tipos para linguagens de programação funcional, como Haskell e a família ML, são baseados em sistemas de tipos para cálculos lambda, e esses sistemas de tipos fornecem fortes garantias na forma de teoremas matemáticos:

Se um programa é bem digitado e e reduzido ao e ' residual , então e ' também será bem digitado.eeee

E se for bem digitado, e não exibirá certos erros.ee

As provas como correspondência de programas são particularmente dignas de nota. O isomorfismo de Curry-Howard (veja, por exemplo, https://www.rocq.inria.fr/semdoc/Presentations/20150217_PierreMariePedrot.pdf ) mostra que existe uma correspondência muito precisa entre o cálculo lambda simplesmente digitado e a lógica proposicional intuicionista: para todo tipo corresponde uma fórmula lógica φ T . Uma prova de & Phi T corresponde a uma duração de lambda com tipo T , e uma redução do efeito de beta do Isto corresponde prazo para realizar uma eliminação corte na prova.TϕTϕTT

Exorto aqueles que acham que a álgebra do ensino médio é uma boa alternativa ao cálculo lambda para desenvolver uma descrição da álgebra do ensino médio de ordem superior e tipicamente polimorficamente, juntamente com uma noção apropriada de isomorfismo de Curry-Howard. Se você puder mesmo elaborar um assistente de prova interativo baseado na álgebra do ensino médio que nos permita provar os muitos teoremas que foram formalizados usando assistentes de prova baseados em cálculo lambda, como Coq e Isabelle, isso seria ainda melhor. Eu começaria a usar álgebra no ensino médio e, tenho certeza, muitos outros comigo.

Hans Hüttel
fonte
Essa é uma ótima explicação. É útil ouvir que funções de ordem superior (como composição) e digitação são melhor representadas no cálculo lambda é encorajador, mais ainda que isso facilite provas e códigos prováveis. Não vejo as ramificações de muito do que você mencionou e por que a notação tradicional é inadequada (por exemplo, sobre não precisar de uma sintaxe de definição separada f (x) = e), no entanto, é útil que você nomeou alguns desses motivos e dá uma idéia de quais áreas são aprimoradas pelo cálculo lambda.
JDG 03/12
letx=eine(λx.e)e4
5

RR

As funções no cálculo lambda são muito mais gerais. A definição exata depende se o seu cálculo lambda é digitado ou não. No cálculo lambda puro e sem tipo, tudo é uma função. Isso é muito mais geral do que as funções reais do cálculo.

Mesmo linguagens procedurais às vezes usam idéias do cálculo lambda. A função de classificação em C aceita como parâmetro uma função de comparação , usada para comparar elementos. O cálculo do Lambda vai muito além - as funções não apenas aceitam funções como entradas, mas também podem produzi-las.

O cálculo Lambda é um modelo de cálculo equivalente em potência às máquinas de Turing. É um sistema completo em si mesmo. O cálculo lambda puro não tem "5" ou "+" como termos primitivos - eles podem ser definidos dentro do cálculo, assim como "5" e "+" não são primitivos da teoria dos conjuntos. (Linguagens de programação práticas implementam números naturais nativamente por razões de eficiência.)

Suspeito que uma das razões pelas quais você não esteja impressionado com o cálculo lambda é que suas idéias permeiam tanto o discurso da programação que ele não parece mais inovador.

Yuval Filmus
fonte
"Eu suspeito que uma das razões pelas quais você não está impressionado com o cálculo lambda" Therin está na pergunta que estou fazendo: O que o cálculo lambda faz por nós? Em outras palavras, quando não usamos o cálculo lambda, o que acontece. Quando usamos o cálculo lambda, o que ganhamos? Se o cálculo lambda foi a primeira vez que as pessoas pensaram, e se as funções pudessem criar funções, isso é impressionante? Entre meus programas python iniciais, havia textos contendo funções que avaliei mais tarde, como delegar a tarefa de tomada de decisão a outra pessoa. Parece óbvio?
amigos estão dizendo sobre jdg
isso foi antes de eu saber muita coisa. Eu apenas pensei que o código era irritante para digitar repetidamente e que a programação deveria me ajudar a gerar automaticamente a funcionalidade, incluindo as próprias funções.
JDG
2
Python suporta programação funcional. As primeiras linguagens de programação não. Se você tivesse programado no FORTRAN, não teria criado programas com texto contendo funções que você avaliou posteriormente. Mesmo sem perceber, você utilizou os recursos fornecidos pelas idéias do cálculo lambda.
Yuval Filmus
2
O Eval teve origem no LISP , que foi fortemente influenciado pelo cálculo lambda. Algo assim não é possível no FORTRAN, C, COBOL e em muitas outras linguagens de programação.
Yuval Filmus
Sim, o python suporta programação funcional --- mas não tenho certeza se a capacidade eval () foi inspirada no λCalc --- você não λCalc para pensar: eu quero gerar automaticamente um código que possa ser avaliado posteriormente. É como dizer que λCalc precisa pensar: "Vou dizer a Miranda para usar seu melhor julgamento sobre como administrar seu departamento" --- em outras palavras, conseguir uma função para gerar suas próprias funções. Você não precisa do λCalc para delegar tarefas de alto nível. Se você quiser falar sobre inspirando-se λCalc, é ponto mais apropriado para funções lambda, compreensões, etc.
JDG
4

x2xx2

λx.x2x2

ff(x)=x2f

O uso de expressões lambda em linguagens de programação tem uma vantagem semelhante; você pode escrever o que a função faz exatamente onde é necessário, em vez de precisar definir uma nova função em outro lugar do seu programa.

ddxx2ddxx2


θ:VV

θ(v)(f)=f(v)

Muitas pessoas acham essa notação de dupla avaliação confusa e / ou perturbadora, bem como esse uso recursivo da definição pontual de uma função. A versão de abstração lambda

θ=λv.λf.f(v)

não tem esse problema.


Finalmente, há um teorema de absurdo abstrato de que "simplesmente digitar lambda calculus" é basicamente a mesma coisa que "categoria fechada cartesiana" - portanto, se você quiser fazer cálculos em uma categoria fechada cartesiana, provavelmente é uma boa ideia usar simplesmente digitou o cálculo lambda para fazer isso.


fonte
Estou voltando a esta pergunta e estou achando ótima essa resposta. Obrigado. As respostas aqui em geral são realmente interessantes.
JDG #
4

Vou dizer de antemão que não sou especialista neste tópico, mas passei um pouco de tempo estudando-o e uma das coisas mais fascinantes para mim em qualquer tópico é a história por trás disso. Então, para mim, entender um pouco da história por trás do cálculo lambda ajuda a explicar por que é útil.

O breve resumo é que, no início dos anos 1900, depois que a teoria dos conjuntos começou a decolar e a matemática foi repensada com base em conjuntos, alguns matemáticos notaram que, embora uma definição de teoria dos conjuntos permita alegar que existe uma certa estrutura, eles não dizem como para construí-lo e calculá-lo. Portanto, as definições da teoria dos conjuntos não são construtivas . Os matemáticos começaram a se perguntar se havia uma maneira de desenvolver definições construtivas que iriam além de provar que algo é e, em vez disso, provar como é .

Da Wikipedia :

Em matemática, uma prova construtiva é um método de prova que demonstra a existência de um objeto matemático criando ou fornecendo um método para criar o objeto. Isso contrasta com uma prova não construtiva (também conhecida como prova de existência ou teorema da existência pura) que prova a existência de um tipo específico de objeto sem fornecer um exemplo.

Foi então mostrado que o cálculo lambda e a máquina de Turing poderiam representar qualquer função computável e, portanto, equivalentes.

Em teoria, qualquer função ou conceito matemático pode ser codificado na forma de cálculo lambda e computado. Isso significa que o cálculo lambda pode ser uma base completamente separada para a matemática, embora obviamente extremamente tediosa.

O cálculo lambda não é "útil" no sentido de que você não escreverá código usando-o, mas forma a base da semântica denotacional, usada para descrever programas e seus efeitos dinâmicos. Isso é usado nas discussões sobre a correção do programa e o significado semântico. Obviamente, também influenciou fortemente o desenvolvimento de linguagens de programação funcionais, que extraem todo o seu conceito de execução do cálculo lambda.

Espero que ajude.

Edite para adicionar: acabei de apontar para este artigo, mostrando a relação entre topologia, cálculo lambda e física. Percorrendo-o brevemente, deparei-me com esta afirmação fantástica:

Enquanto uma máquina de Turing pode ser vista como um modelo simplificado e idealizado de hardware de computador , o cálculo lambda é mais como um modelo simples de software . Poeticamente, o cálculo lambda descreve um universo onde tudo é um programa e tudo é dados: programas são dados .

O ponto é que o cálculo lambda é um modelo idealizado de computação de software e, como tal, não está vinculado a uma implementação específica em nenhuma linguagem de programação. Ele modela a computação pura .

Dave
fonte
Mais sobre história: Breve história do cálculo λ na Enciclopédia Stanford de Filosofia. Eles têm mais entradas do que se pode processar durante a vida.
David Tonhofer
3

λ

Aristu
fonte
3

O cálculo Lambda não foi projetado para ser uma linguagem de programação. De fato, foi criado na década de 1930, décadas antes de termos computadores programáveis. Pelo contrário, foi criado como um modelo formal para o estudo da computação. Se você está decepcionado com a facilidade com que ele expressa código ou funções matemáticas, é porque não é para isso que serve.

Andrew
fonte
1
"décadas antes de termos computadores programáveis" - errado. Os computadores programáveis ​​já existiam antes (se não os universais) e os primeiros computadores universais foram construídos na década de 1930.
Raphael
-2

O cálculo do Lambda existe para que funções anônimas (também conhecidas como lambda) possam ser criadas. Se você não acabar com os nomes das funções, o espaço para nome poderá ficar desordenado e pode-se ficar sem os nomes das funções disponíveis. Isso é especialmente importante ao lidar com as chamadas "funções de ordem superior" que retornam funções (ou indicadores de função) por razões óbvias.

Essencialmente, as funções lambda são equivalentes às variáveis ​​com escopo local. A programação funcional sem funções lambda é análoga à programação procedural sem nenhuma variável local, ou seja, uma péssima idéia.

"por que o cálculo lambda é mesmo uma coisa" os matemáticos adoram redundância. O cálculo lambda raramente é usado em matemática porque, como você descobriu, a notação não é muito útil.

"Se você puder trabalhar com um assistente de prova interativo baseado na álgebra do ensino médio que nos permita provar os muitos teoremas formalizados usando assistentes de prova baseados em cálculo lambda, como Coq e Isabelle, seria ainda melhor. comece a usar a álgebra do ensino médio e, tenho certeza, muitos outros comigo. " Você já ouviu falar de metamato? Nenhum cálculo lambda envolvido lá pode provar muitos dos teoremas coq / isabelle

sn
fonte
Além de algumas opiniões, o que essa resposta oferece?
Raphael
@Raphael Desinformação. A maior parte dessa resposta nem faz sentido. Não há escassez de nomes. "Funções Lambda" não são equivalentes a variáveis ​​com escopo local; isso nem faz sentido. Presumo que isso se refira let, mas, embora letpossa ser codificado com funções anônimas, você claramente não pode seguir o outro caminho. A programação funcional não requer "funções lambda", por exemplo, FP ou Sisal da Backus .
Derek Elkins saiu de SE
principalmente eu queria postar um comentário para a resposta de Hans, mas não tinha karma suficiente. então eu decidi transformar o comentário em uma resposta de pleno direito
sn