23
Universidade de São Paulo Instituto de Ciências Matemáticas e de Computação Departamento de Ciências de Computação SCC0217 - Linguagens de Programação e Compiladores Paradigma Funcional Alexis Iván Aspauza Lescano - 9249525 Carlos Eduardo Plasencia Prado - 9250472 Professor: Diego Raphael Amancio Estagiários PAE: Paola Llerena Valdivia Erick Rocha Fonseca

Seminario-ParadigmaFuncional

Embed Size (px)

DESCRIPTION

paradigma funcional-> LISP e HASKEL

Citation preview

Universidade de So PauloInstituto de Cincias Matemticas e de ComputaoDepartamento de Cincias de Computao

SCC0217 - Linguagens de Programao e Compiladores

Paradigma Funcional

Alexis Ivn Aspauza Lescano - 9249525Carlos Eduardo Plasencia Prado - 9250472

Professor:Diego Raphael Amancio

Estagirios PAE:PaolaLlerena ValdiviaErick Rocha Fonseca

Maio de 2015

Introduo

Existem diversos paradigmas de programao e diversas linguagens associadas a estes paradigmas, e este trabalho ir enfatizar o paradigma de programao funcional, Alm disso, vemos tambm duas linguagens que seguem este paradigma, Lisp e Haskell.Neste trabalho vamos discutir a linguage funcional, suas caractersticas e benefcios, com o objectivo de familiarizar os estudantes com uma linguagem elegante, que pode lidar com mais facilidade e para que os programas so menos extensa e complexa. tambem vamos discutir sobre o objectivo do paradigma funcional que obter uma linguagem expressiva e matematicamente elegante, que no necessrio diminuir o nvel da mquina para descrever o processo realizado pelo programa.

NDICECrtula....1 Introduo .2CAPITULO I - Paradigma Funcional1.1 Noo de paradigma...41.2 Paradigmas e Linguagens de programao...51.3 Paradigma funcional...6CAPITULO II - Linguagem LISP2.1 A linguagem Lisp.82.2 Funes primitivas..92.3 Predicados..102.4 Recursividade.102.5 Estruturas de controle112.6 Arrays e Listas14CAPITULO III - Linguagem Haskell3.1 A linguagem Haskell..153.2 Funes primitivas.153.3 Predicados..163.4 Recursividade.173.5 Estruturas de controle173.6 Listas....17BIBLIOGRAFIA.19

CAPITULO I - PARADIGMA FUNCIONAL

1.1 Noo de paradigma:

Primeiramente precisamos definir o que que um paradigma, ento, podemos ver as prximas definies:i) Um paradigma aquele que serve como um padro ou modelo. [1]ii) Um conjunto ou lista de todas as formas inflexivas de uma palavra ou de uma de seus categorias gramaticais. Exemplo: o paradigma de um verbo irregular. [1]iii) Um conjunto de suposies, conceitos, valores e prticas que constituem uma forma de ver a realidade pela semelhana que compartem, especialmente numa disciplina intelectual. [1]iv) Um paradigma um exemplo, um modelo, um padro. [2]v) Uma ilustrao, como por uma parbola ou fbula. [2]Mas de todas estas definies, ficam permanentes as palavras modelo e padro, e j temos a noo do que um paradigma, ento vamos dizer que um paradigma um modelo, uma forma de fazer algo, um conjunto de conceptos, e quem siga o mesmo padro, estar seguindo o paradigma.

Figura 1.1: Linguagens, paradigmas e conceitos [3]

1.2 Paradigmas e Linguagens de programao:

Tem menos paradigmas que linguagens de programao, porque como sabemos, os paradigmas so queins engloban os conceitos a seguir, e as linguagens so as que realizan um ou mais paradigmas, e cada paradigma (de programao) definido por um conjunto de conceitos de programao organizados numa linguagem nucleo, chamada kernel language, linguagem kernel ou kernel da linguagem. Podemos ver a representao dissto na figura 1.1. [3]Ainda quando existem mais linguagems de programao que paradigmas, existem muitos paradigmas, na figura 1.2 mostramos 27 paradigmas que so usados, no vamos a detalhar cada um deles, mas podemos observar que cada paradigma no uma ilha, pois pode compartir coisas do outros paradigmas, e absorver algumos conceitos deles (cada flecha algo que tem que agregar para ir de um paradigma a outro). Veja uma descrio completa em [3:13].

Figura 1.2: Taxonoma dos paradigmas de programao [3]

1.3 Paradigma Funcional ou programao funcional

