Documente Academic
Documente Profesional
Documente Cultură
Introducción……………………………………………………………………………………………………………………….3
El cálculo Lambda………………………………………………………………………………………………………………6
Conclusión………………………………………………………………………………………………………………………..14
Mapa Conceptual……………………………………………………………………………………………………………..15
Bibliografía……………………………………………………………………………………………………………………….16
2
Introducción
Al mismo tiempo que Church, otro matemático, Alan Turing, desarrolló una máquina
abstracta para intentar resolver el mismo tiempo de problemas planteados por Church.
Después se demostró que ambos enfoques son equivalentes.
3
lenguajes imperativos es la repetición y el cómputo paso a paso de valores a bajo nivel,
y la asignación de estos valores a posiciones de memoria. Frecuentemente, este no
es el nivel de detalle que nosotros queremos manejar a la hora de programar una
aplicación de gran tamaño. De ahí, que muchos lenguajes de programación tratan de
esconder u ocultar los detalles de bajo nivel asociados a la máquina. Un buen ejemplo
de esto es el manejo de expresiones tales como:
Las expresiones suelen ser usadas porque son simples y jerárquicas. Pueden ser
combinadas para construir expresiones complejas. Por ejemplo, en ALGOL 68 el
último valor computado en un bloque es el valor del bloque. Sin embargo, en general
en este lenguaje, las expresiones también están sujetas a nominaciones, repeticiones
y asignaciones.
4
f(x)+f(x) = 2*f(x). Esto se debe a que el resultado de la expresión depende de la historia
de cómputo de cada subexpresión.
El origen del Lisp se remonta al año 1956, en el que John McCarthy estaba buscando
una solución para programar el computador IBM 704, en los primeros proyectos de
inteligencia artificial. A finales de 1958 McCarthy, ya profesor de Ingeniería Electrónica
y Marvin Minsky, profesor de matemáticas, ambos en el MIT, comenzaron el MIT
Artificial Intelligence Project e iniciaron la implementación del Lisp.
Uno de los factores que contribuyeron más al éxito del Lisp es su carácter pragmático.
No se trata de un lenguaje puramente funcional ni declarativo, sino que es posible
realizar sentencias imperativas en las que se modifican el valor de posiciones de
memoria a las que hacen referencia a variables.
(https://rua.ua.es/dspace/bitstream/10045/4032/1/tema02.pdf)
5
“El Lisp se origina por la necesidad de Jhon McCarthy para programar el
computador IBM 704 que era de los primeros proyectos de inteligencia artificial
por el año de 1958, ya hace bastantes años se empezaba a requerir la
inteligencia artificial y el calculo lambda fue uno de los elementos que inspiro
dicho proyecto.”
El cálculo lambda
(https://rua.ua.es/dspace/bitstream/10045/4032/1/tema02.pdf)
(https://rua.ua.es/dspace/bitstream/10045/4032/1/tema02.pdf)
lambda x.pintado-amarillo x
6
(lambda x.pintado-amarillo x)cuadrado -> pintado-amarillo cuadrado
El resultado de aplicar una expresión-lambda también puede ser una función, como
en el siguiente ejemplo en el definimos un "constructor de funciones coloreadoras":
Podemos usar esto para crear una función que pinta de color verde:
Las funciones también pueden ser argumentos de otras funciones, como esta función
"aplicar-a-mickey-mouse":
lambda f.(f)mickey-mouse
Podemos entonces llamar a esta función con la función "pintado-amarillo" para pintar
a mickey-mouse de amarillo:
(https://rua.ua.es/dspace/bitstream/10045/4032/1/tema02.pdf)
(http://en.wikipedia.org/wiki/Lambda_calculus)
7
Características de la programación funcional
Programación declarativa
Definición y evaluación de funciones
Uso de la recursión
Funciones como datos primitivos
Definición y evaluación de funciones
Estamos definiendo una función con un argumento formal (x) que tiene como cuerpo
la expresión (* x x) y le estamos dando el nombre de cuadrado. Después evaluamos
una expresión en la que llamamos a la función recién definida y a la función primitiva
'+'.
(https://rua.ua.es/dspace/bitstream/10045/4032/1/tema02.pdf)
Uso de la recursión
Otro elemento común a todos los lenguajes funcionales es el uso de la recursión para
expresar funciones que en otros lenguajes se expresan con iteraciones. Muchas veces
es más sencillo y natural utilizar una recursión en la definición de una función.
Factorial
8
Esta expresión tiene una traducción directa en Scheme:
(define (factorial x)
(if (= x 0)
(* x (factorial (- x 1)))))
>(factorial 8) 40320
(https://rua.ua.es/dspace/bitstream/10045/4032/1/tema02.pdf)
(defun factorial(x)
if (= x 0) 1 (* x(factorial (- x 1)))
9
Sumatorio
En Scheme:
75
(https://rua.ua.es/dspace/bitstream/10045/4032/1/tema02.pdf)
Otra característica fundamental de los lenguajes funcionales es que las funciones son
consideradas un tipo de dato primitivo.
Por ejemplo, los números, los caracteres o las cadenas son datos primitivos en la
mayor parte de lenguajes de programación. Sin embargo, resulta poco frecuente que
10
podamos hacer todas estas cosas con una función o un procedimiento. Es una de las
características más sorprendentes de los lenguajes funcionales:
Podemos definir una función que toma como argumentos otras funciones
Podemos devolver un procedimiento como resultado de una llamada a otro
procedimiento
Podemos construir estructuras de datos que contengan procedimientos como
elementos (listas de procedimientos, por ejemplo)
En Scheme cuando se define una función con un nombre, la relación entre la función
y el nombre es la misma que la relación entre una variable y un valor. El nombre de la
función es el identificador que está ligado al procedimiento.
(https://rua.ua.es/dspace/bitstream/10045/4032/1/tema02.pdf)
“Podemos comprobar en el ejemplo que los símbolos 'suma', '+' o '-' no son más
que identificadores ligados a procedimientos”
Por ejemplo, podemos definir la siguiente función aplicar que toma como argumento
una función f 2 argumentos y realiza la llamada a f con los 2 argumentos:
(define (aplicar f x y) (f x y)) > (aplicar + 2 3) 5 > (aplicar * 2 3) 6 (aplicar word 'hola
'adios)
holaadios
En el siguiente ejemplo definimos una función que toma dos procedimientos unarios
(de un argumento) f y g y los aplica a un número:
(define (aplicar-2 f g x) (f (g x))) (define (5+ x) (+ 5 x)) (define (doble x) (* 2 x)) > (aplicar-
2 5+ doble 8) 21
11
(https://rua.ua.es/dspace/bitstream/10045/4032/1/tema02.pdf)
“El autor nos demuestra como una funcion puede ser el argumento de otra con
el ejemplo de hacer una suma del 5 mas el doble del 8 que nos da igual a 21.”
Vamos a definir una función que devuelve otra función. La siguiente función hacer-
suma1 define en su interior la función suma1 y la devuelve.
(define (hacer-sumak k) (define (sumak x) (+ x k)) sumak) (define g (hacer-sumak 8)) >
(g 5) 13
(https://rua.ua.es/dspace/bitstream/10045/4032/1/tema02.pdf)
Veamos un ejemplo que a primera vista puede parecer algo complicado (ya que
mezclamos recursión y funciones como tipos de datos primitivos). Se trata de construir
una función que recorra una lista de funciones unarias (se aplican a un único
argumento) y las vaya aplicando a un argumento.
Vamos a verlo paso a paso. Vamos a ver en primer lugar qué es eso de una lista de
funciones unarias.
12
(define (2+ x) (+ 2 x)) (define (10* x) (* 10 x)) (define (cuadrado x) (* x x)) (define lista-
funcs (list cuadrado 2+ 10*))
La lista lista-funcs es una lista que contiene funciones (no identificadores). Vamos a
comprobarlo. Si miramos su primer elemento el intérprete nos dice lo siguiente:
>((car lista-funcs) 3) 9
Podemos ahora hacer la función aplica-funcs que recorre la lista de funciones y las
aplica a un número:
(define (aplica-funcs lista x) (if (empty? (cdr lista)) ((car lista) x) ((car lista) (aplica-funcs
(cdr lista) x))))
(https://rua.ua.es/dspace/bitstream/10045/4032/1/tema02.pdf)
“En este ejemplo el autor nos quiere dar a entender como una función puede ser
parte de una estructura de datos mayor, por eso nos enseña como poner una
lista de funciones unarias, se esta utilizando car el cual es utilizado en Lisp para
crear listas.”
13
Conclusión
Yo creo que la programación funcional es muy poderosa ya que nos permite pensar
de una forma totalmente diferente cuanto tenemos que resolver un problema, como
problemas de forma cotidiana, mas sin embargo no son las formas más rápidas y
funcional podemos resolver esos problemas cotidianos de forma mucho más rápida y
más eficiente (memoria) que con el otro paradigma de programación. Incluso hay
ocasiones que solo con este paradigma podremos resolver problemas que queremos
resolver (por ejemplo, del tema de la inteligencia artificial). Sin lugar a dudas este
arma poderosa en la Ingeniería de software pues los programas con este paradigma
14
Mapa Conceptual
15
Referencias
(http://en.wikipedia.org/wiki/Lambda_calculus) (Wikipedia)
Prentice-Hall. 1984.
Jones, J & Maynard, C. & Stewart, I. "The Art of Lisp Programming". Springer-Verlag,
1990.
McCarthy & Abrahams & Edwars & Hart & Levin. "LISP 1.5 Programmer's Manual".
1980.
Weley, 1989.
16