ine5363-programação funcional prof. joão bosco da mota alves 2001/1 - ine/ctc/ufsc bacharelado em...
TRANSCRIPT
INE5363-Programação Funcional
Prof. João Bosco da Mota Alves2001/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– Cálculo Lâmbda ( - Calculus)
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.
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
Introdução
Máquina Usuário
Assembly Fortran
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, ...
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
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
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)
Paradígma de Programação Procedimental
• Transição de estado
n ...210int fact(int n)
{ int x = 1; while (n > 0) { x = x * n; n = n - 1; } return x;}
Um programa C
Paradígma de Programação Procedimental
Estado(n, x)
Comando Comentário
(6, 1) Estado inicial,
(6, 6) x = 1 6 2o estado, 1(5, 6) n = 6 1 3o estado, 2(5, 30) x = 6 5 4o estado, 3(4, 30) n = 5 1 5o estado, 4(4, 120) x = 30 4 6o estado, 5(3, 120) n = 4 1 7o estado, 6(3, 360) x = 120 3 8o estado, 7(2, 360) n = 3 1 9o estado, 8(2, 720) x = 360 2 10o estado, 9(1, 720) n = 2 1 11o estado, 10(1, 720) x = 720 1 12o estado, 12(0, 720) n = 1 1 Estado fi nal, 13
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
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)
0 fn
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
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
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
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
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
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.
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.
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, ).
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
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
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
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
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
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
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
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 ...)
Funções em LISP• 3*7, usando-se a notação infixa • Em LISP, notação pré-fixa
– (* 3 7)
Funções em LISP• A origem do nome LISP
– LISt Processing (processamento de listas)– Exemplos de execução LISP
> (+ 3 4) ; operador adição7; retorno da função> (- 6 4) ; operador subtração2; retorno da função> (car '(6 4)) ; função car6; retorno da função> (cdr '(6 4)) ; função cdr(4) ; retorno da função
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?
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
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
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
Função universal como interpretador LISP
• Exemplof(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)
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
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
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
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
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
O dialeto XLISPWIN• Exemplos de funções XLISPWIN
> (setq a 5) ; armazena um número, 5 ; como o valor de um
símbolo, a5> a ; pega o valor, 5, de um
símbolo, a5
Funções XLISPWIN> (let ((a 6)) a)
6> a5
; faz o valor de um ; símbolo, a
; temporariamente; igual a 6; retorna 5, pois o; let já foi interpretado
Funções XLISPWIN> (+ 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
error: unbound variable - bif continued: try evaluating symbol again
• Note a mensagem de erro: algo deu errado
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
Símbolos especiais> (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
Símbolos especiais• 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
Símbolos especiais> :this-is-a-keyword:THIS-IS-A-KEYWORD> :so-is-this:SO-IS-THIS> :me-too:ME-TOO
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