A origem deste paradigma pode ser atribuda a matemtico Alonzo Church, que trabalhou na Universidade de Princeton. Church desenvolveu uma linguagem abstrata, chamado clculo lambda (podemos ver um exemplo na Figura 1.3).

Seus fundamentos foram a base de toda a teoria da programao funcional e linguagens funcionais desenvolvido mais tarde. Pode-se dizer que as linguagens funcionais modernos so verses do clculo lambda com numerosos auxlios sinttica.

Figura 1.3 calculo lambda

Na programao funcional pura as variveis no so necessrias, contrariamente ao paradigma imperativo, no necessita de espao de memria, podemos ver as diferencias de os modelos destos paradigmas na figura 1.4.

Programas escritos em uma linguagem funcional so constitudas unicamente por definies de funes, ou seja, no como subprogramas clssicas de uma linguagem imperativa, mas como funes puramente matemticas, em que certas propriedades, tais como transparncia referencial so verificados (o significado de uma expresso depende apenas o significado dos seus subexprees), e, por conseguinte, a total falta de efeitos secundrios.

Vantagens da utilizao de um paradigma funcional:

Entre as vantagens citadas comumente utilizando um paradigma funcional em programao de computadores, so os seguintes:

A ausncia de efeitos secundrios Processo de purificao menos problemtico Unidades de teste mais confiveis Mais fcil para a execuo simultnea

Hoje existem muitas linguagens funcionis:

Lisp Pode ser considerado como uma das primeiras linguagens funcionis (falaremos sobre isso no captulo 2), que atualmente ainda esta em uso, especialmente nas reas de inteligncia artificial.

Um pioneiro desse paradigma APL desenvolvido na dcada de 60 (Iverson de 1962).

A linhagem funcional enriquecido na dcada de 70, com a contribuio de Robin Milner, da Universidade de Edimburgo para criar a linguagem ML. Este foi subdividido em vrios dialetos como o Objective Caml e Standard ML.

No final dos anos 80, de uma comisso, a linguagem Haskell foi criado em uma tentativa de reunir vrias idias espalhadas em diferentes linguagens funcionais (tentar padronizar o paradigma, falaremos sobre isso no captulo 3).

Em 2008 Microsoft Research tem includo uma nova linguagem (funcional), chamado de F #, sua plataforma .NET.

.

Figura 1.4 Comparacin entre los modelos imperativo y funcional (Labra 98).

CAPITULO II - Linguagem LISP

2.1 A linguagem Lisp

LISP um acrnimo para Lista de Processamento de Linguagem, uma linguagem de programao de alto nvel desenvolvida por John McCarthy no MIT no final dos anos cinquenta e incio dos anos sessenta.[4]LISP uma linguagem dinmica, cujos programas so constitudos por pequenos mdulos, de funcionalidade genrica e que cumprem um objectivo muito simples. a sua combinao que produz um programa completo. A linguagem Lisp nasceu como uma ferramenta matemtica, independente de qualquer computador e s posteriormente se procedeu sua adaptao a uma mquina.[5] Lisp projetado principalmente para processamento de dados simblicos. Ela tem sido usada para clculos simblicos em clculo diferencial e integral, teoria circuito eltrico, lgica matemtica, e outros campos da inteligncia artificial.[4]Objetos de dados: Tipos de dados primitivos: tomos. Cada tomo tem uma lista de propriedades associada, acessvel atravs do ponteiro que armazena o nome do tomo. No se distinguem maisculas e minsculas para identificadores. Tipos de dados estruturados: listas. Tm associado um ponteiro ao primeiro elemento (car) e outro ao elemento seguinte (cdr). Uma lista vazia aponta a nil. Para a atribuio se utiliza (set x val). Representao e armazenamento: Cada descritor de um objeto de dados proporciona tipo e atributos. Nos dados estruturados (listas) tm-se somente ponteiros a primeiro e ao seguinte.

Figura 2.1 exemplo do programao em LISP2.2 Funes primitivas

Em LISP, para poder realizar as chamadas de funes, usaremos o seguinte formato:(Nome arg1 arg2 ... argN)Onde nome o nome da funo o primeiro argumento arg1, arg2 o segundo argumento, e assim por diante. Temos as siguientes funes:A funo + recebe um nmero qualquer de argumentos e retorna a soma de todos eles. Se houver zero argumentos, retorna 0 que o elemento neutro para a adio.(+) => 0(+ 3) => 3(+ 3 5 6) => 14

