Documentos de Académico
Documentos de Profesional
Documentos de Cultura
10 ParadigmaFuncional
10 ParadigmaFuncional
o Semestre 2012
Programacin funcional
1 2 3 4
Clculo simblico Pruebas de teoremas Sistemas basados en reglas Procesamiento del lenguaje natural
2/17
Paradigma Declarativo
No hay necesidad de una instruccin de asignacin No hay nocin de cambio de estado en un programa
Una funcin llamada con los mismos argumentos siempre devuelve el mismo valor Las variables denotan nombres asociados a valores En los lenguajes imperativos, las variables denotan referencias a valores que existen en algn lugar del computador (estado) y que pueden ser cambiados con sucesivas instrucciones. En los lenguajes declarativos no existe ese concepto de valor que reside en algn lugar del computador al que nos referimos mediante una variable.
3/17
Paradigma Declarativo
Tanto paradigma funcional como lgico son paradigmas declarativos La caracterstica principal de la programacin funcional es que los clculos se ven como una funcin matemtica que hace corresponder entradas y salidas.
1 2 3 1 2 3 4
x) 2) )
x) (f 2) )
4/17
Efecto Lateral
1 2 3 4
{1 ,
5,
7}
b[0]
+ a [2];
Al modicar a hemos modicado b y viceversa, a esto se le llama efecto lateral. En los lenguajes declarativos esto no existe pues no existen las referencias.
5/17
En el paradigma funcional no existen los ciclos como los conocemos Para generar ciclos necesitamos utilizar recursividad. En la prctica muchos lenguajes funcionales incorporan herramientas del paradigma imperativo Estas herramientas no pertenecen al paradigma funcional puro
6/17
LISP
Lisp es el lenguaje ms importante del paradigma funcional. Lisp se origina en el ao 1956 JohnMcCarthy estaba buscando una solucin para programar el computador IBM 704 en los primeros proyectos de inteligencia articial. A nales de 1958 McCarthy, ya profesor de Ingeniera Electrnica y Marvin Minsky, profesor de matemticas, ambos en el MIT, comenzaron el MIT Articial Intelligence Project e iniciaron la implementacin de Lisp.
7/17
LISP y Scheme
De l nacen una enorme variedad de dialectos Scheme es uno de los dialectos ms extendidos en mbitos acadmicos en la actualidad. Entre los elementos que inspiraron Lisp se encuentra el formalismo de programacin funcional llamado clculo lambda. No es puramente funcional ni declarativo Es posible realizar sentencias imperativas en las que se modican el valor de posiciones de memoria a las que hacen referencia variables.
8/17
1 Si e es un valor primitivo, devolver ese mismo valor. 2 Si e es una variable, devolver su valor asociado. 3 Si e es una expresin del tipo (f arg1 ... argn), donde f el
nombre de un procedimiento primitivo('+','-',...), evaluar arg1 ... argn y aplicar el procedimiento al resultado.
1 2 3
double
z) (+
x) y)
(+ (
x y
x)) y))
( square (f
square (
double
z))
1) )
9/17
1 Evaluamos la expresin: f es un procedimiento;qu es 2 Ahora tomamos el cuerpo de f y sustituimos 3 por z: (+ 3 Ahora evaluamos la expresin resultante: + denota el 4 Qu es (square(double 3))? square es un procedimiento 5 y qu es (double 3)? double es otro procedimiento
square(double 3)) 1)
compuesto y 3 se evala a 3.
10/17
As que, una vez hemos evaluado todo, podemos empezar a aplicar los procedimientos. Empezamos por double sustituyendo el cuerpo de la funcin: (+ (square(+ 3 3)) 1)
1 2 3 4
Ahora,qu es (+ 3 3)? > (+ (square 6) 1) Ahora se sustituye el cuerpo de square: (+ (* 6 6) 1) Qu es (* 6 6)? > (+ 36 1) Y (+ 36 1)?> 37
11/17
El ejemplo del modelo de sustitucin que hemos visto se ha hecho utilizando el orden de aplicacin En este se evala primero todos los procedimientos y argumentos antes de ejecutar la llamada a la funcin. Otra forma de evaluar expresiones es utilizando el orden normal:
Expandir completamente los procedimientos hasta que todo est expresado mediante operaciones primitivas y autoevaluaciones Entonces evaluar la expresin.
El mismo problema de antes: (f (+ 2 1))
12/17
1 2 3 4 5 6 7 8
(+ (+ (+ (+ (+ (+ (+ 37
(* (+ 3 (+ 2 1))(+ (+ 2 1)(+ 2 1))) 1) (*(+3 3)(+ (+ 2 1)(+ 2 1))) 1) (* (+ 3 3)(+ 3 (+ 2 1))) 1) (* (+ 3 3)(+ 3 3))) 1) (* 6 (+ 3 3)) 1) (* 6 6) 1) 36 1)
13/17
En uno y en otro, podemos encontrar la solucin de la expresin. En programacin funcional, donde una funcin siempre devuelve el mismo valor cuando es llamada con los mismos argumentos, el orden normal y el orden aplicativo siempre devolvern el mismo resultado. Esto no sucede cuando estamos en un lenguaje no funcional. Veamos el siguiente ejemplo:
Vamos a denir una funcin que debera devolver siempre 0: (dene(zero x)(- x x)) ;Esta funcin siempre ;debera devolver 0. Ahora vamos a evaluar (zero (random 1 0)) con orden aplicativo y con orden normal.
Paradigma Funcional Caso de estudio: Scheme - Lenguajes y paradigmas de programacin
14/17
Orden aplicativo:
(zero (random 1 0)) (random 1 0)==>5 (zero 5)-> (- 5 5)==>0 0; El orden de aplicacin devuelve 0
Orden normal:
(zero (random 1 0)) (zero (random 1 0))-> (- (random 1 0) (random 1 0)) (random 1 0)==>4 (random 1 0)==>8 (- 4 8)==>-4 -4;El orden normal no
15/17
Scheme
Scheme es un lenguaje interpretado. Podemos lanzar un intrprete de Scheme y teclear en el prompt algunas expresiones. El intrprete analizar la expresin y mostrar el valor resultante de evaluarla.
2 (+ 2 3) (+) (+ 2 4 5 6) (+ (* 2 3) (- 3 1))
Las expresiones en Scheme tienen una forma denominada notacin preja de Cambridge (Cambridge prex notation) La expresin est delimitada por parntesis y el operando va seguido de los operadores.
Paradigma Funcional Caso de estudio: Scheme - Lenguajes y paradigmas de programacin
16/17
Scheme
La sintaxis es la siguiente: (<funcin> <arg1> ... <argn>) En Scheme podemos interpretar los parntesis abiertos '(' como evaluadores o lanzadores de la funcin que hay a continuacin. La forma de evaluar una expresin en Scheme es muy sencilla:
Evaluar cada uno de los argumentos Aplicar la funcin nombrada tras el parntesis a los valores resultantes de la evaluacin anterior (+ (* 2 3) (- 3 (/ 12 3))) (+ 6 (- 3 (/ 12 3))) (+ 6 (- 3 4)) (+ 6 -1) 5
Paradigma Funcional Caso de estudio: Scheme - Lenguajes y paradigmas de programacin
17/17
Paradigma Declarativo
En Scheme la evaluacin de una funcin siempre devuelve un valor, a no ser que se produzca un error que detiene la evaluacin: (* (+ 3 4) (/ 3 0)) Podemos utilizar la forma especial dene para darle un nombre (identicador, smbolo) a un valor. Una vez denido, podemos usar el nombre en lugar del valor.
1 2 3 4 5 6 7 8
pi
3.14159)
pi a
2) ) (+ 2 ( 3 4) ) )
18/17