Cálculo lambda

El cálculo lambda es un sistema formal diseñado para investigar la definición de función,
la noción de aplicación de funciones y la recursión. Fue introducido por Alonzo
Church y Stephen Kleene en la década de1930; Church usó el cálculo lambda
en 1936 para resolver el Entscheidungsproblem. Puede ser usado para definir de manera
limpia y precisa qué es una "función computable". El interrogante de si dos expresiones del
cálculo lambda son equivalentes no puede ser resuelto por un algoritmo general. Esta fue
la primera pregunta, incluso antes que el problema de la parada, para el cual la
indecidibilidad fue probada. El cálculo lambda tiene una gran influencia sobre los lenguajes
funcionales, como Lisp, ML y Haskell.
Se puede considerar al cálculo lambda como el más pequeño lenguaje universal de
programación. Consiste en una regla de transformación simple (sustitución de variables) y
un esquema simple para definir funciones.
El cálculo lambda es universal porque cualquier función computable puede ser expresada
y evaluada a través de él. Por lo tanto, es equivalente a las máquinas de Turing. Sin
embargo, el cálculo lambda no hace énfasis en el uso de reglas de transformación y no
considera las máquinas reales que pueden implementarlo. Se trata de una propuesta más
cercana al software que al hardware.
Este artículo se enfocará sobre el cálculo lambda sin tipos, como fue diseñado
originalmente por Church. Desde entonces, algunos cálculo lambda tipados fueron
creados.
Índice
[ocultar]

1 Historia

2 Introducción informal

3 Definición formal
o

3.1 Sintaxis

o

3.2 Variables libres y ligadas

o

3.3 α-conversión

o

3.4 β-reducción

o

3.5 η-conversión

4 Cálculos aritméticos con lambda

5 Lógica y predicados

6 Pares

7 Recursión

8 Funciones computables y el cálculo lambda

9 Indecisión de equivalencia

10 Cálculo lambda y los lenguajes de programación

11 Concurrencia y paralelismo

12 Véase también

13 Referencias

14 Enlaces externos

Historia[editar]
Originalmente, Church había tratado de construir un sistema formal completo para
modelizar la matemática; pero cuando este 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.

