620 likes | 801 Views
CÁLCULO LAMBDA. Base da programação funcional e um modelo alternativo de computabilidade. Inventor: Alonzo Church. Modelos de Computabilidade. Máquina de Turing (Alain Turing- 1936) Lambda cálculo (Alonzo Church - 1936) Linguagens While (Michael Arbib-1982)
E N D
CÁLCULO LAMBDA Base da programação funcional e um modelo alternativo de computabilidade. Inventor: Alonzo Church
Modelos de Computabilidade • Máquina de Turing (Alain Turing- 1936) • Lambda cálculo (Alonzo Church - 1936) • Linguagens While (Michael Arbib-1982) Alan Turing provou em 1937 a equivalência entre uma Máquina de Turing e o Cálculo Lambda em termos de computabilidade
A. Church, Washington1903 Doutor pela Universidade de Princepton. Após seu doutoramento foi para Harvard trabalhar com Birkhoff e Huntington. E foi nesta época em que Birkhoff e ele tiveram discussões que resultaram na Teoria das Categorias como a conhecemos hoje. Trabalhou até 1990 quando com oitenta e sete anos parou de dar aulas mas continuou a orientar alguns pesquisadores selecionados, Turing tendo sido um de seus doutorandos.
Programaçãp Funcional (1/2) • A maioria das Linguagens de Programação Funcional são semelhantes e diferem somente em aspectos sintáticos. O Cálculo lambda pode ser considerado como a ferramenta mais adequada a escrever programas usando o paradigma funcional. Neste paradigma, em que a solução de um problema é considerada como sendo implementar uma função, usa nesta implementação um conjunto de primitivas e regras de construir novas funções a partir destas primitivas.
Programação Funcional (2/2) • Interessantes pela sua simplicidade sintática • Facilidade de escrever problemas recursivos. • Maioria das implementações são poucos aceitas devido à ineficiência em comparação com linguagens de programação comuns. • Novas implementações de interpretadores e/ou compiladores e novas linguagens mais modernas tem surgido.
Exemplos de Linguagens Funcionais - LISP (LISt Processing - década de 60). Muito simples em muitos aspectos. É a mais utilizada devendo continuar por muito tempo. - Miranda (Turner 1985) - Haskell (1990) - Orwell (Wadler 1985) - Outras: ML, KRC, LML, SASL.
Sintaxe do Cálculo Lambda O cálculo lambda pode ter sua sintaxe definida como um sistema formal.
Termos do Cálculo Lambda • A linguagem do cálculo lambda usa um alfabeto S constituído de: • - um conjunto de variáveis: vo, v1, v2,....vn.... • - abstrator l(lambda) • - agrupadores (,) • Ao conjunto de cadeias finitas sobre S denota-se por S* e a cadeia que não contem elementos por e. Usam-se as variáveis x, y, z, ... para denotar cadeias de S*
Cadeias de Símbolos: definições • Definição(Equivalência de duas cadeias) • Duas cadeias x e y são equivalentes e se escreve (x,y) Eq x = y • Definição (Comprimento de uma cadeia) • É uma função: • : S* Z+ • em que o número inteiro exprime o número de elementos da cadeia.
Termo Lambda: definição • Um termo lambda, denotado pelas letras M, N, O, P,.. é um elemento da linguagemL, ondeS* L definido da seguinte forma: • - vi é termo lambda; • - dado M, (lvi M) é termo lambda; • - dados dois termos lambda M, N então (MN) é termo lambda; • - e nada mais é termo lambda.
Exemplos de Termos lambda • Verificar quais das expressões abaixo são termos lambda, justificando sua resposta: • vo • (vov1) • (vo) • (lvo(vov1)) • (lv1(vo(lv1(vov1)))) • (lvo(vov1)
Notacão Lambda Simplificada • 1-Precedência a esquerda. ((MN)L) MNL • 2-Sucessão de abstratores: • Assim (lx(ly(lz........))) lxyz... • 3-Separador: usa-se um ponto para designar o final de uma lista de argumentos lambda • Assim lx.xly.y (lx(x(ly.y))) • 4-Supõe-se que letras diferentes designam entidades diferentes. • Assim x ¹ y em lx.y
Semântica Operacional do Cálculo l Até agora foi descrita a sintaxe do cálculo-l. Sua semântica operacional diz como um programa Lambda opera, isto é, calcula.
O Porque da Semântica: • Para chamá-lo de "cálculo'', deve-se porém dizer como "calcular'' com ele. Basicamente isto é realizado através de três regras de conversão, que descrevem como converter uma expressão-l em outra que lhe seja equivalente. • Mostra também como se introduzem os argumentos a serem usados como dados do programa.
Programa Lambda • Um programa Lambda se escreve como um conjunto de expressões lambda. Normalmente, usando notação simplificada encontra-se o símbolo lambda seguido de lista de variáveis. limitando estas variáveis vem um ponto ".'' seguido pelo corpo da função. As variáveis são chamadas de parâmetros formais e diz-se que o lambda os liga. Exemplo: xy.(+ x y)
Programa Lambda • Os dados são escritos logo depois da função lambda, como uma lista e são consumidos durante a operação do programa. • Exemplos: • > (xy. (y x)) dia bom • > (xy. (+ x y)) 3 6 • > (xy. (x y z)) 3 1 4 5
Executar Programa Lambda • Para executar um programa lambda é suficiente dar valores às variáveis lambda. Assim tem-se: • xy.(+ x y) 3 4 • y.(+ 3 y) 4 • (+ 3 4) • 7 • Nota: geralmente operadores são pré-fxados. Isto na realidade é uma conversão de uma expressão em uma mais simples. Há 3 tipos de conversão.
Funções embutidas • Funções embutidas como + não existem no cálculo lambda na sua forma mais pura. Para fins práticos, uma extensão que as suporte é útil. Estas incluem funções aritméticas (como +, -, *, /), constantes (como 0, 1,...), funções lógicas (como E, OU, NÃO,...), constantes lógicas (VERDADE, FALSO), manipulação de listas (PRIMEIRO, CAUDA, CONSTRUA, IGUAL) e reconhecedoras de listas (ATOM).
Avaliação de programa lambda • A avaliação ocorre através da seleção repetida de uma expressão redutível (redex) e de sua redução. Expressão redutível é aquela que pode ser avaliada imediatamente. No exemplo : • (+ (* 5 6) (* 8 3)) • Que são: (* 5 6) e (* 8 3) • A escolha do primeiro redex para redução fornece: • (+ (* 5 6) (* 8 3)) -> (+ 30 (* 8 3)) • Do qual resulta: (+ 30 24) -> 54
Regras de Conversão • Introdução à -conversão: Variáveis atadas e livres • Conversão-Alfa () • Conversão-Beta (ß) • Conversão-Eta () • Provas de Interconvertibilidade
Variáveis atadas e livres(1/2) • Seja a expressão-l: (lx. + x y) 4 • Para avaliar esta expressão é necessário: • saber o valor "global'' de y. • não é necessário saber o valor global de x, pois é o parâmetro formal da função. • x ocorre atado pelo lx, y não é atado por nenhum e assim ocorre livre na expressão.
Variáveis atadas e livres (2/2) • .A ocorrência de uma variável é atada se há uma expressão-l envolvente que a amarra, senão é livre. • No exemplo a seguir, x e y ocorrem atados, z porém, ocorre livre: • lx. + ((ly. + y z) 7) x • Observe que os termos atado e livre se referem a ocorrências específicas da variável em uma expressão. Note ainda que x é atado mas não sabe-se seu valor para calcular a expressão-l.
Conversão Alfa • Usa a a-congruência: duas expressões-l M e N são a-congruentes (ou a-equivalentes), denotado por M N se ou • M = N ou • MN, ou • N é obtido de M através da reposição de uma sub-expressão S de M por uma expressão-l T tal que S T, ou existe alguma expressão-l, R tal que M R e R N.
Exemplo 1: Nomes de parâmetros formais podem não ser únicos: (lx.( lx. + (- x 1)) x 3) 9 (lx. + (- x 1)) 9 3 + (- 9 1) 3 11 Exemplo 2: (lxy.+ x ((lx.- x 3) y)) 5 6 (ly.+ 5 ((lx.- x 3) y)) 6 + 5 ((lx.- x 3) 6) + 5 (- 6 3) 8 Conversão Alfa: exemplos
Exemplo 3: (lx. (ly. - y x)) 4 5 (ly. - y 4) 5 - 5 4 1 Exemplo 4: Crie um exemplo semelhante aos 3 anteriores. Conversão Alfa: exemplos
Conversão beta • Conversão beta consiste na substituição de uma variável ligada pelo valor que foi justaposto `a definição da função. • Exemplo: (lx. + x 1) 4 + 4 1 5
O parâmetro formal pode ocorrer várias vezes no corpo: (lx. + x x) 5 + 5 5 10 Pode não haver ocorrências do parâmetro formal no corpo. Ex: (lx. 3) 5 3 Nada a converter! Conversão Beta Uma variável pode possuir tanto uma ocorrência atada como uma livre em uma expressão. Considere o exemplo: + x ((lx. + x 1) 4) Aqui x ocorre livre (a primeira vez) e atada (a segunda).
Conversão eta • Sejam: (lx. + 1 x) e (+ 1). Estas expressões se comportam exatamente da mesma maneira, quando aplicadas a um argumento: ambas adicionam 1 ao argumento. Conversão-z é o nome dado à regra que expressa essa equivalência. Assim: (lx. + 1 x) -> (+ 1) Formalmente: (lx. F x) -> F desde que x não ocorra livre em F e F denote uma função.
Conversão eta A condição de que x não deve ocorrer livre em em F previne conversões errôneas. Exemplo: (lx. + x x) não é e-conversível para (+ x) pois x ocorre livre em (+ x). Os dois x são ligados. Assim: • (lx. + x x) 5 ( + 5 5) 10
Funções Recursivas • No Cálculo lambda as funções não tem nomes. • Cálculo lambda é a base da programação funcional. • Um dos mecanismos mais importantes usados em programação funcional é a recursividade. • Recursividade exige que se nomeie funções para que possam ser referenciadas. • E agora? (Fico vermelho de vergonha!)
Recursividade: exemplo introdutório • Suponha existir a primitiva SE com duas direções e seja a abstração: • (xn. SE (= n 0) (1) (* n x (-n 1))) • Vamos dar o nome de FAC à aplicação desta abstração à FAC; tem-se: • FAC = (xn. SE (= n 0) (1) (* n x (-n 1))) FAC = (n. SE (= n 0) (1) (* n FAC (-n 1))) • Que é a definição recursiva desejada.
Transformação ao inverso Se já fosse disponível a definição recursiva: • Seja F = (x …. F….) • Usando Transformação ao contrário: • F = (f … (x . f….))F • Ou: F = H F onde H = (f … (x . f….)) F é dito ponto fixo de H
Combinador de Ponto Fixo Para isto, invente-se, a título provisório, uma função Y, a qual toma uma função como argumento e devolve o seu ponto fixo como resultado. Logo será: YH = F Substituindo F por YH em F = H F tem-se: YH = H (YH) Esta é uma definição não recursiva de F!
Exercício: Fac 1 • FAT = Y H onde: • H = (fat. n. SE (= n 0) 1 (* n (fat (- n 1)))) • Assim: FAT 1 • Y H 1 • H (Y H) 1 • (fat. n.SE (= n 0) 1 (* n (fat (- n 1))))(Y H) 1 • ( n.SE (= n 0) 1 (* n (Y H (- n 1)))) 1 • SE (= 1 0) 1 (* 1 (Y H (- 1 1))) • * 1 (Y H 0) = * 1 (H (Y H) 0) • = * 1 ((fat.n.SE (= n 0)1(* n(fat(- n 1))))(Y H) 0) • * 1 ((n.SE (= n 0) 1 (* n (Y H (- n 1)))) 0) • * 1 (SE (= 0 0) 1 (* n (Y H(- 0 1)))) • 1
E se estas coisas fossem usadas em uma linguagem real? Esta linguagem existe e é LISP! LISP é linguagem velha: tem 40 anos... Mas LISP se mantem jóvem pois LISP é estensível, suporta programação objeto e icônica!
Noções de lisp Lisp: LISp Processing
Qual a razão de conhecer LISP? • Segundo McDermot e Charniac a razão ér a mesma de aprender francês se vai estudar na França: é a lingua natural falada pelos franceses! • Será isto ainda verdade? • Nem tanto, mas... Será a Programação Funcional?
Razões para usar LISP (1/4) • LISP é uma linguagem funcional pobre, mas raros são os profissionais de IA que escolhem LISP por suas características funcionais. Exatamente por esta razão ela é pobre em termos funcionais: juntam-se outras facilidades que mascaram o estilo funcional puro!
Razões para usar LISP (2/4) • LISP é estensível e se não se gosta de um interface oferecido é fácil criar outro. • LISP tem programa e dados com a mesma estrutura de dados: listas. Logo, um programa pode facilmente ler a ele mesmo, modificar-se durante a execução e continuar funcionando modificado sem interrupção: isto é, torna-se fácil implementar algoritmos de aprendizado.
Razões para usar LISP (3/4) • Estruturas de dados são facilmente manipuladas em LISP. • Por exemplo: • A pilha é a própria lista; • Existem primitivas para ler, juntar novo elemento na pilha, etc. • Árvores são implementadas como listas de listas., s3endo fácil percorrê-las e modificá-las.
Razões para usar LISP (4/4) • É fácil aprender LISP e seu aprendizado ajuda a desenvolver capacidades mentais. Foi exatamente acreditando nisto que Papert, criou no MIT a linguagem LOGO, subconjunto de LISP, com ênfase gráfica, para uso do aprendizado de crianças. As experiências tem sido animadoras. E como nasceu esta linguagem?
Lisp: Nota histórica (1/3) • John McCarthy vinha trabalhando há anos em uma linguagem que fosse, como provado por Turing, equivalente à sua máquina. Em 1960, dando aula no MIT demonstrou que a função “eval” era capaz de simular a máquina de Turing, resultado teórico de grande valor.
Lisp: Nota histórica (2/3) • Um dos alunos de John McCarthy, Steve Russel comentou: “sendo verdade este teorema, basta implementar “eval” e teremos a Máquina de Turing”, ao que McCarthy contestou “Não confunda teoria com prática, este é um resultado teórico, para ter valor prático tem de percorrer um longo caminho”.
Lisp: Nota histórica (3/3) • Russel não se satisfez. Implementou “eval” e algumas outras funções em Máquina IBM704, apresentou seu trabalho e assim nasceu Lisp, linguagem fruto do espírito prático de aluno com grande conhecimento teórico. Guarda ainda hoje lembranças do passado: car: “contents of address register; cdr: “contents of decrement register; • Símbolos do assembler do IBM704.
Sintaxe de Lisp • Vocabulário de Lisp: • Atomos: elementos indivisíveis, podendo ser: • Números; ex: 1, 13, 15, -.35, etc. • Identificadores: sequencias de letras e números; ex: Lisa, Jane1, fibo, etc. • Identificadores reservados: +, -, /, *, car, cdr, etc. • Delimitadores: (,)