ine5363-programação funcional

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

Upload: hide

Post on 09-Jan-2016

36 views

Category:

Documents


0 download

DESCRIPTION

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 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: INE5363-Programação Funcional

INE5363-Programação Funcional

Prof. João Bosco da Mota Alves

2001/1 - INE/CTC/UFSCBacharelado em Ciência da Computação

Page 2: INE5363-Programação Funcional

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)

Page 3: INE5363-Programação Funcional

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.

Page 4: INE5363-Programação Funcional

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

Page 5: INE5363-Programação Funcional

Introdução

Máquina Usuário

Assembly Fortran

Page 6: INE5363-Programação Funcional

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, ...

Page 7: INE5363-Programação Funcional

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

Page 8: INE5363-Programação Funcional

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

Page 9: INE5363-Programação Funcional

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)

Page 10: INE5363-Programação Funcional

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

Page 11: INE5363-Programação Funcional

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

Page 12: INE5363-Programação Funcional

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

Page 13: INE5363-Programação Funcional

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

Page 14: INE5363-Programação Funcional

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

Page 15: INE5363-Programação Funcional

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

Page 16: INE5363-Programação Funcional

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

Page 17: INE5363-Programação Funcional

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

Page 18: INE5363-Programação Funcional

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

Page 19: INE5363-Programação Funcional

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.

Page 20: INE5363-Programação Funcional

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.

Page 21: INE5363-Programação Funcional

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, ).

Page 22: INE5363-Programação Funcional

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

Page 23: INE5363-Programação Funcional

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

Page 24: INE5363-Programação Funcional

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

Page 25: INE5363-Programação Funcional

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

Page 26: INE5363-Programação Funcional

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

Page 27: INE5363-Programação Funcional

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

Page 28: INE5363-Programação Funcional

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

Page 29: INE5363-Programação Funcional

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 ...)

Page 30: INE5363-Programação Funcional

Funções em LISP

• 3*7, usando-se a notação infixa • Em LISP, notação pré-fixa

– (* 3 7)

Page 31: INE5363-Programação Funcional

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

Page 32: INE5363-Programação Funcional

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?

Page 33: INE5363-Programação Funcional

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

Page 34: INE5363-Programação Funcional

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

Page 35: INE5363-Programação Funcional

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

Page 36: INE5363-Programação Funcional

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)

Page 37: INE5363-Programação Funcional

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

Page 38: INE5363-Programação Funcional

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

Page 39: INE5363-Programação Funcional

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

Page 40: INE5363-Programação Funcional

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

Page 41: INE5363-Programação Funcional

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

Page 42: INE5363-Programação Funcional

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

Page 43: INE5363-Programação Funcional

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

Page 44: INE5363-Programação Funcional

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

Page 45: INE5363-Programação Funcional

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

Page 46: INE5363-Programação Funcional

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

Page 47: INE5363-Programação Funcional

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

Page 48: INE5363-Programação Funcional

Símbolos especiais

> :this-is-a-keyword:THIS-IS-A-KEYWORD> :so-is-this:SO-IS-THIS> :me-too:ME-TOO

Page 49: INE5363-Programação Funcional

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