A funo - subtrai do primeiro argumento todos os outros, exceto quando h s um argumento: da ela retorna o oposto dele. um erro cham-la com zero argumentos.(-) => ERRO(- 3) => -3(- 3 5) => -2(- 3 5 6) => -8

A funo * recebe um nmero qualquer de argumentos e retorna o produto de todos eles. Se houver zero argumentos, retorna 1 que o elemento neutro para a multiplicao.(*) => 1 (* 3) => 3 (* 3 5) => 15 (* 3 5 6) => 90

A funo / divide o primeiro argumento sucessivamente por cada um dos outros, exceto quando h s um argumento: da ela retorna o inverso dele.(/) => ERRO (/ 3) => 1/3 (/ 3 5) => 3/5 (/ 3 5 6) => 1/10

A funo CONS recebe dois argumentos e retorna uma nova caixa contendo estes argumentos como componentes, na ordem dada. Exemplos:(cons 'a 'b) => (A B)(cons '1 '(a b)) => (1 A B)

A funo CAR retorna o primeiro componente de um cons. FIRST um sinnimo de CAR. (car '(A (A B) E)) => A(car '((A . 1).("ca".(x . 10.0)))) => (A . 1)

A funo CDR retorna o segundo componente de um cons. REST um sinnimo de CDR.(cdr '(A (A B) E)) => ((A B) E)(cdr '((A . 1).("ca".(x . 10.0)))) => (("ca" x . 10.0))

2.3 Predicados

