El Cálculo Lambda. Es el más pequeño lenguaje universal de programación, consiste en en una regla de transformación simple (sustituir variables) y un esquema simple para definir funciones. El cálculo lambda se puede decir que es equivalente a las máquinas Turing porque es capaz de evaluar y expresar cualquier función computable. Church había querido hacer un sistema formal completo para modelizar la matemática pero después separó el cálculo lambda y lo ideó para que estudiara la computabilidad.
SURGIMIENTO Originalmente, Church había tratado de construir un sistema formal completo para modelizar la Matemática; la Matemática; pero pero cuando éste se volvió susceptible a la paradoja de Russell, separó del sistema al cálculo lambda y lo usó para estudiar la computabilidad, culminando en la respuesta negativa al problema de la parada.
DEFINICIÓN INFORMAL Considérese las siguientes dos Funciones. Por Funciones. Por un lado, la Función la Función Identidad I(x) = x , que toma un único argumento, x , e inmediatamente devuelve x . Por otro lado, la función suma S(x,y) = x + y , que toma dos argumentos, x e e y , y devuelve la suma de ambos: x + y . Usando estas dos funciones como ejemplo, es posible hacer algunas observaciones útiles acerca de varias ideas fundamentales del cálculo lambda. La primera observación es que las funciones no necesitan ser explícitamente nombradas. Esto es, la función S(x,y) = x + y puede puede ser reescrita como una función anónima: x,y → x + y (que (que se lee: «el par de x e e y se se mapea a x a x + y »). »). Del mismo modo, I(x) = x puede puede ser reescrita de forma anónima como x → x , que se lee: «el argumento x se mapea a sí mismo». La segunda observación es que el nombre que se asigne a los argumentos de la función es generalmente irrelevante. Esto es, x → x e e y → y expresan expresan la misma función: la función identidad. Del mismo modo, x,y modo, x,y → x + y y y u,v → u + v expresan la misma función: la función suma. Una tercera observación es que toda función que requiere dos argumentos, como por ejemplo la función suma, puede ser reescrita como una función que acepta un único argumento, pero que devuelve otra función, otra función, la cual a su vez acepta un único argumento. Por ejemplo, x,y ejemplo, x,y → x + y puede puede ser reescrita como x → (y → x + y). y). Esta transformación se conoce como currificación, y puede generalizarse para funciones que aceptan cualquier número de argumentos. Esta puede parecer oscuro, pero se entiende mejor mediante un ejemplo. Considérese la función suma no currificada: x,y → x + y Al tomar a los números números 2 y 3 como como argumentos, argumentos, se obtiene: 2+3
Lo cual es igual a 5. Considérese ahora la versión currificada de la función: x → (y → x + y) Si se toma al número 2 como argumento, se obtiene la función: y → 2 + y Y tomando luego al número 3 como argumento, se obtiene: 2+3 Lo cual es igual a 5. De modo que la versión currificada devuelve el mismo resultado que la versión no currificada. En el cálculo lambda, todas las expresiones representan funciones anónimas de un sólo argumento. Una cuarta observación es que una función puede aceptar como argumento a otra otra función, siempre y cuando esta otra función tenga ella misma un sólo argumento. Por ejemplo, la función identidad puede aceptar como argumento a la función suma (currificada). (currificada). Es decir, se toma a la función x → (y → x + y) y y) y se la pone como argumento en z → z . El resultado será obviamente x obviamente x → (z → x + z), z), (igual a la x la x → (y → x + y)) y) ) pues la función identidad siempre devuelve lo mismo que se le da. En el cálculo lambda, las funciones están definidas por expresiones lambda, que dicen qué se hace con su argumento. Por ejemplo, la función "sumar 2", f ( x x ) = x = x + + 2 se expresa en cálculo lambda así: λ x . x + + 2 ya que el nombre de su x + 2 (o, equivalentemente, λ y . y + argumento no es importante). Y el número f (3) (3) sería escrito como (λ x (λ x . x + x + 2) 3. La aplicación de funciones es asociativa a izquierda: f x y x y = = (f ( f x x ) y . Considerando la función que aplica aplic a una función al número númer o 3: λ f . f 3. , podemos pasarle "sumar 2", quedando así: (λ f . f 3) f 3) (λ x . x + + 2). Las tres expresiones: (λ f. (λ f. f 3)(λ x. x + 2) ,
(λ x. x + 2) 3
y
3+2
son equivalentes. No todas las expresiones lambda pueden ser reducidas a un "valor" definido. Considérese la siguiente: (λ x. (λ x. x x ) (λ x. (λ x. x x) ó (λ x. (λ x. x x x ) (λ x. (λ x. x x x)
tratar de reducir estas expresiones sólo lleva a encontrase con la misma expresión o algo más complejo. (λ x (λ x . x x x ) es conocido como ω combinador; ((λ x ((λ x . x x x ) (λ x (λ x . x x x )) )) se conoce como Ω, ((λ x ((λ x . x x x x x ) (λ x (λ x . x x x x x )) )) como Ω2, etc.
DEFINICIÓN FORMAL Sintaxis En el cálculo lambda, una expresión o expresión o término término se define recursivamente a través de las siguientes reglas de formación: 1. Toda variable es un término: x, y, z, u, v, w, x 1, x2, y9,... 2. Si t es un término y x es una variable, entonces (λx.t) es un u n término tér mino (llamado una abstracción lambda). lambda ). 3. Si t y s son términos, entonces (ts) es un término (llamado una aplicación lambda). lambda ). 4. Nada más es un término. Según estas reglas de formación, las siguientes cadenas de caracteres son términos: x (xy) (((xz)y)x) (λx.x) (( λx.x)y) (λz.(λx.y)) ((x(λz.z))z) Por convención se suelen omitir los paréntesis externos, ya que no cumplen ninguna función de desambiguación. Por ejemplo se escribe (λz.z)z en vez de ((λz.z)z), ((λz.z)z), y se escribe x(y(zx)) en vez de (x(y(zx))). Además se suele adoptar la convención de que la aplicación de funciones es asociativa hacia la izquierda. Esto quiere decir, por ejemplo, que xyzz debe entenderse como (((xy)z)z), (((xy)z)z) , y que (λz.z)yzx debe entenderse como((((λz.z)y)z)x) como((((λz.z)y)z)x).. Las primeras dos reglas generan funciones, mientras que la última describe la aplicación de una función a un argumento. Una abstracción lambda λx.trepresenta λx.trepresenta una función anónima que toma un único argumento, y se dice que el signo λ liga la liga la variable x en el término t. En cambio, una aplicación lambda ts representa la aplicación de un argumento s a una función t. Por ejemplo, λx.x representa la Función Identidad x → x, y (λx.x)y (λx.x)y representa la función identidad aplicada a y. Luego, λx.y λx.y representa la función constante x → y, y, que develve y sin importar qué argumento se le dé. Las expresiones lambda no son muy interesantes por sí mismas. Lo que las hace interesantes son las muchas nociones de equivalencia y reducción que pueden ser definidas sobre ellas.
VARIABLES LIBRES Y LIGADAS Las apariciones (ocurrencias) de variables en una expresión son de tres tipos: 1. Ocurrencias de ligadura (binders) 2. Ocurrencias ligadas (bound occurrences) 3. Ocurrencias libres (free occurrences) Las variables de ligadura son aquellas que están entre el λ y el punto. Por ejemplo, siendo E una expresión lambda: (λ x (λ x y z. E) Los binders son x,y y z. El binding de ocurrencias de una variable está definido recursivamente sobre la estructura de las expresiones lambda, de esta manera: 1. En expresiones de la forma V , donde V es una variable, V es una ocurrencia libre. 2. En expresiones de la forma λ V . E , las ocurrencias ocurrencias son son libres en en E salvo salvo aquellas de V . En este caso las V en en E se se dicen ligadas por el λ antesV antesV . 3. En expresiones de la forma ( E E′ E E′ ), ), las ocurrencias libres son aquellas ocurrencias de E y y E′ . Expresiones lambda tales como λ x . ( x y x y ) no definen funciones porque las ocurrencias de y están están libres. Si la expresión no tiene variables libres, se dice que es cerrada. Como se permite la repetición del identificador de variables, cada binding tiene una zona de alcance asociada (scope de ahora en adelante) Un ejemplo típico es: (λx.x(λx.x))x, (λx.x(λx.x))x, donde el scope del binding más a la derecha afecta sólo a la x que que tiene ahí, la situación del otro binding es análoga, pero no incluye el scope de la primera. Por último la x más más a la derecha está libre. Por lo tanto, esa expresión puede reexpresarse así (λy.y(λz.z))x
α-CONVERSIÓN La regla de alfa-conversión fue pensada para expresar la idea siguiente: los nombres de las variables ligadas no son importantes. Por ejemplo λ x x . x y λy .y son la misma función. Sin embargo, esta regla no es tan simple como parece a primera vista. Hay algunas restricciones que hay que cumplir antes de cambiar el nombre de una variable por otra. Por ejemplo, si reemplazamos x reemplazamos x por por y en y en λ x .λy .λy x .x , obtenemos λy λ y .λy .λy .y , que claramente, no es la misma función. Este fenómemo se conoce como captura de variables. La regla de alfa-conversión establece que si V y y W son W son variables, E es una expresión lambda, y
E[V := W] representa la expresión E con E con todas las ocurrencias libres de V en en E reemplazadas reemplazadas con W , entonces λ V. E == λ W. λ W. E[V := W] si W no no está libre en E y y W no no está ligada a un λ donde se haya reemplazado a V. Esta regla nos dice, por ejemplo, que λ x . (λ x (λ x . x ) x es equivalente a λ y . (λ x (λ x . x ) y . En un ejemplo de otro tipo, se ve que for (int i = 0; i < max; i++) { proc (i); } es equivalente a for (int j = 0; j < max; j++) { proc (j); }
β-REDUCCIÓN La regla de beta reducción expresa la idea de la aplicación funcional. Enuncia que ((λ V. ((λ V. E) E′ ) == E[V := E′ ] si todas las ocurrencias de E′ están están libres en E [V := := E′ ]. ]. Una expresión de la forma ((λ V . E ) E′ ) es llamada un beta redex. Una lambda expresión que no admite ninguna beta reducción se dice que está en su forma normal. normal. No toda expresión lambda tiene forma normal, pero si existe, es única. Más aún, existe un algoritmo para computar la formal normal: la reducción de orden normal. La ejecución de este algoritmo termina si y sólo si la expresión lambda tiene forma normal. El Teorema de Church-Rosser nos dice que dos expresiones reducen a una misma si y sólo si son equivalentes (salvo por el nombre de sus variables ligadas)
ƞ-CONVERSIÓN Es la tercer regla, eta conversión, que podría ser añadida a las dos anteriores para formar una nueva relación de equivalencia. La eta conversión expresa la idea de extensionalidad, que en este contexto implica que dos funciones son la misma si y solo si dan el mismo resultado para cualquier argumento. La eta conversión convierte entre λ x . f x x y f siempre que x que x no aparezca sola en f . Esto puede ser entendido como equivalente a la extensionalidad así: Si f y y g son g son extensionalmente extensionalment e equivalentes, es decir, si f a f a== g a g a para cualquier expresión lambda a entonces, en particular tomando a como una variable x variable x que que no aparece sola en f ni ni en g , tenemos que f x x == g x x y por tanto λ x . f x x == == λ x . g x x , y así por eta conversión f == g . Entonces, si aceptamos la eta conversión como válida, resulta que la extensionalidad es válida.
Inversamente, si aceptamos la extensionalidad como válida entonces, dado que por beta reducción de todo y tenemos tenemos que (λ x (λ x . f x x ) y == == f y f y , resulta que λ x . f x x == f ; es decir, descubrimos que la eta conversión es válida.
APLICACIÓN PRÁCTICA
Características: -Escrito en html5 -Diseño adaptable -Utiliza java script -Se hace uso de la librería “lambda -min.js” escrita por el profesor Carl Burch disponible en: http://www.cburch.com/ Esta aplicación resuelve ejercicios del tipo numérico simplificando las expresiones para obtener el resultado buscado
Funcionamiento: Si por ejemplo se desea calcular la expresión: (λy.4 (λy.4 × y) ((λz.z² ((λz.z² + 2 × z) 5) Esta debe escribirse de la siguiente manera:
(\y.* 4 y) ((\z.+ (* z z ) (* 2 z)) 5)
El resultado esperado seria:
Como se observa el desarrollo se da paso por paso simplificando las expresiones y reemplazando por los valores esperados Los operadores soportados son: +, -, *, / dados dos números enteros , se aplican la operación aritmética a ellos
=, /=, <, >, <=, >= dados dos números enteros , se aplican la comparación para llegar al identificador de verdadero o falso
If dado tres valores de los cuales el primero es verdadero o falso , devuelva el segundo valor si la primera es verdadera y la tercera si la primera es falsa
Conclusiones El cálculo lambda es computacionalmente equivalente en poder a muchos otros modelos plausibles para el cómputo (máquinas de Turing incluídas); es decir, cualquier cálculo que se pueda lograr en cualesquiera de estos otros modelos se puede expresar en el cálculo lambda y viceversa. Según la tesis de Church-Turing, ambos modelos pueden expresar cualquier cómputo posible. Quizás parezca sorprendente que el cálculo lambda pueda representar cualquier cómputo concebible usando solamente las nociones simples de abstracción funcional y aplicación basado en la substitución textual simple de términos por variables. Pero aún más notable es que incluso la abstracción no es requerible: la lógica combinatoria es un modelo del cómputo equivalente al cálculo lambda, pero sin la abstracción.
Bibliografia -http://www.ecured.cu/index.php/C%C3%A1lculo_lambda#Conclusiones -http://www.cs.buap.mx/~mtovar/doc/FLP14/ejerCalculolambda.pdf - http://www.cburch.com/