Nivel 1 · El cálculo lambda

Sustitución y α-conversión

La operación central del cálculo lambda — aplicar una función a un argumento — se reducirá en la página siguiente a sustituir un término en otro. Esta página define esa operación con total precisión, porque es exactamente el punto donde la intuición «reemplaza xx por NN» falla si no se tiene cuidado: una variable libre puede quedar capturada por un ligador. Todo el material sigue a Nederpelt y Geuvers (2014) .

El nombre de una variable ligada no importa

Las funciones λx.x\lambda x.\, x y λy.y\lambda y.\, y son la misma función identidad escrita con distinto nombre de variable. La relación que lo formaliza se construye en dos pasos: primero el renombramiento de una sola variable de enlace, después su clausura.

Definición 7.15 (Renombramiento; M^{x→y})

Sea MxyM^{x \to y} el resultado de reemplazar toda ocurrencia libre de xx en MM por yy. El renombramiento de la variable de enlace xx, λx.M=αλy.Mxy,\lambda x.\, M =_\alpha \lambda y.\, M^{x \to y}, está permitido bajo dos condiciones:

  1. yFV(M)y \notin FV(M) — la nueva variable no aparece libre en MM, y
  2. yy no es variable de enlace en MM.

Las dos condiciones no son pedantería. Si yFV(M)y \in FV(M), el renombre capturaría esa yy libre (pasaría a estar ligada, cambiando el significado). Si yy ya liga dentro de MM, se produce un conflicto de sombreado (shadowing): el nuevo ligador externo chocaría con el interno.

Definición 7.16 (α-equivalencia)

La relación =α=_\alpha es la menor relación que contiene el renombramiento de la Definición 7.15 y es:

  1. compatible: si M=αNM =_\alpha N, entonces ML=αNLML =_\alpha NL, LM=αLNLM =_\alpha LN y λz.M=αλz.N\lambda z.\, M =_\alpha \lambda z.\, N;
  2. reflexiva, simétrica y transitiva (una relación de equivalencia).
Ejemplo 7.18 (Un renombre válido y dos inválidos)

Sea Mλx.x(λz.xy)M \equiv \lambda x.\, x(\lambda z.\, x\,y), aplicado a zz.

  1. (λx.x(λz.xy))z=α(λu.u(λz.uy))z(\lambda x.\, x(\lambda z.\, x\,y))\,z =_\alpha (\lambda u.\, u(\lambda z.\, u\,y))\,zválido: uFVu \notin FV del cuerpo y uu no es enlace.
  2. Renombrar xyx \mapsto y es inválido: yy está libre en el cuerpo y quedaría capturada.
  3. Renombrar xzx \mapsto z en un solo paso es inválido: zz ya es variable de enlace en el cuerpo (el λz\lambda z interior). La conversión a (λz.z(λx.zy))z(\lambda z.\, z(\lambda x.\, z\,y))\,z es verdadera, pero exige pasos intermedios que primero liberen el nombre zz.
Definición 7.17 (Captura de variables)

Una variable libre queda capturada cuando una operación textual la coloca bajo un ligador λ\lambda que la ata. Una operación correcta sobre términos lambda debe evitar la captura.

La sustitución, cláusula por cláusula

Definición 7.20 (Sustitución)

Sea M[x:=N]M[x := N] el término que resulta de sustituir NN por todas las ocurrencias libres de xx en MM. Se define por recursión sobre MM:

  1. Variables:
    • (1a) x[x:=N]Nx[x := N] \equiv N;
    • (1b) y[x:=N]yy[x := N] \equiv y, si x≢yx \not\equiv y.
  2. Aplicación: (PQ)[x:=N](P[x:=N])(Q[x:=N])(P\, Q)[x := N] \equiv (P[x := N])\,(Q[x := N]).
  3. Abstracción: (λy.P)[x:=N]λz.(Pyz[x:=N])(\lambda y.\, P)[x := N] \equiv \lambda z.\, (P^{y \to z}[x := N]), donde λz.Pyz\lambda z.\, P^{y \to z} es una variante α\alpha de λy.P\lambda y.\, P tal que zFV(N){x}z \notin FV(N) \cup \{x\}.
Nota 7.21 (Observaciones sobre la cláusula (3))
  • La condición zFV(N)z \notin FV(N) impide la captura: las variables libres de NN no deben quedar atadas por el ligador. La condición z≢xz \not\equiv x impide que el renombre convierta ocurrencias ligadas en objetivos de la sustitución.
  • Cuando y≢xy \not\equiv x y yFV(N)y \notin FV(N), no hace falta renombrar: (λy.P)[x:=N]λy.(P[x:=N])(\lambda y.\, P)[x := N] \equiv \lambda y.\, (P[x := N]).
  • Cuando yxy \equiv x, la xx no ocurre libre en el cuerpo y la sustitución no hace nada: (λx.P)[x:=N]λx.P(\lambda x.\, P)[x := N] \equiv \lambda x.\, P.
Ejemplo 7.22 (Dónde muerde la captura)

Compárense: (λy.x)[x:=y]y(λw.x)[x:=y].(\lambda y.\, x)[x := y] \quad\text{y}\quad (\lambda w.\, x)[x := y]. En la segunda, la cláusula (3) sin renombre da λw.y\lambda w.\, y: una función constante que devuelve la yy libre. En la primera, aplicar la cláusula (3) sin renombrar daría λy.y\lambda y.\, y (¡la identidad!), capturando la yy. La cláusula obliga a elegir zz fresco: (λy.x)[x:=y]λz.y,(\lambda y.\, x)[x := y] \equiv \lambda z.\, y, que es α\alpha-equivalente a λw.y\lambda w.\, y, como debe ser: los dos términos de partida eran α\alpha-equivalentes.

Pruébalo tú mismo

El reductor aplica la Definición 7.20 tal cual: cuando la cláusula (3) exige renombrar, la advertencia α aparece con su justificación. Carga el segundo preset, (λx.λy.xy)y(\lambda x.\, \lambda y.\, x\,y)\,y, y observa el renombre forzado.

Reductor β interactivo

La sustitución sigue la Definición del texto: (λy. P)[x := N] ≡ λz. (P^{y→z}[x := N]) con z ∉ FV(N) ∪ {x}; el renombre se muestra cuando ocurre.

El lema que hace todo componible

Lema 7.23 (Lema de Sustitución)

Sean x≢yx \not\equiv y y xFV(L)x \notin FV(L). Entonces: M[x:=N][y:=L]M[y:=L][x:=N[y:=L]].M[x := N][y := L] \equiv M[y := L][x := N[y := L]].

Demostración.

Por inducción sobre la estructura de MM; los casos de variable y aplicación son directos, y el caso de abstracción usa que los renombres de la cláusula (3) pueden elegirse frescos para ambos lados. Los detalles están en Nederpelt y Geuvers (2014) , Lema 1.6.5. Las dos hipótesis son esenciales: sin xFV(L)x \notin FV(L), el lado derecho re-sustituiría dentro de LL ocurrencias de xx que el izquierdo jamás toca.

Nota (Convención de identificación módulo α)

De aquí en adelante los términos α\alpha-equivalentes se identifican: se escribe \equiv también para la identidad módulo α\alpha, como λx.xλy.y\lambda x.\, x \equiv \lambda y.\, y. Esta convención es distinta de la convención de Barendregt (elegir nombres de variables ligadas distintos entre sí y distintos de las libres); juntas hacen que la cláusula (3) casi nunca necesite renombrar en la práctica.