Em Lisp podemos encontrar muitos predicados, em seguida, listamos algumos deles: atom x, devolve True se x um tomo. numberp x, devolve True se x um nmero. greaterp x y, devolve True se x>y. lessp x y, devolve True se x (set 'temperatura 28)28

> (if (< temperatura 30) (set 'clima "templado") (set 'clima "caluroso"))"templado"

When

semelhante ao if, apenas que no contempla o fato de executar alguma ao se a condio for falsa, veja:

(when (condio) (tempo))

Quando a condio verdadeira, avalia a expresso em seguida.

> (set 'nome "Maria")"Maria"

> (when (EQUAL nome "maria") (princ "te amo, vida"))"te amo vida"

Cond

Ir avaliar determinada expresso verdadeira, dependendo da condio utilizada. semelhante e tem a mesma funo que case ou select em outros idiomas.exemplo:

(defun hacer-algo (temperatura) (cond ((< temperatura 10) "assistir tv") ((< temperatura 30) "jogar ao futebol") ((< temperatura 40) "tomar helado") ((>= temperatura 40) "Vao a praia")))

> (hacer-algo 15)"jogar ao futebol"

> (hacer-algo 36)"tomar helado"Case

Se voc quiser fazer uma deciso com base na comparao de uma varivel com um conjunto conhecido de valores constantes, caso muitas vezes mais conciso do que cond. Importante, a varivel no pode ser usado para comparar sequncias:

(defun elegir-cor (cor) (case cor (:rojo "rosa") (:azul "tulipan") (:verde "malvon") (:lila "azucena") (:amarelho "margarita") (otherwise "Elija outra cor!..."))) ; outro caso

> (elegir-cor :lila)"azucena"

Iteraes o bucles de programa

dolist

Sintaxis

(dolist (lista-inicializao) (corpo))

dolist recebe uma lista de inicializao e um corpo. A lista de inicializao conter uma varivel de tomar os elementos de uma lista para cada iterao, a lista de elementos, e uma varivel a ser retornado como um resultado.

(elemento lista-elementos resultado)

No corpo que far um loop para cada elemento na lista, e ele ir armazenar cada um desses valores na varivel de elemento.

Um exemplo:

> (set 'resultado 1)1

> (set 'lista-elementos '(2 3 5 7 11 13 17 19 23))

> (dolist (itens lista-elementos resultado) (set 'resultado (* elemento resultado))) ;multiplica cada elemento da lista e acumula-se no resultado

dotimes

semelhante ao DOLIST, apenas a varivel iterador ser sempre um nmero natural, comeando com zero.

A sintaxe :

(dotimes (lista-inicializao) (corpo))

Onde (lista-inicializao) tem a forma:

(variavel-iteradora valor-mximo resultado)

O corpo vai ser avaliada sucessivamente, comeando a varivel iterador com um valor de 0 (zero), atingindo um valor mximo menos 1. Tal como no caso anterior, se o "resultado" for omitido NIL devolvido no final do ciclo.

Exemplo:

> (dotimes (i 10) (format t "~s" i)) 0123456789

Format imprime o valor da varivel de cada vez que o corpo avaliado, "~ s" pegue o valor da varivel e imprime na tela.Para ser mais bonito, ns imprimimos abaixo entre si e com tabulao:

> (dotimes (i 10) (format t "~% ~14t ~s" i))

"~%" equivale "enter" "~14t" a tabulao"~s" a varivel o que se imprime

Suponha que ns queremos obter a soma de (2 * i) 6-23 inclusive,Fazemo-lo:

> (set 'sumatoria 0)

> (dotimes (i 18 somatoria) (set 'sumatoria (+ sumatoria (* 2 (+ i 6)))))522

loop

A maneira mais fcil de fazer uma iterao fazendo um loop. Para sair do ciclo necessrio o uso de um (return). (return) me ajuda a deixar qualquer iterao, obviamente voc sempre us-lo e quando uma determinada condio satisfeita, usando um "if" ou "when", por exemplo:

(set 'x 2)

(loop (set 'x (+ x 1)) ;incrementa x en um (when (not (y-or-n-p "voc deseja continuar?")) (return)))

O "y-or-n-p" devolve T (True) quando voc pressionar "y" e NIL (false), onde "n" pressionado. No nosso caso, sai do loop, usando o "return" onde "n" pressionado, ento a funo precedida por "no" que nega o valor lgico.

do

o funcionamento mais complicado. Serve para usar diversas variveis iteradoras de uma s vez, cada um com o seu prprio aumento.Sua sintaxe :

(do ((lista-inicializao-1) (lista-inicializao-2) ........... (lista-inicializao-n)) (condio(expresses-verdade)) (expresses-falso))

Exemplo de do:

(do ((i 1 (+ i 1)) (Cores '("azul", "verde", "vermelho", "amarelo", "marrom", "laranja")(rest cores))) ((null cores) (format t "~% ~%Listo, barrilete csmico!")) (format t "~% ~10t El cor ~s es ~10t ~s" i (first cores)))

Se a lista ainda no est vazia,o primeiro elemento da lista impresso.

2.6 Arrays e Listas

ArraysA funo make-array faz um array. A funo aref acessa seus elementos. Todos os elementos de um array so inicialmente setados para nil:> (make-array '(3 3))#2a((NIL NIL NIL) (NIL NIL NIL) (NIL NIL NIL))> (aref * 1 1)NIL> (make-array 4) ;1D arrays don't need the extra parens#(NIL NIL NIL NIL)

ndices de um array sempre comeam em 0ListasAs listas so um dos componentes fundamentais da linguagem Lisp. O nome da linguagem , alis, uma abreviao de ``list processing''. Como iremos ver, as listas constituem uma estrutura de dados extremamente flexvel.Em Lisp, quando o segundo elemento de umcons outrocons, o Lisp escreve o resultado sob a forma de uma lista:> (cons 1 (cons 2 (cons 3 (cons 4 5))))(1 2 3 4 . 5)Uma lista vazia uma sequncia sem qualquer elemento e pode ser escrita comonilou ainda mais simplesmente().> (null nil) => t> (null (cons 1 (cons 2 nil)))=>nilCAPITULO III - Linguagem Haskell3.1 A Linguagem Haskell:

A linguagem Haskell permite as funes processar um conjunto de dados (input) e gerar uma salida (output) e sempre que o conjunto de dados fora a mesma, a sada tambm ser a mesma, isto , segue os princpios do paradigma funcional. [8]Mostramos na figura 3.1 s algumas companhias que usaram Haskell.ABN AMROUm banco internacional. Usa haskell na banca de investimento para medir o risco de contraparte em carteiras de derivativos financeiros

AnygmaUma companhia startup. Desarrolha ferramentas de criao de contedo multimdia usando Haskell.

AmgenUma companhia biotecnolgica. Cria modelos matemticos e outras complexas aplicaes em Haskell.

IntelDesarrolho um compilador Haskell como parte da pesquisa de ela em paralelismo multinucleado a escala.

MicrosoftUsa Haskell para seu sistema de serializao de produo, Bond.

Figura 3.1: Haskell na industria [9]Haskell tem indeferena de tipo de dado, isso , se eu coloco a = 2 + 3, esta reconhece a como uma variavel de tipo inteiro. [10]3.2 Funes primitivas

Para definir uma funo s precisamos colocar nomeDaFuno p1 p2 = (se a funao ocupa mais de uma linea, as seguintes tem que ter sangria) e para chamar, s nomeDaFuno p1 p2.[11]Agora vamos mostrar um exemplo, faremos uma funo pequena que calcule a distncia entre dois pontos da reta ento definimos a funo: distancia x1 y1 x2 y2 = sqrt((x1-x2)**2 + (y1-y2)**2) seguindo a sintaxes que mostramos antes.Como nos fala Miran Lipovaa no seu livro [10], agora vamos guardar nossa funo num arquivo .hs, chamemos de firstFunction.ls ento, e no momento de incluir nosso header, vamos escrever o comando :l firstFunction e finalmente para executar a funo vamos chamar com a mesma sintaxes que j conhecemos. A figura 3.2 mostra o exemplo mencionado.

Figura 3.2: Exemplo de funao em Haskell3.3 Predicados

Os predicados so uma parte vital de qualquer linguagem de programao, a parte que nos permitir condicionar algumas aes com respeito a se o predicado verdadeiro ou falso, para que na seguinte seco podamos ver as estruturas de controle.Na figura 3.3 podemos ver os valores e operaes lgicas, e na figura 3.4 podemos ver as comparaes numricas do haskell [11].Valor booleanoDescrao

Falsevalor falso

not not lgico

|| / &&or/and lgico

Truevalor verdadeiro

Figura 3.3: Valores e operaoes lgicas ComparaaoDescriao

a >, =, v2 -> v_ -> Condicional mltipla

catch a (\exn -> )Exceo (catching)

throwExceo (throwing)

Figura 3.5: estruturas de controle em Haskell3.6 Listas

Bom, agora estamos numa parte importante tambm, no Haskell os arrays so armazenados como listas, ento no referiremos mais a eles como arrays seno como listas. Uma lista j sabemos que um conjunto de dados do mesmo tipo, em haskell s e colocar entre colchetes [] los elementos da lista, e si queremos armazenar eles, ento vamos chamar ao let. Por exemplo, let firstFourNumbers = [1, 2, 3, 4] justamente isso, uma lista dos primeiros 4 nmeros naturais.Tambm vamos aclarar que nesta linguagem, uma cadeia uma lista de caracteres, como exemplo considere que compiladores o mesmo que [c, o, m, p, i, l, a, d, o, r, e, s]. [10]Uma operao bsica com listas e a concatenao, para isso, e s colocar o operador ++, por exemplo a sentena let myList = [1..50]++[51..1000] concatena uma lista de nmeros desde 1 at 50 com outra lista que contem nmeros desde 51 at 1000, e tudo numa lista nomeada myList.Mas o operador ++ tem que percorrer toda a primeira lista, o qual poderia ser muito complexo se contm um nmero alto de elementos, a outra opo o operador :, exemplo: let myList = [1..50]:[51..1000] a qual face a referncia do ltimo elemento da primeira ao incio da segunda. [10]Na figura 3.6 podemos ver o fcil que declarar uma lista de listas.

Figura 3.6: Lista de listasTemos que mencionar que existem muitas funes j definidas para strings e lists, podem ser concultadas em [11:Strings] e [11:Bags and Lists], tambm pode ver exemplos em [10:7]

BIBLIOGRAFA:

[1] The American Heritage Dictionary of the English Language. 4th edn, Houghton Mifflin Company, 2000[2] Webster's Revised Unabridged Dictionary. Micra Inc., 1998.[3] Programmging Paradigms for Dummies: What every programmer should Know. Peter Van Roy[4] McCarthy, John, LISP 1.5 Programmer's Manual, Massachusetts Institute of Technology, Computation Center and Research Laboratory of Electronics, 1962

[5] Introduo Linguagem Lisp, Antnio Menezes Leito, Reviso de Joo Cachopo, Outubro 1995.

[6] A linguagem de programao LISP o dialeto Common LISP, Tarcisio Praciano Pereira, Sobral Matematica, 25 de fevereiro de 2013

[7] Programacin Lisp: Estructura de Control de Programa, consultado 15/05/2015 s 20:35. URL: http://sobrelisp.blogspot.com.br/2013/01/estructura-de-control-de-programa.html

[8] Real World Haskell - Bryan OSullivan, John Goerzen, Don Stewart[9] Haskell wiki, consultado 09/05/2015 s 15:35. URL: https://wiki.haskell.org/Haskell_in_industry[10] Learn You a Haskell for Great Good! - Miran Lipovaa[11] Syntax across languages per languages: Haskell. consultado 10/05/2015 s 18:53. URL: http://rigaux.org/language-study/syntax-across-languages-per-language/Haskell.html