Está en la página 1de 18

Paradigma Funcional Caso de estudio: Scheme

Lenguajes y paradigmas de programacin

Alberto Ceballos y Carolina Toro

o Semestre 2012

Programacin funcional

1 Apareci como un paradigma independiente a principios


de los 60.

2 Su creacin es debida a las necesidades de los


investigadores en el campo de la inteligencia articial y en sus campos secundarios:

1 2 3 4

Clculo simblico Pruebas de teoremas Sistemas basados en reglas Procesamiento del lenguaje natural

3 Estas necesidades no estaban cubiertas por los lenguajes


imperativos de la poca.

Paradigma Funcional Caso de estudio: Scheme - Lenguajes y paradigmas de programacin

2/17

Paradigma Declarativo

No hay nocin de posicin de memoria

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.

Paradigma Funcional Caso de estudio: Scheme - Lenguajes y paradigmas de programacin

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

( define ( f ...) (+( f 2) (f

x) 2) )

( define ( f ...) ( define (+ y y) y

x) (f 2) )

Paradigma Funcional Caso de estudio: Scheme - Lenguajes y paradigmas de programacin

4/17

Efecto Lateral

1 2 3 4

int a [3] = i n t b = a ; int


= 3; c = a [0]

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

Paradigma Funcional Caso de estudio: Scheme - Lenguajes y paradigmas de programacin

5/17

Un mundo sin for ni while

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

Paradigma Funcional Caso de estudio: Scheme - Lenguajes y paradigmas de programacin

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.

Paradigma Funcional Caso de estudio: Scheme - Lenguajes y paradigmas de programacin

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.

Paradigma Funcional Caso de estudio: Scheme - Lenguajes y paradigmas de programacin

8/17

Reglas para evaluar una expresin e de Scheme

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.

4 Si e es una expresin del tipo (f arg1 ... argn), donde f el


nombre de un procedimiento compuesto (denido con un 'dene'), sustituir f por su cuerpo, reemplazando cada parmetro formal del procedimiento por el correspondiente argumento evaluado. Evaluar la expresin resultante.

1 2 3

( define ( define ( define

double
z) (+

x) y)

(+ (

x y

x)) y))

( square (f

square (

double

z))

1) )

Paradigma Funcional Caso de estudio: Scheme - Lenguajes y paradigmas de programacin

9/17

Evaluando con modelo de sustitucin

Y ahora vamos a ver qu ocurre cuando ejecutamos (f (+ 2 1))

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

(+ 2 1)? > (f 3))

square(double 3)) 1)

procedimiento suma, 1 se evala a 1. compuesto;

compuesto y 3 se evala a 3.

Paradigma Funcional Caso de estudio: Scheme - Lenguajes y paradigmas de programacin

10/17

Evaluando con modelo de sustitucin

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

Paradigma Funcional Caso de estudio: Scheme - Lenguajes y paradigmas de programacin

11/17

Orden de evaluacin normal vs. de aplicacin

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

Paradigma Funcional Caso de estudio: Scheme - Lenguajes y paradigmas de programacin

12/17

Orden de evaluacin normal vs. de aplicacin

1 Expandimos f, dejando (+ 2 1) sin evaluar: (+


(square(double(+ 2 1))) 1)

2 Ahora expandimos square: (+ (* (double (+ 2 1))


(double (+ 2 1))) 1)

3 Y ahora expandimos double: (+ (* (+ (+ 2 1)(+ 2


1))(+ 2 1)(+ 2 1))) 1)

4 Por ltimo, expandimos todo los operadores primitivos y


auto evaluamos los valores. Se hace uno por uno

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)

Paradigma Funcional Caso de estudio: Scheme - Lenguajes y paradigmas de programacin

13/17

Orden de evaluacin normal vs. de aplicacin

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 de evaluacin normal vs. de aplicacin

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

Paradigma Funcional Caso de estudio: Scheme - Lenguajes y paradigmas de programacin

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

> ( define > pi (/ 3.14159 > ( sin

pi

3.14159)

pi a

2) ) (+ 2 ( 3 4) ) )

0.9999999999991198 > ( define > a 14

Paradigma Funcional Caso de estudio: Scheme - Lenguajes y paradigmas de programacin

18/17

También podría gustarte