Introducción informal[editar]
Considérese las siguientes dos funciones. Por un lado, 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 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 ser reescrita como una función anónima: x,y → x +
y (que se lee: «el par de x e y se mapea a x + y»). Del mismo modo, I(x) = x 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 y → y expresan la misma función: la función
identidad. Del mismo modo, x,y → x + 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 otrafunción, la cual a su vez acepta un único argumento.
Por ejemplo, x,y → x + y puede ser reescrita como x → (y → x + y). Esta transformación se
conoce como currificación, y puede generalizarse para funciones que aceptan cualquier
número de argumentos. Esta puede parecer difícil de entender, 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 2 y 3 como 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 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). Es
decir, se toma a la función x → (y → x + y) y se la pone como
argumento en z → z. El resultado será obviamente x → (z → x + z),
(igual a la x → (y → x + 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 + 2 se expresa en cálculo lambda
así: λ x.x + 2 (o, equivalentemente, λ y. y + 2 ya que el
nombre de su argumento no es importante). Y el número f(3) sería
escrito como (λ x. x + 2) 3. La aplicación de funciones
es asociativa a izquierda: f xy = (f x) y. Considerando la
función que aplica una función al número 3: λ f. f 3. , podemos
pasarle "sumar 2", quedando así: (λ f. f 3) (λ x. x + 2).
Las tres expresiones:
(λ 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)

tratar de reducir estas expresiones sólo lleva a
encontrarse con la misma expresión o algo más
complejo. (λ x. x x) es conocido como
ω combinador; ((λ x. x x) (λ x. x x)) se
conoce como Ω, ((λx. x x x)
(λ x. x x x)) como Ω2, etc.

Definición formal[editar]
Sintaxis[editar]
En el cálculo lambda, una expresión o 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, x1, x2, y9,...

2. Si t es un término y x es una variable,
entonces (λx.t) es un término (llamado
una abstracción lambda).
3. Si t y s son términos, entonces (ts) es un
término (llamado una aplicación lambda).
4. Nada más es un término.

Las primeras dos reglas generan funciones. y que(λz.(λx. En cambio. ya que no cumplen ninguna función de desambiguación.y representa la función constante x → y. .x)y representa la función identidad aplicada a y.y)) ((x(λz. Luego.z))z) Por convención se suelen omitir los paréntesis externos. λx. Por ejemplo se escribe (λz. y se escribe x(y(zx)) en vez de(x(y(zx))). Por ejemplo.t representa una función anónima que toma un único argumento. una aplicación lambda ts representa la aplicación de un argumento s a una función t.z)z en vez de ((λz. y (λx.x representa la función identidad x → x. Una abstracción lambda λx.z)yzx debe entenderse como ((((λz.z)z). λx. Esto quiere decir. y se dice que el signo λ liga la variable x en el término t.x) ((λx. Además se suele adoptar la convención de que la aplicación de funciones es asociativa hacia la izquierda.Según estas reglas de formación. mientras que la última describe la aplicación de una función a un argumento.x)y) (λz. las siguientes cadenas de caracteres son términos: x (xy) (((xz)y)x) (λx. que xyzz debe entenderse como (((xy)z)z).z)y)z)x). por ejemplo.

En este caso . La ligadura de ocurrencias de una variable está definido recursivamente sobre la estructura de las expresiones lambda. las ocurrencias son libres en E salvo aquellas de V. Lo que las hace interesantes son las muchas nociones de equivalencia y reducción que pueden ser definidas sobre ellas. donde V e s una variable. de esta manera: 1. Ocurrencias ligadas (bound occurrences) 3. Ocurrencias de ligadura (binders) 2. V es una ocurrencia libre.que develve y sin importar qué argumento se le dé.y y z. E) Las ligaduras son x. En expresiones de la forma V. Las expresiones lambda no son muy interesantes por sí mismas. Por ejemplo. Ocurrencias libres (free occurrences) Las variables de ligadura son aquellas que están entre el λ y el punto. siendo E una expresión lambda: (λ x y z. E. 2. Variables libres y ligadas[editar] Las apariciones (ocurrencias) de variables en una expresión son de tres tipos: 1. En expresiones de la forma λ V.

x))x. cada binding tiene una zona de alcance asociada (scope de ahora en adelante) Un ejemplo típico es: (λx. 3.x y λy.x(λx. esta regla no es tan simple como parece a primera vista. Por último la x más a la derecha está libre.las V en E se dicen ligadas por el λ antes V. Como se permite la repetición del identificador de variables. En expresiones de la forma (E E′). esa expresión puede reexpresarse así (λy.y so n la misma función. donde el scope del binding más a la derecha afecta sólo a la x que tiene ahí. Por ejemplo. Hay algunas restricciones que hay que cumplir antes de cambiar el nombre de una variable por otra. pero no incluye el scope de la primera. Si la expresión no tiene variables libres.z))x α-conversión[editar] 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. Por lo tanto. la situación del otro binding es análoga. se dice que es cerrada. Sin embargo. (x y) no definen funciones porque las ocurrencias de y están libres.y(λz. las ocurrencias libres son aquellas ocurrencias de E y E′. si reemplazamos x por y en . Expresiones lambda tales como λ x.

} β-reducción[editar] La regla de beta reducción expresa la idea de la aplicación funcional. por ejemplo. Una expresión de la forma ((λ V. Esta regla nos dice.λx. no es la misma función. En un ejemplo de otro tipo. x) x es equivalente a λ y. i < max. } es equivalente a for (int j = 0. j < max. y E[V := W] representa la expresión E con todas las ocurrencias libres de V en E reemplazadas con W. Este fenómeno se conoce como captura de variables. E == λ W.y. obtenemos λy. La regla de alfa-conversión establece que si V y W son variables. Una lambda expresión .λy. j++) { proc (j). E) E ′) es llamada un beta redex. Enuncia que ((λ V. (λ x. (λ x.x. i++) { proc (i). E es una expresión lambda. se ve que for (int i = 0. x) y. E) E′) == E[V := E′] si todas las ocurrencias de E′ están libres en E[V := E′].λy. que claramente. E[V := W] si W no está libre en E y W no está ligada a un λ donde se haya reemplazado a V. entonces λ V. que λ x.

La eta conversión expresa la idea de extensionalidad. pero si existe. existe un algoritmo para computar la forma normal: la reducción de orden normal. f x y f siempre que x no aparezca sola en f. La ejecución de este algoritmo termina si y sólo si la expresión lambda tiene forma normal. es única. que podría ser añadida a las dos anteriores para formar una nueva relación de equivalencia. Esto puede ser entendido como equivalente a . La eta conversión convierte entre λ x. que en este contexto implica que dos funciones son la misma si y solo si dan el mismo resultado para cualquier argumento. Más aún. No toda expresión lambda tiene forma normal. esta conversión.que no admite ninguna beta reducción se dice que está en su forma normal. El teorema de ChurchRosser 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[edita r] Es la tercer regla.

resulta que la extensionalidad es válida. pero el más común son . descubrimos que la eta conversión es válida. f x == λ x. f x = = f. Cálculos aritméticos con lambda[editar] Hay varias formas posibles de definir los números naturales en el cálculo lambda. tenemos que f x == g x y por tanto λ x. dado que por beta reducción de todo y tenemos que (λ x. resulta que λ x.la extensionalidad así: Si f y g son extensionalmente equivalentes. Inversamente. Entonces. f x) y == f y. en particular tomando a como una variable x que no aparece sola en f ni en g. y así por eta conversión f == g. si aceptamos la eta conversión como válida. si f a== g a par a cualquier expresión lambda a entonces. es decir. g x. es decir. si aceptamos la extensionalidad como válida entonces.

f x 2 := λ f x. que pueden definirse como sigue: 0 := λ f x. Insti ntiv ame nte el núm ero n en el cálc ulo lam bda es una func ión que tom aa otra func ión f co mo argu men to y dev uelv e la nava com posi ción de f . un . f (f (f x)) y así suc esiv ame nte. x 1 := λ f x. f (f x) 3 := λ f x. Así que.los números de Church.

(Vé ase que en el cálc ulo origi nal lam bda de Chu rch era obli gato rio que el pará metr o .núm ero de Chu rch es unaf unci ón de alto nivel -tom a una únic a func ión f co mo pará metr oy otra func ión de pará metr o únic o.

lo que hac e imp osibl e defi nir el 0.) Dad a esta defi nició n de los núm eros de Chu rch.form al de la expr esió n lam bda apar ecie ra al men os una vez en el cuer po de la func ión. se pue de esta blec er una func ión de .

suc esió n que dad o un núm ero n de vuel ve n + 1: SUCC := λ n f x. n f (m f x) P L U S p u e d e e n t e n d e . f ((n f) x) L a s u m a s e d e f i n e a s í : PLUS := λ m n f x.

r s e c o m o u n a f u n c i ó n q u e t o m a d o s n ú m e r o s n a t u r a l e s c o m o .

p a r á m e t r o s d e v o l v i e n d o o t r o . p u e d e v e r i f i c a r s e q u e PLUS 2 3 and 5 s o n e .

x p r e s i o n e s l a m b d a e q u i v a l e n t e s . L a M u l t i p l i c a c i ó n s e e x p r .

e s a c o m o MULT := λ m n. l a i d e a e s q u e m u l t i p l i c a r m y n e s l o m i s m o q u . m (PLUS n) 0.

D e o t r a m a n e r a : MULT := λ m n f. m (n f) L a f u n c i ó n P r e d e c e s .e s u m a r m v e c e s a n .

o r P R E D n = n 1 d e u n e n t e r o p o s i t i v o n e s m á s c o m p l e j .

n (λ g k.a : PRED := λ n f x. PLUS (g k) 1) k) (λ v. x) (λ u. n (λ g h. (g 1) (λ u. h (g f)) (λ u. 0) 0 . u) PRED := λ n.

.

.

.

.

.

.

(ifthenelse FALSE P Q) →β Q (ifthenelse TRUE P Q) →β P .

.

.

.

y .x) (ifthenelse FALSE) →β (λx.(ifthenelse TRUE) →β (λx. x FALSE := λ x y.λy.λy.y) TRUE := λ x y.

.

.

.

.

.

.

p q FALSE OR := λ p q. p TRUE q .AND := λ p q.

p FALSE TRUE AND TRUE FALSE ≡ (λ p q. x) FALSE FALSE →β FALSE . p q FALSE) TRUE FALSE →β TRUE FALSE FALSE ≡ (λ x y.NOT := λ p.

.

ISZERO := λ n. n (λ x. FALSE) TRUE

.

.

λb.CONS := λf.λs.TRUE NULL := λp.FALSE) . p (λx y. p TRUE CDR := λp. b f s CAR := λp. p FALSE NIL := λx.

.

.

.

.

.

.

.

.

. and n·f(n-1). if n = 0. if n>0.f(n) = 1.

.

.

.

g := λ f n. and n·f(n-1). if n>0). if n = 0. . (1.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

(λ x.Y = λ g. g (x x)) (λ x. g (x x)) .

.

.

.

.

si 4>0) 5·(4·(g(Y g) 3)) 5·(4·(λ n.(1.(λ n. si 3>0)) . (1. y 5·(g(Y g)(5-1)). si n = 0. if 3 = 0. si n>0) 4) 5·(1. si n>0) 3)) 5·(4·(1. si 5>0 5·(g(Y g) 4) 5·(λ n. si n = 0. si n>0)) 5 1. y 3·(g(Y g)(3-1)). (1. y n·((Y g)(n-1)). si n = 0. si 5 = 0. y n·((Y g)(n-1)). y n·((Y g)(n-1)). si 4 = 0. y 4·(g(Y g)(4-1)).

...5·(4·(3·(g(Y g) 2))) .