Capítulo 1 Cálculo-λ En 1936 se introdujeron dos modelos computacionales: Alan Turing inventó la máquina de Turing y la noción de función computable en sus máquinas. Alonzo Church inventó un sistema formal llamado Cálculo-λ y la noción de función computable en su sistema. Los lenguajes imperativos como Pascal, C, etc., así como el lenguaje ensamblador están basados en la máquina de Turing. Los lenguajes funcionales como ML, Miranda, Haskell etc., están basados en el cálculo-λ. Objetivo: Introducir el cálculo-λ y mostrar como este sistema captura todas las funciones computables. 1.1. Sintaxis: donde: x pertenece a un conjunto de variables. M ::= x λx.m MM λx.m representa la función cuyo argumento es x y cuya especificación es M (se les conoce como abstracciones). M 1 M 2 representa la aplicación de M 1 a M 2 (se les conoce como aplicaciones). 1.2. Términos que corresponde en Java a: λx.x
2 Cálculo-λ public int id(int x){return x;} o en C a: int id(int x){return x;} 1.3. Asociaciones LM N se asocia hacía la izquierda λx.λy.m se asocia hacia la derecha λx.λy.xyz una aplicación tiene precedencia sobre una abstracción. si M,N son las expresiones respectivamente entonces y no M λx.x ((LM)N) (λx.(λy.m)) λx.λy.((xy)z) MN = (λx.x)y λx.(xy) Ejemplos: Decidir si son términos bien formados y asociar. Expresiones λ: λx.λy.xyλz.z λx.λy.λz.xzyz λx.λy.λz.xz(yz) λx.λy.λz.x(zy)z N y Más reglas: Para simplificar la notación los siguientes términos se tomarán como equivalentes: Considerando los ejemplos anteriores: λx.λy.xyλz.z λxy.xyλz.z λx.λy.λz.xzyz λxyz.xzyz λx.λy.λz.xz(yz) λxyz.xz(yz) λx.λy.λz.x(zy)z λxyz.x(zy)z λx 1.(λx 2.(...(λx n.m)...)) λx 1 x 2...x n.m
1.4 Variables 3 1.4. Variables 1.4.1. Conjunto de variables libres El conjunto de variables libres se define de manera inductiva como: FV (x) = {x} FV (λx.m) = FV (M) {x} FV (M 1 M 2 ) = FV (M 1 ) FV (M 2 ) 1.4.2. Conjunto de variables acotadas El conjunto de variables acotadas se define de manera inductiva como: BV (x) = BV (λx.m) = BV (M) {x} BV (M 1 M 2 ) = BV (M 1 ) BV (M 2 ) 1.5. Término cerrado Un término M se llama cerrado si FV (M) =. En caso contrario el término se conoce como abierto. Note que los conjuntos de variables acotadas y libres no son necesariamente disjuntas; por ejemplo x(λxy.x) Considera el término: λxy.xyz Donde x y y son variables acotadas y z es una variable libre. El término λxy.xxy es cerrado. Subtérminos: Subtérminos de un término Un subtérmino de un término-λ es alguna parte del término que esta bien formada de acuerdo a la gramática. El conjunto de subtérminos se puede definir de la siguiente manera Sub :: T PT Sub(x) = {x} Sub(λx.M) = Sub(M) {(λx.m)} Sub(M 1 M 2 ) = Sub(M 1 ) Sub(M 2 ) {M 1 M 2 } Ejemplos: Calcular el conjunto de variables libres, acotadas y subtérminos de las siguientes expresiones λ λx.λy.xyλz.z
4 Cálculo-λ λx.λy.λz.xzyz λx.λy.λz.xz(yz) λx.λy.λz.x(zy)z 1.6. Conversión En esta sección introducimos el cáculo-λ de manera formal. 1.6.1. Definición El conjunto de términos-λ (notación Λ) se construye a partir de un conjunto infinito de variables V = x 1,x 2,x 3,... usando aplicación y abstracción. Ejemplos: Los siguientes son términos-λ x V x Λ M,N Λ (MN) Λ M Λ,x V (λx.m) Λ y (yx) 1.7. Sustitución Asumiendo que M y N son términos-λ y x una variable, la expresión se lee: M[x := N] sustituir las ocurrencias libres de la variable x por N en M. En algunos libros también se representa mediante {N/x}M. Definición inductiva de M[x := N]: 1. x[x := N] N; 2. y[x := N] y siempre que y x; 3. (PQ)[x := N] (P[x := N])(Q[x := N]);
1.8 Cambio de Variable: Axioma α 5 4. (λy.p)[x := N] λy.(p[x := N]), siempre que y x y y FV (N); 5. (λx.p)[x := N] (λx.p). Ejemplos λy.yz[z := λx.wx] λy.yz[z := λx.yx] 1.8. Cambio de Variable: Axioma α Definición Cambio de variables acotadas: M se genera a partir de M por un cambio de las variables acotadas si M λx.n y M λy.(n[x := y]) donde y no ocurre para nada en N. Axioma α M es α-equivalente a N, se escribe como M α N, si N es el resultado de aplicar a M una serie de cambios de variables acotadas. Es decir: λx.m = λy.m[x := y], siempre que y no ocurra en M. Ejemplo: Cuales expresiones son α-equivalentes?: λx.xy? α λz.zy λx.xy? α λy.yy Regla para la sustitución: (λxyz.x(λy.yz)w)? α (λtuv.t(λz.zv))w Si se desea sustituir M[x := N] no importando que términos denotan M y N, verifique que todas las variables acotadas de M sean diferentes de las variables libres de N. Si lo anterior no se cumple, aplique un cambio de variable en N o bien sustituya a M por un término α-equivalente, hasta que se cumpla el criterio anterior. Posteriormente se pueden aplicar las reglas de sustitución. Ejemplos: λy.yz[z := λx.yx] (λxyz.xzy)[x := λxz.x] (λxyz.xzy)(λxz.x) = (λyz.(λxw.x)zy) = (λyz.(λw.z)y) = (λyz.z)
6 Cálculo-λ 1.9. Teoría ecuacional del cálculo-λ (λx.m)n = M[x := N] regla β Relaciones de equivalencia: Reflexiva M = M Simétrica Transitiva: Otras reglas: M = N N = M M = N N = L M = L M = N MZ = NZ M = N ZM = ZN M = N λx.m = λx.n regla ξ 1.10. Semántica operacional La evaluaci de una expresió se compone de pasos de reducción donde cada uno de los pasos se obtiene por reescritura: e e Partimos de un estado inicial (e) y mediante un proceso de reescritura (reducción) se obtiene un estado final. Cada reducción de e, reemplaza cierta subexpresión de acuerdo con ciertas reglas; tales subexpresiones se llaman redex (reducible expression). Se considera terminada la reducción cuando ya no hay más redex.
1.11 reducciones-λ 7 1.11. reducciones-λ Las reglas de reescritura que se utilizan para reescribir un redex son: α-reduccíon β-reduccíon η-reduccíon La η-reducción (también llamada extensionalidad) expresa la idea de que dos funciones son lo mismo si dan el mismo resultado para todos sus argumentos λx.mx η M El λ-término λx.m x es un η-redex, es decir, se puede reducir mediante una η-reducción. También se dice que M se expande o se extiende a λx.mx. Ejemplos: λxy. + yx η λy. + y η + λx.(λy.y)x η λy.y 1.12. Forma normal Si M = N es demostrable en el cálculo-λ, entonces se denota como λ M = N o sólo como M = N y se dice que M y N son β-reemplazables. M N denota que M y N son el mismo término o que uno se puede obtener a partir del otro a través de renombrar variables acotadas. Ejemplo: (λx.y)z (λx.y)z (λx.x)z (λy.y)z (λx.x)z (λx.y)z Definición: Forma Normal Si M es un término-λ, entonces M está en forma normal si, M no tiene subtérminos de la forma (λx.r)s Si M es un término-λ, entonces M tiene una forma normal si, existe un N tal que N = M y N esta en forma normal. Un λ-término está en forma normal si no contiene ningún redex. Si un λ-término M se reduce a una λ-término N en forma normal, es decir, M N. decimos que N es una forma normal de M. Ejemplo:
8 Cálculo-λ λx.x esta en forma normal. (λxy.x)(λx.x) no esta en forma normal, cuál es su forma normal?. (λx.xx)(λy.yy) no tiene una forma normal! Porqué? Teorema (de Church-Rosser) Para todo λ-término M, si M P y M Q, existe un λ-término E, tal que P E y Q E (propiedad del diamante). Si una secuencia M... termina, entonces lo hace en una forma normal. Es decir, M admite forma normal. 1.13. Combinadores estandar Define los combinadores: I λx.x, K λxy.y, K λxy.x, S λxyz.xz(yz), demostrar si las siguientes ecuaciones son válidas en el cálculo lambda: IM = M, KMN = M, K MN = N, SMNL = ML(NL), En el cálculo-λ se pueden representar expresiones booleanas T K λxy.x F K λxy.y if B then P else Q BPQ. T representa true, verdadero y F representa false, falso. Demuestre que if true then P else Q = P if false then P else Q = Q
1.14 Operaciones aritmeticas 9 Operadores lógicos not λt.tft and λxy.xyf or λxy.xty Imp λxy.xyt Demuestre: Las tablas de valores de verdad de cada conectivo Proponga el termino-λ para bicondicional y verifique su tabla de valores de verdad Ejercicios en clase En el cálculo-λ se pueden representar pares (a,b) = λx.if x then a else b fst λp.p true snd λp.p false. Demuestre que fst(a,b) = a snd(a,b) = b 1.14. Operaciones aritmeticas En el cálculo-λ también se pueden representar numerales (de hecho existe más de una forma aquí se presenta la propuesta de Scott): 0 λxy.x 1 λxy.y 0 2 λxy.y 1 i.e n λxy.y(n 1) También se pueden representar funciones entre numerales succ λzxy.yz
10 Cálculo-λ pred λz.z 0(λx.x) iszero λz.z true(λx.false) Demostrar que: succ 2 = 3 pred 1 = 0 iszero 1 = F 1.14.1. Numerales de Church 0 c 0 λs.λz.z; 1 c 1 λs.λz.sz; 2 c 2 λs.λz.s(sz); 3 c 3 λs.λz.s(s(sz)); etc. Cada número es representado por un combinador c n que toma dos argumentos, s y z (para sucesor y cero), y aplica s, n veces, a z. Sucesor Definiciones: Se define la función sucesor sobre los numerales de Church como sigue: scc λn.λs.λz.s(nsz) El término scc es un combinador que toma un numeral de Church n y regresa otro numeral de Church - es decir, nos da una función que toma argumentos s y z y aplica s repetidamente a z. Obtenemos el numero a la derecha de aplicaciones de s a z por primero pasar s y z como argumentos a n, y entonces explicitamente aplicamos s una vez más al resultado. La función sucesor aplicada a nuestra representación para cero da: scc λw.λy.λx.y(wyx) scc0 (λw.λy.λx.y(wyx))(λs.λz.z) = λy.λx.y((λs.λz.z)yx) = λy.λx.y((λz.z)x) = λy.λx.y(x) 1 Ejercicio: scc1 = 2 Observa que el proposito de aplicar el número λs.λz.s(z) a los argumentos y y x es sólo para renombrar las variables usadas en la definición del numero.
1.14 Operaciones aritmeticas 11 Suma Utilizando la definición anterior de scc, definimos la suma de 2 + 3 = 5: 2scc3 = scc(scc3) = scc4 = 5 Similarmente, la suma de numerales de Church pude ejecutarse por un termino plus que toma dos numerales Church, m y n, como argumentos, y da otro numeral Church (función) que acepta argumentos s y z, aplica s iterando n veces a z (pasando s y z como argumentos a n), y entonces aplica s iterando m veces mas al resultado: Producto plus λm.λn.λs.λz.ms(nsz) La multiplicación de dos numeros x y y puede computarse usando la siguiente función: Ejemplo: El producto de 2 por 2 es: (λxyz.x(yz))22 = λz,2(2z) =... = 4 Otra forma de representar el producto es: prod λxyz.x(yz) times λm.λn.m(plus n)c 0 Ejercicio: Obtenga el resultado de times 2 1 = 2 Potencia excepto para m = 0 Ejercicio: exp 2 1 = 2 Demostrar que: exp λxy.yx succ 2 = 3 plus 1 0 = 1 times 1 2 = 2