Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Paradigma Funcional
Professor:
Diego Raphael Amancio
Estagirios PAE:
Paola Llerena Valdivia
Erick 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.
NDICE
Crtula....1
Introduo .2
CAPITULO I - Paradigma Funcional
1.1 Noo de paradigma...4
1.2 Paradigmas e Linguagens de programao...5
1.3 Paradigma funcional...6
CAPITULO II - Linguagem LISP
2.1 A linguagem Lisp.8
2.2 Funes primitivas..9
2.3 Predicados..10
2.4 Recursividade.10
2.5 Estruturas de controle11
2.6 Arrays e Listas14
CAPITULO III - Linguagem Haskell
3.1 A linguagem Haskell..15
3.2 Funes primitivas.15
3.3 Predicados..16
3.4 Recursividade.17
3.5 Estruturas de controle17
3.6 Listas....17
BIBLIOGRAFIA.19
Figura 1.4 Comparacin entre los modelos imperativo y funcional (Labra 98).
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.
(+) => 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.
2.4 Recursividade
Recurso j existia como um conceito matemtico antes que Lisp; mas Lisp foi a primeira
linguagem de programao para apoi-lo.
Uma funo recursiva uma funo que se refere a si prpria. A ideia consiste em utilizar a
prpria funo que estamos a definir na sua definio.
Em todas as funes recursivas existe:
Em Lisp destina-se a valor falso NIL, o que tambm significa lista vazia; o valor lgico
verdade T. Aqui esto algumas funes de comparao:
Exemplo con if:
> (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 acumulase 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))
ABN AMRO
Anygma
Amgen
Intel
Microsoft
3.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 booleano
Descrao
False
valor falso
not
not lgico
|| / &&
or/and lgico
True
valor verdadeiro
Figura 3.3: Valores e operaoes lgicas
Comparaao
Descriao
comparaao maior,
menor, maior igual,
menor igual
a ==, /= b
igual, diferente
a `compare` b
retorna 3 valores
(iguais, menor,
maior)
3.4 Recursividade
A recursividade em Haskell simples, os casos base tem que estar definidos na parte
superior da definio, vamos ver isso com um exemplo clssico do fatorial de um nmero.
fatorial 1 = 1
fatorial 0 = 1
fatorial x = x * fatorial(x-1)
J que a funo percorre de forma Top-Down, o primeiro que encontra so os casos bases.
Depois a mesma definio que com funes.
Naturalmente o que caracteriza a um programa recursivo e a chamada a ele mesmo, como
vemos no exemplo.
Condicional simples
case val of
v1 ->
v2 ->
v_ ->
Condicional mltipla
Exceo (catching)
throw
Exceo (throwing)
3.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.
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