Está en la página 1de 7

PROGRAMACION

FUNCIONAL
ALUMNO: Moiss Abraham
Bautista Crdova.
PROFESOR: Ing. Csar
Manuel Hernndez Mendoza

INGENIERIA EN SISTEMAS COMPUTACIONALES

08 DE MARZO 2015

En programacin funcional, un programa consta de:


La programacin funcional apareci como un paradigma independiente a
principio de los sesentas.
Su creacin es debida a las necesidades de los investigadores en el campo de la
inteligencia artificial y en sus campos secundarios del clculo simblico,
pruebas de teoremas, sistemas basados en reglas y procesamiento del lenguaje
natural.
Estas necesidades no estaban cubiertas por los lenguajes imperativos de la
poca.
La caracterstica

principal

de

la

programacin

funcional es que los clculos se ven como una funcin


matemtica que hacen corresponder entradas y
salidas.
No hay nocin de posicin de memoria y por tanto,
necesidad de una instruccin de asignacin.
Los bucles se modelan a travs de la recursividad ya
que no hay manera de incrementar o disminuir el
valor de una variable.
Como aspecto prctico casi todos los lenguajes funcionales soportan el
concepto de variable, asignacin y bucle
Estos elementos no forman parte del modelo funcional puro.
un conjunto de operaciones primitivas cuyo significado est predeterminado en
el sistema. Por ejemplo, la suma de nmeros enteros, la resta, el producto, etc.
un conjunto de definiciones de funcin, establecidas por el programador, que
eventualmente emplearn las operaciones primitivas. Por ejemplo, la funcin
factorial.
Un dato de entrada (entendido como la aplicacin de una de las funciones definidas
sobre otros datos). Por ejemplo: fact(2*fact(2)).
La ejecucin del programa funcional consiste en el clculo del valor asociado al dato de
entrada de acuerdo con las definiciones dadas para las funciones en el programa. El
proceso de clculo de dicho valor se conoce como evaluacin del dato de entrada.
Dicha evaluacin puede realizarse de muchas formas, pero hay dos estrategias
fundamentales para llevarla a cabo: la estrategia voraz (eager) y la estrategia
perezosa (lazy). La eleccin de una u otra tiene importantes repercusiones en la
implementacin y en el comportamiento operacional del proceso de evaluacin.

El mtodo de evaluacin (la forma en que se calculan las expresiones) se llama


evaluacin perezosa (lazy evaluation). Con la evaluacin perezosa se calcula una
expresin (parcial) solamente si realmente se necesita el valor para calcular el
resultado. El opuesto es la evaluacin voraz (eager evaluation). Con la
evaluacin voraz se calcula directamente el resultado de la funcin, si se
conoce el parmetro actual.
Dada la evaluacin perezosa del lenguaje es posible tener listas infinitas. En
lenguajes que usan evaluacin voraz (como los lenguajes imperativos), esto no
es posible.
El siguiente ejemplo, tomado de Fokker (95), muestra la potencia de este
concepto. Supongamos la siguiente funcin, para saber si un nmero es primo:
primo :: Int Bool
primo x = divisores x == [1,x]
Esta funcin es totalmente perezosa. Por ejemplo, si evaluamos primo 30 pasa
lo siguiente: Primero se calcula el primer divisor de 30: 1. Se compara este
valor con el primer elemento de la lista [1,30]. Para el primer elemento las
listas son iguales. Despus se calcula el segundo divisor de 30: 2. Se compara el
resultado con el segundo valor de [1,30]: los segundos elementos no son iguales.
El operador == sabe que las dos listas nunca pueden ser iguales si existe un
elemento que difiere. Por eso se puede devolver directamente el valor false, y
as los otros divisores de 30 no se calculan.

E VA LU A C I O N P E R E Z O S A

En la evaluacin mediante paso de parmetros por nombre los

argumentos pueden evaluarse ms veces que en el paso por valor.


Se puede usar punteros para compartir valores de expresiones.
La evaluacin mediante paso de parmetros por nombre usando punteros

