1 / 49

INE5363-Programação Funcional

INE5363-Programação Funcional. Prof. João Bosco da Mota Alves 2001/1 - INE/CTC/UFSC Bacharelado em Ciência da Computação. Ementa. Introdução O Paradígma de Programação Funcional A linguagem LISP O dialeto XLISPWIN Exemplo de Uso de XLISPWIN Linguagem funcional moderna: CLEAN

hide
Télécharger la présentation

INE5363-Programação Funcional

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. INE5363-Programação Funcional Prof. João Bosco da Mota Alves 2001/1 - INE/CTC/UFSC Bacharelado em Ciência da Computação

  2. Ementa • Introdução • O Paradígma de Programação Funcional • A linguagem LISP • O dialeto XLISPWIN • Exemplo de Uso de XLISPWIN • Linguagem funcional moderna: CLEAN • Cálculo Lâmbda (l - Calculus)

  3. Material didático • Notas de aula • OAKEY, S. Lisp para Micro. Rio de Janeiro, Editora Campus, 1986. • FRIEDMAN, D.; FELLEISEN, M. The Little LISPer (Third Edition). NJ, Macmllan Publishing, 1989. • GORDAN, G. J. Common LISP Hints (Adaptado para XLISPWIN ). Original • Software CLEAN, • STEELE, G. L. Common LISP: the Language. Digital Press, 1984.

  4. Introdução • Linguagens de programação • Visão geral • Pontos de vista • Implicações em eficiência/produtividade • Linguagem de programação como forma de comunicação entre o usuário e o computador

  5. Introdução Máquina Usuário Assembly Fortran

  6. Paradígmas de Programação • Procedimental ou Procedural • Assembly, Fortran, Pascal, ... • Orientado por Objeto • Smaltalk, C++, VisualAge, Java, Delphi, ... • Programação em Lógica • Prolog, Trilogy, Parlog, ... • Funcional • Lisp, Hugs, Clean, Haskel, ...

  7. Independência de Plataformas • Independência de plataforma • Não gerar código objeto direto • Gerar código C padrão • Compilar para máquina alvo • Vantagem • Código escrito uma única vez • Desvantagem • Trabalho adicional

  8. Paradígma de Programação Funcional • Estuda-se paradígmas de programação comparando-se com o procedimental, pois • Foi o primeiro paradígma • É o mais difundido • Há algo com o qual comparar-se • Faremos assim

  9. Paradígma de Programação Procedimental • Seqüência de comandos permite a transição de um estado da máquina a outro • Estado da máquina • Conjunto de valores que define a situação ou comportamento de um sistema • Exemplo • Estado1, (1, 2); estado2, (1, -4)

  10. Paradígma de Programação Procedimental • Transição de estado int fact(int n) { int x = 1; while (n > 0) { x = x * n; n = n - 1; } return x; } Um programa C

  11. Paradígma de Programação Procedimental

  12. Paradígma de Programação Procedimental • O conceito de estado está vinculado, implicitamente, ao paradígma de programação procedimental • Não possuindo significado explícito nos demais paradígmas

  13. Paradígma Funcional • Um programa é simplesmente uma função, ou expressão, daí o nome • Sua execução significa a avaliação dessa função • Comparando com o procedimental, onde f é a função (programa)

  14. Paradígma Funcional • Exemplo • O mesmo problema do fatorial de n, n! • Em linguagem funcional fatorial (n) = prod [1..n] • Veja que não faz sentido algum o conceito de estado da máquina

  15. Paradígma Funcional • Sob essa visão • Não há estados • Não há atribuições • Não há seqüência de comandos • Não há repetições • Mas há recursão e funções de alta ordem

  16. Paradígma Funcional • Pode parecer impraticável uma linguagem sem • Variáveis • Atribuições • Seqüência de comandos • Como visto aqui, isso não é verdade • Pelo contrário: facilita em muitos casos

  17. A linguagem LISP • Principais idéias que sustentam o paradígma de programação funcional, datam da década de 30 • Cálculo Lâmbda: um formalismo matemático criado por Alonzo Church • A mais antiga implementação foi LISP, desenvolvida por McCarthy na segunda metade da década de 50

  18. A linguagem LISP • Vamos às suas principais características • Tipos de dados • O átomo e a lista • É com apenas esses dois tipos de dados que se constroem as expressões-S, as estruturas basilares de LISP

  19. Exemplos de átomos • atom • É um átomo, pois é um string de caracteres que começa com a letra a. Nota: Em algumas implementações, escreve-se (quote atom), ou 'atom. • carnaval • É um átomo, pois é um string de caracteres que começa com uma letra.

  20. Exemplos de átomos • 1500 • É um átomo, pois é um string de caracteres que começa com um dígito. • 150carnavais • É um átomo, pois é um string de caracteres que começa com um dígito. • b • É um átomo, pois é um string de 1 caracter começando com letra ou dígito.

  21. Exemplos de átomos • *figueirense$ • É um átomo, pois é um string de caracteres que começa com uma letra, um dígito ou um caracter especial que não é abre parênteses, (, ou fecha parênteses, ). • 6! • É um átomo, pois é um string de caracteres que começa com uma letra, um dígito ou um caracter especial que não é abre parênteses, (, ou fecha parênteses, ).

  22. Exemplos de listas • (atom) • É uma lista: um átomo entre parênteses • (atom carnaval 1500) • É uma lista: coleção de átomos entre parênteses. • (atom carnaval) 1500 • Não é uma lista: duas expressões-S que não estão entre parênteses. A primeira é uma lista e a segunda é um átomo

  23. Exemplos de listas • ((atom carnaval) 1500) • É uma lista, pois as duas expressões-S estão entre parênteses. A primeira é uma lista e a segunda é um átomo • Tente fazer alguns exercícios para fixar os conceitos de átomos e listas

  24. Expressão-S (S-expresssion) • jbma • É uma expressão-S, pois todo átomo é uma expressão-S • (j b m a) • É uma expressão-S, pois é toda lista é uma expressão-S • ((j b m) a) • É uma expressão-S, pois é uma lista

  25. Expressão-S • (o que seria do musica baiana se inexistisse eh oh eh oh) • É uma lista, pois é uma coleção de expressões-S entre parênteses • ((j b m) a) • Nessa lista há duas expressões-S. A lista (j b m) e o átomo a

  26. Expressão-S • ( ) • É uma lista, pois contém zero expressões-S. Essa expressão-S especial é chamada de lista nula ou lista vazia, as vezes chamada, também, nil • ( ) • É um átomo, pois ( ) é ambos, uma lista e um átomo

  27. Expressão-S • ( ( ) ( ) ( ) ( ) ) • É uma lista, pois é uma coleção de expressões-S entre parênteses • Agora vejamos como se representa funções em LISP

  28. Representação de funções • LISP • Processamento de listas • Representa funções através de listas • O nome da função é sempre o primeiro elemento da lista • Veja alguns exemplos de funções representadas em LISP

  29. Funções em LISP • f(x,y), na notação usual matemática • (f x y) • Nome da função, f, como o primeiro elemento e os demais elementos, x e y, representam os seus argumentos • (nome-da-funcao argumento1 argumento2 ...)

  30. Funções em LISP • 3*7, usando-se a notação infixa • Em LISP, notação pré-fixa • (* 3 7)

  31. Funções em LISP • A origem do nome LISP • LISt Processing (processamento de listas) • Exemplos de execução LISP > (+ 3 4) ; operador adição 7 ; retorno da função > (- 6 4) ; operador subtração 2 ; retorno da função > (car '(6 4)) ; função car 6 ; retorno da função > (cdr '(6 4)) ; função cdr (4) ; retorno da função

  32. Funções em LISP • LISP só pensa naquilo • Toda vez que você fornece uma lista, a executa, a menos que você o alerte para não o fazer • Por exemplo, se você fornecer a lista (6 5 7) e a mandar executar, LISP irá retornar mensagem de erro • 6 não é uma função • Como alertá-lo, então?

  33. Funções em LISP • Em um dos exemplos acima, solicitou-se a execução de > (car '(6 4)) • Veja que a lista que é fornecida como argumento da função car é precedida pelo símbolo “ ’ ” • Esse é o alerta: proibido avaliar • Veja histórico sobre Expressão-S nas notas de aula

  34. Função universal como interpretador LISP • Na Teoria da Computação, é comum investigar funções universais • Exemplo, a máquina universal de Turing • É uma máquina de Turing que pode simular qualquer outra máquina de Turing que voce possa descrever • McCarthy fez exatamente isso com LISP

  35. Função universal como interpretador LISP • Definiu uma função universal LISP • Que poderia interpretar qualquer outra função LISP • Em outras palavras • Escreveu um interpretador LISP, em LISP • Como LISP manipula apenas listas • Escrever uma função universal iria requerer desenvolver-se uma forma de representar programas LISP como estruturas de listas

  36. Função universal como interpretador LISP • Exemplo f(x+y; u*z) • Pode ser representada na forma de lista (f (+ x y) (* u z)) • Em Algol, esse artifício era chamado de Expressão-M (M-Expression) • Aqui, M significava metalangue (metalinguagem)

  37. Função universal como interpretador LISP • Em LISP, a expressão acima passou a ser chamada de Expressão-S (S-Expression) • Em LISP, S siginificava simbolic language (linguagem simbólica) • Nesse momento, um dos membros do grupo constatou que tinham em mãos, de fato, um interpretador

  38. Função universal como interpretador LISP • Traduziram a função universal para Assembly e a linkaram com as sub-rotinas de manuseio de listas • E esse foi o primeiro sistema LISP • Isso requeria o uso de Expressão-S, considerado uma inconveniência temporária

  39. Função universal como interpretador LISP • Tentaram uma melhor notação, mas nunca conseguiram completá-la, e continuaram a usar a Expressão-S • Hoje, sabe-se, que essa representação é uma das principais vantagens de LISP • LISP tornou-se a principal linguagem para IA, até os anos 70

  40. O dialeto XLISPWIN • Símbolos representam átomos • Se você usar letras, dígitos e hífens, você estará seguro de não errar • Restrições • Não use apenas dígitos (inteiro?) • Não use um hífen inicial (inteiro negativo) • Veja alguns exemplos em XLISPWIN

  41. O dialeto XLISPWIN a foo bar baaz-quux-garply • São exemplos de átomos em XLISPWIN • O caractere ; é para comentário • Tudo, após o mesmo e até o final da linha, é considerado comentário • É ignorado pelo interpretador

  42. O dialeto XLISPWIN • Exemplos de funções XLISPWIN > (setq a 5) ; armazena um número, 5 ; como o valor de um símbolo, a 5 > a ; pega o valor, 5, de um símbolo, a 5

  43. > (let ((a 6)) a) 6 > a 5 ; faz o valor de um ; símbolo, a ; temporariamente ; igual a 6 ; retorna 5, pois o ; let já foi interpretado Funções XLISPWIN

  44. > (+ a 6) 11 > b ; Usa o valor de um símbolo como ; um argumento para a função ; Tenta pegar o valor de um símbolo sem valor Funções XLISPWIN error: unbound variable - b if continued: try evaluating symbol again • Note a mensagem de erro: algo deu errado

  45. Símbolos especiais • O símbolo t (de true, verdadeiro) • O símbolo nil (em LISP, utilizado para representar o valor lógico falso) • Também, como visto, pode representar a lista vazia > (if t 5 6) 5

  46. Símbolosespeciais > (if nil 5 6) 6 > (if 4 5 6) 5 • A função if é aplicada a 3 argumentos • Quando o 1o é nil, retorna o 3o • Quando o 1o é t (ou qq. outro, retorna o 3o • Retorna o argumento ou sua avaliação

  47. Símbolosespeciais • Símbolos como t e nil são chamados de auto-avaliantes, porque eles mesmos se avaliam • Há toda uma classe de símbolos auto-avaliantes denominados keywords • Qualquer símbolo cujo nome começa com dois pontos, :, é uma keyword

  48. Símbolosespeciais > :this-is-a-keyword :THIS-IS-A-KEYWORD > :so-is-this :SO-IS-THIS > :me-too :ME-TOO

  49. Números (átomos numéricos) • XLISPWIN suporta 4 tipos de números • Inteiro • Real (com ponto decimal e, também, na notação científica) • Racional • Complexo

More Related