Introducción al lambda cálculo Del libro: An Introduction to Lambda Calculi for Computer Scientists, Chris Hankin Diciembre 2007
Algoritmos Qué es un algoritmo? distintos modelos de cómputo:
Algoritmos Qué es un algoritmo? distintos modelos de cómputo: máquinas de Turing (formalismo de estilo operacional, máquinas con estado... )
Algoritmos Qué es un algoritmo? distintos modelos de cómputo: máquinas de Turing (formalismo de estilo operacional, máquinas con estado... ) teoría de funciones recursivas (formalismo abstracto)
Algoritmos Qué es un algoritmo? distintos modelos de cómputo: máquinas de Turing (formalismo de estilo operacional, máquinas con estado... ) teoría de funciones recursivas (formalismo abstracto) lambda (λ) cálculo. Introducido por Church en los años 30, orientado a programas en vez de a la máquina. También es un formalismo abstracto. Inspiró los lenguajes funcionales (Lisp, ML,... Haskell)
Abstracción funcional Los métodos en Java, las funciones de C, C++ o Pascal, las funciones de Haskell... todos ellos comparten la misma idea de abstracción funcional: bloques de código parametrizados por uno o más argumentos.
Abstracción funcional Los métodos en Java, las funciones de C, C++ o Pascal, las funciones de Haskell... todos ellos comparten la misma idea de abstracción funcional: bloques de código parametrizados por uno o más argumentos.... después llegaron los módulos, las clases y los objetos, los tipos, etc. Pero, qué es una función?
Qué es una función? En teoría de conjuntos puede representarse/identificarse con su grafo. Por ejemplo, la suma de naturales sería: {((0, 0), 0), ((0, 1), 1), ((0, 2), 2),..., ((1, 0), 1), ((1, 1), 2),...} ({((m, n), p) m, n IN, m + n = p}) Este conjunto representa los pares input/output de la función suma. Dos funciones son iguales si tienen (son) el mismo grafo igualdad extensional.
Qué es una función? En teoría de conjuntos puede representarse/identificarse con su grafo. Por ejemplo, la suma de naturales sería: {((0, 0), 0), ((0, 1), 1), ((0, 2), 2),..., ((1, 0), 1), ((1, 1), 2),...} ({((m, n), p) m, n IN, m + n = p}) Este conjunto representa los pares input/output de la función suma. Dos funciones son iguales si tienen (son) el mismo grafo igualdad extensional. Pero esto no es muy útil desde el punto de vista computacional... nos dice poco sobre cómo computa esa función sus valores...
Qué es una función? En teoría de conjuntos puede representarse/identificarse con su grafo. Por ejemplo, la suma de naturales sería: {((0, 0), 0), ((0, 1), 1), ((0, 2), 2),..., ((1, 0), 1), ((1, 1), 2),...} ({((m, n), p) m, n IN, m + n = p}) Este conjunto representa los pares input/output de la función suma. Dos funciones son iguales si tienen (son) el mismo grafo igualdad extensional. Pero esto no es muy útil desde el punto de vista computacional... nos dice poco sobre cómo computa esa función sus valores... todas las funciones/algoritmos de ordenación de vectores tienen el mismo grafo (son iguales extensionalmente).
Qué es una función? (cont) Nos gustaría representar una función mediante una regla de correspondencia (algoritmo) que describa cómo se calcula el resultado, en vez de tener que manejar el grafo asociado formalismo en el que definir funciones
Qué es una función? (cont) Nos gustaría representar una función mediante una regla de correspondencia (algoritmo) que describa cómo se calcula el resultado, en vez de tener que manejar el grafo asociado formalismo en el que definir funciones Dos funciones serán iguales si están definidas mediante reglas iguales (o equivalentes) igualdad intensional. Supongamos dos funciones con grafos: G 1 = {(1, 2), (2, 4), (3, 6),...} G 2 = {(1, 2), (2, 4), (3, 6),...} Son iguales?
Qué es una función? (cont) Nos gustaría representar una función mediante una regla de correspondencia (algoritmo) que describa cómo se calcula el resultado, en vez de tener que manejar el grafo asociado formalismo en el que definir funciones Dos funciones serán iguales si están definidas mediante reglas iguales (o equivalentes) igualdad intensional. Supongamos dos funciones con grafos: G 1 = {(1, 2), (2, 4), (3, 6),...} G 2 = {(1, 2), (2, 4), (3, 6),...} Son iguales? Supongamos dos funciones, ambas de un argumento (natural). La primera devuelve el resultado de sumar el argumento a sí mismo; la segunda devuelve el resultado de multiplicar su argumento por 2. Son iguales?
λ-cálculo: funciones como reglas de cálculo Dos aspectos a estudiar: Sintaxis o notación o gramática para los λ-términos Teorías: axiomas y reglas para relacionar términos (y también para evaluar/computar con λ-términos)
λ-cálculo: funciones como reglas de cálculo Dos aspectos a estudiar: Sintaxis o notación o gramática para los λ-términos Teorías: axiomas y reglas para relacionar términos (y también para evaluar/computar con λ-términos) Modelos: interpretación semántica (apoyada en la matemática). Nota: nos referimos al λ-cálculo puro. Hay otros λ-cálculos (con tipos, indeterminista,... ).
Sintaxis de los λ-términos Signatura (alfabeto): variables x, y, z,... (cto. infinito) símbolo λ paréntesis ( y ) λ-términos: <term> ::= <var> (elto de V) (λ <var><term>) (abs) (<term> <term>) (app) Λ: cto. de los λ-términos construidos de este modo.
Sintaxis de los λ-términos Signatura (alfabeto): variables x, y, z,... (cto. infinito) símbolo λ paréntesis ( y ) λ-términos: <term> ::= <var> (elto de V) (λ <var><term>) (abs) (<term> <term>) (app) Λ: cto. de los λ-términos construidos de este modo. Por ejemplo, son λ-términos: x (x z) ((x z) (y z)) (λx(λy(λz((x z) (y z)))))
Sintaxis de los λ-términos Signatura (alfabeto): variables x, y, z,... (cto. infinito) símbolo λ paréntesis ( y ) λ-términos: <term> ::= <var> (elto de V) (λ <var><term>) (abs) (<term> <term>) (app) Λ: cto. de los λ-términos construidos de este modo. Por ejemplo, son λ-términos: Intuición: x (x z) ((x z) (y z)) (λx(λy(λz((x z) (y z))))) (abs) definición de función, donde la variable (variable ligada por la abstracción) corresponde al parámetro formal (app) aplicación de funciones.
Observaciones Asumimos que la aplicación asocia por la izda: M N 1... N n (... (M N 1 )... N n )
Observaciones Asumimos que la aplicación asocia por la izda: M N 1... N n (... (M N 1 )... N n ) aparentemente las λ-abstracciones solo permiten definir funciones unarias puesto que solo operan con un argumento, pero no es así. Para definir la suma de naturales haríamos λx (λy (x + y))... supuesto que está definido el símbolo +!!
Observaciones Asumimos que la aplicación asocia por la izda: M N 1... N n (... (M N 1 )... N n ) aparentemente las λ-abstracciones solo permiten definir funciones unarias puesto que solo operan con un argumento, pero no es así. Para definir la suma de naturales haríamos λx (λy (x + y))... supuesto que está definido el símbolo +!! Variantes sintácticas: algunos textos escriben la λ-abstracción λx (λ y (xy)) como (λ x.(λy.(xy))) (pueden omitirse los paréntesis externos) en general se permite la agrupación de variables λx y.(xy) se admite también la notación λx.m como abreviatura de λx 1 x 2... x n.m, que a su vez es λx 1.(λx 2. λx n.m) en Haskell se escriben como \ x y -> x y
Variables libres y ligadas el símbolo λ liga la variable que tiene a continuación de manera análoga a como lo hacen los cuantificarores, en lógica de primer orden. En la expresión λx M, la variable x está ligada por el símbolo λ. Podemos definir variables libres y ligadas de un λ-término de modo análogo a como se hace con las fórmulas de la lógica. Se definen inductivamente (sobre la estructura de los λ-términos): Variables ligadas BV : Λ P(V) BV x = BV (λx M) = {x} (BV M) BV (MN) = (BV M) (BV N) Variables libres FV : Λ P(V) FV x = {x} FV (λx.m) = (FV M) {x} FV (MN) = (FV M) (FV N)
Variables libres y ligadas (cont) cuando (FV M) =, se dice que M es cerrado o también que es un combinador. El conjunto de combinadores se denota como Λ 0.
Variables libres y ligadas (cont) cuando (FV M) =, se dice que M es cerrado o también que es un combinador. El conjunto de combinadores se denota como Λ 0. es cierto que var M = (FV M) (BV M)? (var M: cto. de vars. que aparecen en M)
Variables libres y ligadas (cont) cuando (FV M) =, se dice que M es cerrado o también que es un combinador. El conjunto de combinadores se denota como Λ 0. es cierto que var M = (FV M) (BV M)? (var M: cto. de vars. que aparecen en M) es cierto que para cualquier M se tiene (FV M) (BV M) =?
Variables libres y ligadas (cont) cuando (FV M) =, se dice que M es cerrado o también que es un combinador. El conjunto de combinadores se denota como Λ 0. es cierto que var M = (FV M) (BV M)? (var M: cto. de vars. que aparecen en M) es cierto que para cualquier M se tiene (FV M) (BV M) =? es cierto que (FV M) = var M (BV M)?
Variables libres y ligadas (cont) cuando (FV M) =, se dice que M es cerrado o también que es un combinador. El conjunto de combinadores se denota como Λ 0. es cierto que var M = (FV M) (BV M)? (var M: cto. de vars. que aparecen en M) es cierto que para cualquier M se tiene (FV M) (BV M) =? es cierto que (FV M) = var M (BV M)? Nótese que estas definiciones se hacen sobre la estructura de los términos. Muchas de las demostraciones acerca de términos se hacen por inducción estructural. Por ejemplo, probar que todo λ-término tiene el mismo número de paréntesis abiertos que cerrados (está balanceado).
Subtérminos Definimos el conjunto de sub(λ)términos de una λ-expresión, Sub : Λ P(Λ) como: Sub x = {x} Sub (λx M) = (Sub M) {(λx M)} Sub (M N) = (Sub M) (Sub N) {(M N)}
Contextos Un contexto es un término con huecos representados como [] (que pueden rellenarse con términos para obtener otro término). Formalmente, la clase C[] de los contextos se define como la mínima que cumple: 1. x C[ ] 2. [ ] C[ ] 3. Si C 1 [ ], C 2 [ ] C[ ] entonces (C 1 [ ] C 2 [ ]), (λx C 1 [ ]) C[ ]
Contextos Un contexto es un término con huecos representados como [] (que pueden rellenarse con términos para obtener otro término). Formalmente, la clase C[] de los contextos se define como la mínima que cumple: 1. x C[ ] 2. [ ] C[ ] 3. Si C 1 [ ], C 2 [ ] C[ ] entonces (C 1 [ ] C 2 [ ]), (λx C 1 [ ]) C[ ] O también C[ ] ::= x [ ] (C 1 [ ] C 2 [ ]) (λ.c 1 [ ]), con C 1 [ ], C 2 [ ] C[ ].
Contextos Un contexto es un término con huecos representados como [] (que pueden rellenarse con términos para obtener otro término). Formalmente, la clase C[] de los contextos se define como la mínima que cumple: 1. x C[ ] 2. [ ] C[ ] 3. Si C 1 [ ], C 2 [ ] C[ ] entonces (C 1 [ ] C 2 [ ]), (λx C 1 [ ]) C[ ] O también C[ ] ::= x [ ] (C 1 [ ] C 2 [ ]) (λ.c 1 [ ]), con C 1 [ ], C 2 [ ] C[ ]. Por ejempo (λx.[ ] x) M es un contexto. En general si tomamos un término y reemplazamos cualquiera de sus subtérminos por [ ] tendremos un contexto. Y si tomamos un contexto y reemplazamos cualquiera de sus subtérminos por [ ]?...
Contextos Un contexto es un término con huecos representados como [] (que pueden rellenarse con términos para obtener otro término). Formalmente, la clase C[] de los contextos se define como la mínima que cumple: 1. x C[ ] 2. [ ] C[ ] 3. Si C 1 [ ], C 2 [ ] C[ ] entonces (C 1 [ ] C 2 [ ]), (λx C 1 [ ]) C[ ] O también C[ ] ::= x [ ] (C 1 [ ] C 2 [ ]) (λ.c 1 [ ]), con C 1 [ ], C 2 [ ] C[ ]. Por ejempo (λx.[ ] x) M es un contexto. En general si tomamos un término y reemplazamos cualquiera de sus subtérminos por [ ] tendremos un contexto. Y si tomamos un contexto y reemplazamos cualquiera de sus subtérminos por [ ]?...En general se pueden definir contextos de cualquier aridad (número de huecos), pero solo necesitaremos contextos de aridad 1.
Contextos (cont) Un contexto se puede entender como una función que toma un término y lo coloca en el hueco [ ]. En este sentido los contextos se aplican. Si C [ ] = (λx.[ ] x) M entonces C [λy.y] = (λx.(λy.y) x) M Los conjuntos de variables libres y ligadas pueden también definirse para contextos. Nótese que las variables libres de un término pueden ligarse al ponerlas en contexto (al utilizar ese término como argumento de un contexto). Por ejemplo, si M = x (FV (M) = {x}) y C [ ] = λx.[ ], tenemos C [x] = λx.x (la x queda ligada).
La teoría λ Es una teoría de igualdad para λ-términos ( convertibilidad entre λ-términos), regida por el λ-cálculo siguiente: M = M (REF ) M = N N = M (SIM) M = N N = L M = L (TRA)
La teoría λ Es una teoría de igualdad para λ-términos ( convertibilidad entre λ-términos), regida por el λ-cálculo siguiente: M = M (REF ) M = N N = M (SIM) M = N M Z = N Z (AP 1) M = N Z M = Z N (AP 2) M = N N = L M = L (TRA)
La teoría λ Es una teoría de igualdad para λ-términos ( convertibilidad entre λ-términos), regida por el λ-cálculo siguiente: M = M (REF ) M = N N = M (SIM) M = N N = L (TRA) M = L M = N M Z = N Z (AP 1) M = N Z M = Z N (AP 2) M = N λx.m = λx.n (ξ)
La teoría λ Es una teoría de igualdad para λ-términos ( convertibilidad entre λ-términos), regida por el λ-cálculo siguiente: M = M (REF ) M = N N = M (SIM) M = N N = L (TRA) M = L M = N M Z = N Z (AP 1) M = N Z M = Z N (AP 2) M = N λx.m = λx.n (ξ) (λx.m) N = M[x := N] (β)
La teoría λ (cont) Este cálculo define la relación = (REF ), (SIM) y (TRA) relación de equivalencia (AP 1 ) y (AP 2 ) intuitivamente indican que los términos iguales son iguales en cualquier contexto. (ξ) es una regla de extensionalidad débil, que puede leerse como: si dos términos son iguales, entonces tienen el mismo comportamiento como cuerpo de funciones. (β) corresponde a la aplicación funcional (β-reducción). La expresión [x := N] es una sustitución: reemplazar las apariciones libres de x por N (en el término al que se aplique, M en este caso).
La teoría λ (cont) Este cálculo define la relación = (REF ), (SIM) y (TRA) relación de equivalencia (AP 1 ) y (AP 2 ) intuitivamente indican que los términos iguales son iguales en cualquier contexto. (ξ) es una regla de extensionalidad débil, que puede leerse como: si dos términos son iguales, entonces tienen el mismo comportamiento como cuerpo de funciones. (β) corresponde a la aplicación funcional (β-reducción). La expresión [x := N] es una sustitución: reemplazar las apariciones libres de x por N (en el término al que se aplique, M en este caso). La presentación clásica del λ-calculo incluye la regla de α-conversión: λx.m = λy.m[x := y] (α) y FV M
La teoría λ (cont) Escribimos λ M = N cuando M = N es un teorema del λ-cálculo y se lee como M y N son convertibles.
La teoría λ (cont) Escribimos λ M = N cuando M = N es un teorema del λ-cálculo y se lee como M y N son convertibles. Nótese que el símbolo = ahora es una relación definida por las reglas de este cálculo. Para la igualdad/identidad sintáctica (símbolo a símbolo) utilizaremos el símbolo. M N N = N (por (REF )) pero no es cierto que M = N M N. Por ejemplo, (λx.x) y = y (por (β)), pero (λx.x) y y (no son idénticos).
Teorema del punto fijo Teorema F Λ, X Λ tal que F X = X diremos que X es un punto fijo para F
Teorema del punto fijo Teorema F Λ, X Λ tal que F X = X diremos que X es un punto fijo para F demo: Sea W λx.f (x x) y X W W. Veamos que X es el punto fijo buscado: X WW (λx.f (x x)) W β = F (W W ) F X
Teorema del punto fijo Teorema F Λ, X Λ tal que F X = X diremos que X es un punto fijo para F demo: Sea W λx.f (x x) y X W W. Veamos que X es el punto fijo buscado: X WW (λx.f (x x)) W β = F (W W ) F X Esta demostración es constructiva: permite hacer una construcción efectiva del punto fijo en cuestión.
Punto Fijo Si F λx.x es evidente que cualquier término es un punto fijo para ella...
Punto Fijo Si F λx.x es evidente que cualquier término es un punto fijo para ella... qué punto fijo nos da el teorema?
Punto Fijo Si F λx.x es evidente que cualquier término es un punto fijo para ella... qué punto fijo nos da el teorema? Si F λx y.x y, veamos qué punto fijo nos da el teorema: definimos W λx.f (x x) λx.(λx y.x y) (x x) β = λx y.(x x)y el punto fijo que buscamos será X W W (λx y.(x x)y) (λx y.(x x)y) veamos que efectivamente es un punto fijo: X (λxy.(xx)y)(λxy.(xx)y) β = λy. ( (λxy.(xx)y)(λxy.(xx)y) ) y F X (λxy.xy) (λxy.(xx)y) (λxy.(xx)y) }{{}}{{} F X λy.(λxy.(xx)y) (λxy.(xx)y)y β =
Sustituciones La sustitución que se utiliza en la β-reducción puede plantear problemas de captura de variables, cuando sustituimos una variable por un término que contiene una variable libre en un ámbito en el que esa variable está ligada. tendríamos (λxy.yx)y β? = λy.yx[x := y] λy.yy... pero esto no es correcto!! (se confunde la y ligada con la y externa, libre)
Sustituciones La sustitución que se utiliza en la β-reducción puede plantear problemas de captura de variables, cuando sustituimos una variable por un término que contiene una variable libre en un ámbito en el que esa variable está ligada. tendríamos (λxy.yx)y β? = λy.yx[x := y] λy.yy... pero esto no es correcto!! (se confunde la y ligada con la y externa, libre) intuición: las variables ligadas en una λ-abstracción son mudas, i.e., la λ-abstracción λxz.zx debería ser equivalente (en algún sentido) a la anterior. Pero ahora tenemos (λxz.zx)y β = λz.zx[x := y] λz.zy... que no puede ser lo mismo que antes!! Tres aproximaciones para solucionar este problema...
Sustituciones. Aproximación clásica (Church) Definimos las sutituciones como: 1. x[x := N] N 2. y[x := N] y, si y es distinta de x 3. (λx.m)[x := N] λx.m 4. (λy.m)[x := N] λy.m[x := N] si x FV M o y FV N 5. (λy.m)[x := N] λz.(m[y := z])[x := N] si x FV M y y FV N, siendo z una nueva variable (fresca) 6. (M 1 M 2 )[x := N] (M 1 [x := N] M 2 [x := N]) (5) evita la captura de variables, haciendo previamente un renombramiento de la variable ligada en la λ-abstracción.
Sustituciones. Aproximación clásica (cont) Así tenemos (λxy.yx)y = β λy.(yx)[x := y] 5 λz.((yx)[y := z])[x := y] 6 λz.(y[y := z]x[y := z])[x := y] 1,2 λz.(zx)[x := y] 6 λz.(z[x := y]x[x := y]) 6,6 λz.(zy) Recordemos que la presentación clásica del λ-calculo incluía la α-conversión: λx.m = λy.m[x := y] (α) y FV M que es lo que se hace (o justifica) el renombramiento que se hace en (5)
Sustituciones. Clases de equivalencia para los λ-términos Cambio de variables ligadas: dado M C[λx.N] diremos que el término M C[λy.(N[x/y])] siendo y var N se obtiene a partir de M mediante cambio de variables ligadas. La expresión N[x/y] denota el resultado de reemplazar todas las apariciones de x por y en N (nótese que no hay problemas de caputura porque y var N. α-congruencia: M es α-congruente con N y se escribe M α N si N se obtiene mediante una serie de cambios de variables ligadas a partir de M. Tenemos λx.xy α λz.zy, pero λx.xy α λy.yy
Sustituciones. Clases de equivalencia (cont) Idea: la α-congruencia es una relación de equivalencia. Para aplicar una sustitución M[x := N] se toman representantes adecuados para N y M de modo que x BV M y (BV M) (FV N) =. En general se adopta una convención sobre las variables: si M 1,..., M n aparecen en un determinado contexto, entonces todas las variables ligadas de cada uno de ellos deben escogerse de modo que sean diferentes de todas las variables libres de los demás. De este modo, para aplicar la sustitución M[x := N] se garantiza previamente la convención de variables (para N y M) y el reemplazamiento de todas las apariciones de x por N en M. Nota: en la demo del th de pto fijo se ha utilizado la convención sobre vars. de modo impĺıcito.
Sustituciones. Clases de equivalencia (cont) Ejemplo: var con (λxyz.xzy)(λxz.x) = (λxyz.xzy)(λuv.u) β = λyz.(λuv.u)zy β = λyz.(λv.z)y β = λyz.z En lo que sigue utilizaremos esta aproximación porque es la más cómoda para trabajar manualmente... pero hay otra aproximación interesante (sobre todo para implementar máquinas de reducción).
Sustitucions. Notación de de Bruijn Elimina el problema de la captura de variables, prescindiendo de las variables en las λ-abstracciones: referencia los parámetros formales mediante números (naturales).
Sustitucions. Notación de de Bruijn Elimina el problema de la captura de variables, prescindiendo de las variables en las λ-abstracciones: referencia los parámetros formales mediante números (naturales). Por ejemplo, λxy.x se escribe como λ.λ.2 (el 2 se refiere al parámetro formal introducido por la λ más externa, i.e., el natural indica la distancia (número de λ s intermedias a la que se intrudce ese parámetro.
Sustitucions. Notación de de Bruijn Elimina el problema de la captura de variables, prescindiendo de las variables en las λ-abstracciones: referencia los parámetros formales mediante números (naturales). Por ejemplo, λxy.x se escribe como λ.λ.2 (el 2 se refiere al parámetro formal introducido por la λ más externa, i.e., el natural indica la distancia (número de λ s intermedias a la que se intrudce ese parámetro. Cualquier λ-término cerrado puede traducirse a esta notación: DB x (x 1,..., x n ) = i, si i es el mínimo tal que x x i DB (λx.m) (x 1,..., x n ) = λ(db M (x, x 1,..., x n )) DB (M N) (x 1,..., x n ) = (DB M (x 1,..., x n )) (DB N (x 1,..., x n ))
Ejemplo: Notación de de Bruijn (cont) se representa como λx.x(λy.xy(λz.xyz)) DB (λx.x(λy.xy(λz.xyz))) () λ.(db (x(λy.xy(λz.xyz))) (x)) λ.(db x (x)) (DB(λy.xy(λz.xyz)) (x)) λ.1 (λ.(db(xy(λz.xyz)) (y, x))) λ.1 (λ.(db x (y, x)) (DB y (y, x)) (DB (λz.xyz) (y, x))) λ.1 (λ.2 1 (λ.db (xyz) (z, y, x))) λ.1 (λ.2 1 (λ.3 2 1)) Nótese que se ha cambiado la definición de λ-términos. Es el mínimo conjunto que cumple: 1. cualquier n > 0 es un λ-término 2. Si M y N son λ-términos, entonces M N también lo es. 3. Si M es un λ-término, entonces (λm) también lo es.
Notación de de Bruijn (cont) La regla β se reemplaza por: (λp)q = P[1 := Q] donde: n si n < m n[m := N] n 1 si n > m rename n,1 (N) si n m (M 1 M 2 )[m := N] (M 1 [m := N] M 2 [m := N]) (λm)[m := N] λ(m[m + 1 := N]) (incremento de contador) rename se define como: { j si j < i rename m,i (j) j + m 1 si j i rename m,i (N 1 N 2 ) rename m,i (N 1 ) rename m,i (N 2 ) rename m,i (λn) λ(rename m,i+1 (N))
Notación de de Bruijn (cont) Ejemplo. En notación convencional: λx.(λyz.y)x λx.(λy.λz.y)x = β λx.λz.x En notación de de Bruijn : λ.(λ.λ.2)1 β = λ.(λ.2)[1 := 1] λ.λ.2[2 := 1] λ.λ.rename 2,1 (1) λ.λ.2 Esta notación es más incómoda para trabajar... pero es más adecuada para implementar la β-reducción. No se necesita α-conversión. En lo que sigue adoptamos la notación tradicional y la convención de variables para aplicar sustituciones
Lema de sustitución Lema Si x e y son variables distintas y x FV L, entonces M[x := N][y := L] M[y := L][x := N[y := L]] Demo: por inducción sobre la estructura de M Lema Otras propiedades de las sustituciones: 1. M = M M[x := N] = M [x := N] 2. N = N M[x := N] = M[x := N ] 3. M = M, N = N M[x := N] = M [x := N ] Demo:... (ver libro) Ejercicio la primera propiedad puede también demostrarse por inducción sobre la longitud de la demostración: número de pasos de derivación; si es un axioma la longitud es 0, si no, es 1 más la longitud de las derivaciones correspondientes a las premisas.
Transparencia referencial Lema Sea C[ ] un contexto y N, N Λ. Tenemos: N = N C[N] = C[N ] Demo: por induccion sobre la estructura de C[ ] (ver libro)
Extensionalidad La relación = definida por el λ-cálculo proporciona igualdad intensional: dos términos son iguales si codifican el mismo algoritmo (en algún sentido).... pero: consideremos M λx.yx y N y. Son iguales? Si aplicamos ambos a cualquier L Λ: M L (λx.yx)l β = yl NL yl
Extensionalidad La relación = definida por el λ-cálculo proporciona igualdad intensional: dos términos son iguales si codifican el mismo algoritmo (en algún sentido).... pero: consideremos M λx.yx y N y. Son iguales? Si aplicamos ambos a cualquier L Λ: M L (λx.yx)l β = yl NL yl son iguales!... pero esto no quiere decir que M = N: esta igualdad no es deducible en el λ-cálculo (no es un teorema de λ). Esta es la igualdad extensional.
Extensionalidad (cont) Si queremos tener este tipo de igualdad en nuestra teoría tenemos que añadir una nueva regla o axioma. Dos posibles formas: M x = N x (ext) M = N con x (FV M) (FV N) λx.mx = M (η), si x FV M Lema λ + (ext) y λ + (η) son equivalentes. (demo: ver libro)
Extensionalidad (cont) Si queremos tener este tipo de igualdad en nuestra teoría tenemos que añadir una nueva regla o axioma. Dos posibles formas: M x = N x (ext) M = N con x (FV M) (FV N) λx.mx = M (η), si x FV M Lema λ + (ext) y λ + (η) son equivalentes. (demo: ver libro) Es evidente que este cálculo extendido es más potente que el original (prueba todo lo que prueba el original y más cosas)... entonces por qué no se introduce esta extensión desde el principio?
Extensionalidad (cont) Si queremos tener este tipo de igualdad en nuestra teoría tenemos que añadir una nueva regla o axioma. Dos posibles formas: M x = N x (ext) M = N con x (FV M) (FV N) λx.mx = M (η), si x FV M Lema λ + (ext) y λ + (η) son equivalentes. (demo: ver libro) Es evidente que este cálculo extendido es más potente que el original (prueba todo lo que prueba el original y más cosas)... entonces por qué no se introduce esta extensión desde el principio? la regla η normalmente no se implementa y los términos λx.mx y M son distintos en lenguajes como Haskell o ML.
Consistencia Una ecuación es una fórmula de la forma M = N. Es cerrada si M, N Λ 0. Una teoría ecuacional es consistente cuando NO todas las fórmulas cerradas son teoremas suyos. Lema Tanto λ como λ + (η) son teorías consistentes.
Consistencia Una ecuación es una fórmula de la forma M = N. Es cerrada si M, N Λ 0. Una teoría ecuacional es consistente cuando NO todas las fórmulas cerradas son teoremas suyos. Lema Tanto λ como λ + (η) son teorías consistentes. La consistencia es frágil: puede destruirse añadiendo una sola ecuación. Por ejemplo, si consideramos S λxyz.xz(yz) y K λxy.x y añadimos la ecuación S = K a cualquiera de las teorías λ o λ + (η), éstas se convierten en inconsistentes. demo: ver libro
Incompatibilidad Dados M, N Λ diremos que son incompatibles, escrito M#N si λ + (M = N) es inconsistente. Ejemplo: xx#xy Supongamos xx = xy ξ,2 λxy.xx = λxy.xy (AP 1 ),2 (λxy.xx) M N = (λxy.xy) M N M, N Λ (β),2 M M = M N M, N Λ sea M I λx.x I = N N Λ Cualquier término es igual a la identidad!... entonces podemos probar cualquier igualdad! M = N, puesto que ambos son iguales a la identidad y por transitividad, lo tenemos... inconsistencia!! Esto quiere decir que xx#xy
Incompatibilidad (cont) La técnica utilizada en el ejemplo anterior es útil en general (ojo: no es un algoritmo!): 1. aplicar n veces (ξ) a ambos miembros para obtener una ecuación cerrada 2. aplicar ambos lados de la ecuación a los mismos términos arbitrarios (M 1, M 2,..., M n ) 3. aplicar β-conversiones 4. instanciar los téminos arbitrarios a constantes específicas para intentar derivar una ecuación de la forma término arbitrario = constante Ejercicio: demostrar que la aplicación no es asociativa, i.e., x(yz)#(xy)z
Formas normales Def (formas normales): M Λ es una β-forma normal (β-nf, o simplemente nf) si no tiene subtérminos de la forma (λx.r)s, i.e., no se le puede aplicar β. M Λ tiene una β-forma normal si existe N Λ tal que N = M y N es una forma normal. Por ejemplo, λx.x es una β-nf, (λxy.x)(λx.x) tiene λyx.x como β-nf, (λx.xx)(λx.xx) no tiene β-nf. Por analogía, una βη-forma normal será una β-forma normal que no contiene ningun subtérmino de la forma (λx.rx) con x FV R
Formas normales y completitud Teorema: 1. M tiene una βη-nf M tiene una β-nf 2. Si M y N son β-nf s distintas, entonces M = N no es un teorema del λ-cálculo (análogo para λ + η) 3. Si M y N son βη-nf s distintas, entonces M#N. El uso de βη-nf s es esencial en el ultimo punto: λx.yx e y son β-nf s distintas, pero no son incompatibles (son η-equivalentes). Teorema (completitud): Si M y N tienen λ + η formas normales entonces: λη M = N o λη + (M = N) es inconsistente.