para compartir valores de expresiones se llama evaluacin perezosa.


La evaluacin mediante paso de parmetros por valor se llama evaluacin

impaciente.
Evaluacin perezosa del ejemplo anterior:
Cuadrado (1+2)
= x*x con x = 1+2 [por def. cuadrado]
= 3*3 [por def. de +]
= 9 [por def. de *]
Haskell usa evaluacin perezosa.

E S T R AT E G I A D E L A E VA L U A C I N
PEREZOSA
Las estrategias de evaluacin se dividen en dos grupos bsicos, estrictos y no
estrictos, basados en cmo se manejan los argumentos de una funcin.
Una expresin que consta de una funcin aplicada a uno o ms parmetros y que
puede ser "reducida" aplicando dicha funcin la vamos a llamar Redex (Reducible
Expression).
Estrategias bsicas
Tipos
:
De adentro hacia afuera o call-by-value
De afuera hacia adentro o call-by-name
Evaluaciones que no terminan
De adentro hacia afuera o call-by-value:
esta estrategia elige el redex que est "ms adentro" entendiendo por esto al
redex que no contiene otro redex. Si existe ms de un redex que cumple dicha
condicin se elige el que est ms a la izquierda.

aplicamos el primer +
mult (3,2+3)
aplicamos el +
mult (3,5)
aplicamos mult
3*5
aplicamos *
15
Por ejemplo: mult (1+2,2+3)
Esta estrategia asegura que los parmetros de una funcin estn completamente
evaluados antes de que la funcin sea aplicada. Por eso se dice que los parmetros
se pasan por valor.
De afuera hacia adentro o call-by-name:
elige el redex que est "ms afuera" entendiendo por esto al redex que no esta
contenido en otro redex. Si existe ms de un redex que cumple dicha condicin se
elige el que est ms a la izquierda.
aplicamos mult
(1+2) * (2+3)
aplicamos el primer +
3 * (2+3)
aplicamos +
3*5
aplicamos *
15
Ejemplo: mult (1+2,2+3)
El operador * y el + no pueden ser aplicados hasta que sus dos parmetros hayan
sido evaluados a nmeros. A las funciones que cumplen con esta propiedad las
vamos a llamar funciones estrictas.
Evaluaciones que no terminan
Tengan en cuenta la siguiente definicin
inf = 1 + inf
Intentar reducir la expresin inf siempre nos va a dar como resultado una
expresin ms y ms grande (independientemente de la estrategia de evaluacin
que usemos)
inf

aplicamos inf
1 + inf
aplicamos inf (porque + es estricta)
1 + (1 + inf)
aplicamos inf (porque + es estricta)
... 1 + (1 + (1 + (1 + (1 + (1 + .... + inf )))))
Por ende, est evaluacin nunca terminara.
Sabiendo que
fst (x,_) = x
Consideremos la expresin fst (0,inf)
Usando la estrategia call-by-value
fst (0,inf)
aplicamos inf
fst (0, 1 + inf )
aplicamos inf
fst (0, 1 + (1 + inf) )
aplicamos inf
fst (0, 1 + (1 + (1 + inf) ) )
aplicamos inf

Usando call-by-value la evaluacin de la expresin no termina.

Usemos call-by-name:
fst (0,inf)
aplicamos fst
0
Si existe alguna secuencia de evaluacin que haga terminar la evaluacin de la
expresin entonces con la estrategia call-by-name tambin se termina la
evaluacin.

La programacin funcional est constituida mediante definicin de funciones


puramente matemticas. Est basado en un modelo matemtico: lambda-clculo.
Programacin funcional-lgica
Ventajas y Desventajas de los lenguajes funcionales.
Ventajas: Ms fciles de escribir, depurar y mantener que los lenguajes
imperativos gracias a la ausencia de efectos de borde.
Desventajas: Se quedan cortos en portabilidad, riqueza de libreras,
interfaces con otros lenguajes y herramientas de depuracin.

MAPA CONCEPTUAL

También podría gustarte