ine5363-programação funcional
Post on 09-Jan-2016
36 Views
Preview:
DESCRIPTION
TRANSCRIPT
INE5363-Programação Funcional
Prof. João Bosco da Mota Alves
2001/1 - INE/CTC/UFSCBacharelado 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 ...210
int 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 final, 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
top related