Está en la página 1de 20

Tcnicas Avanzadas de Programacin

Ingeniera en Informtica

Programacin Funcional
Lenguajes basados en funciones matemticas
Funciones Matemticas
Definen un conjunto de valores, ms que el
procedimiento de calculo
Establece una correspondencia entre los
miembros de un conjunto llamado Dominio a otro
conjunto llamado Rango.
La correspondencia es definida por una
expresin o en algunos casos por una tabla.

Programacin Funcional
Funciones Matemticas Caractersticas
El orden de evaluacin es controlado por
condicionales y recursin, en vez de secuencias y
repeticiones.
No hay efectos de borde (No hay definicin de
variables en el sentido de lenguajes imperativos)

Programacin Funcional
Funciones Matemticas Formas Funcionales
9 Composicin
f(x) ~ x + 2
g(x) ~ 3* x
h(x) ~ f(g(x)) => h(x) ~ (3 * x) + 2

9 Construccin
g(x) ~ x * x
h(x) ~ 2 * x
i(x) ~ x/2
[g,h,i] (4) ~ (16,8,2)

Programacin Funcional - Scheme


Es un dialecto de LISP creado en el MIT
en 1975.
Se caracteriza por su tamao pequeo y
por su tratamiento de funciones como
entidades de 1 clase.
Sintaxis y Semntica simple.

Programacin Funcional - Scheme


Nombres pueden tener letras, dgitos y
caracteres especiales
Scheme es un ciclo infinito de leer, evaluar,
escribir
Ejemplos
expresin
42
(* 3 7)
(+ 5 7 8)
(- 5 6)
(-15 7 2)
(-24 (* 4 3))

valor
42
21
20
-1
6
12

Programacin Funcional - Scheme

Scheme siempre trata de evaluar los parmetros, si queremos evitar


la evaluacin se utiliza el quote ()
(Quote A)
(A)
( (A B C))

~
~
~

A
A
(A B C)

Las listas son delimitadas por parntesis


( A B C D)

4 elementos

( A (B C) D (E (F G)))

4 elementos

Scheme

Operaciones bsicas sobre listas


car Devuelve el 1 elemento de una lista
cdr Cola de una lista eliminado el 1 elemento

Ejemplos car
(car (A B C))
(car ((A B) C D))
(car A)
(car (A))

Devuelve A
Devuelve (A B)
Devuelve error A no es una lista
Devuelve A

Ejemplos cdr
(cdr (A B C))
(cdr ((A B) C D))
(cdr A)
(cdr (A))

Devuelve (B C)
Devuelve (C D)
Devuelve error A no es una lista
Devuelve ( )

Scheme

cons sirve para construir listas, recibe 2 parmetros


Ejemplos cons
(cons A ())
(cons (A B) (C D))
(cons () (A B))

Devuelve (A)
Devuelve ((A B) C D)
Devuelve ( () A B)

El 1 parmetro usualmente es un tomo, pero puede


ser una lista. El 2 parmetro es usualmente una lista.
La accin es insertar el primer parmetro como nuevo
elemento de la 2 lista.

Scheme
list construye listas dado un nmero variable de parmetros
(list x y z) Devuelve (x y z)
Es equivalente a (cons x (cons y (cons z ())))

Predicados de comparacin eq? null? list?


- eq? Devuelve #t si ambos parmetros son tomos y son iguales, sino devuelve #f (revisar eqv?,
equal?)
(eq? A A)
(eq? A B)

Devuelve #t
Devuelve #f

- null? Devuelve #t si el parmetro dado es la lista vaca


(null? (A B))
Devuelve #f
(null ())
Devuelve #t
(null? A)
Devuelve #f
- list? Devuelve #t si el parmetro dado es una lista
(list? (x y))
Devuelve #t
(list x)
Devuelve #f
(list ())
Devuelve #t

Scheme
Para las comparaciones con data numrica se usa: =, <,
>, <=, >=, even?, odd?, zero?
Para visualizacin
(display expresin)
(newline)

Definicin de simbolos y constantes


(define simbolo expresion)
Ejemplos:
(define pi 3.14159)
(define alfa (* 2 pi))

Scheme
Definicin de funciones
(define (nombre-funcion parametros)
cuerpo
)
o
(define nombre-funcion
(lambda (parametros)
cuerpo
)
)

Ejemplos
(define (segundo lst)
( car (cdr lst))
)
>(segundo (A B C))
B
(define cuadrado
(lambda (numero)
(* numero numero)
)
)
> (cuadrado 6)
36

Scheme
Flujos de Control

Condicional - Clausula if
(if condicion expression_then expresion_else)

1 si n = 0
factorial(n) ~
n * f(n-1)
(define (factorial n)
(if (= n 0)
1
(* n (factorial (- n 1)))
)
)

Scheme
Flujos de Control

Multiples Condiciones
(cond
(condicion1 expresion1)
(condicion2 expresion2)
.
.
.
(condicionN expresionN)
(else expresion)

Las condiciones son evaluadas secuencialmente hasta


encontrar a la primera verdadera y esa es la expresin que
se devuelve

Scheme
Flujos de Control

Multiples Condiciones
Realice una funcin que determine si un tomo es miembro de
una lista.

(define (miembro atomo lista)


(cond
((null? lista) #f)
((eq? atomo (car lista)) #t)
(else (miembro atomo (cdr lista)))
)
)

Scheme
Ejemplos

Realice una funcin que determine si 2 listas de tomos son


iguales.

(define (igualdadLis lis1 lis2)


(cond
((null? lis1) (null? lis2))
((null? lis2) #f)
(eq? (car lis1) (car lis2))
(igualdadLis (cdr lis1) (cdr lis2))
(else #f)
)
)

Scheme
Ejemplos

Realice una funcin que concatene 2 listas.

(define (concat lis1 lis2)


(cond
((null? lis1) lis2)
(else (cons (car lis1) (concat (cdr lis1) lis2)))
)
)
> (concat (A B C) (D E F))
(A B C D E F)
>

Scheme
Funcion Let
(let (
(nombre1
(nombre2
.
.
.
(nombreN
cuerpo

expresion1)
expresion2)

expresionN)

La funcin let permite hacer asignaciones


temporales de valores a subexpresiones

Scheme
Ejemplos

Realice una funcin que calcule las races cuadradas de una


ecuacin

(define (raices a b c)
(let (
(parte_raiz (/ (sqrt (- (* b b) (* 4 a c))) (* 2 a)))
(parte_menos ( / (- 0 b) (* 2 a)))
)
(display (+ parte_menos parte_raiz))
(newline)
( display (- parte_menos parte_raiz))
)
)

Scheme
Ejercicios

Realice una funcin que sume los elementos de una


lista de enteros.
Realice una funcin que cuente los tomos de una
lista, donde todos los elementos son tomos.
Realice una funcin que cuente los tomos de una
lista, donde cada uno de los elementos puede ser un
tomo o una lista.
Realice una funcin que devuelva el mximo de 3
nmeros