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 por » 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 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.
Sea el resultado de reemplazar toda ocurrencia libre de en por . El renombramiento de la variable de enlace , está permitido bajo dos condiciones:
- — la nueva variable no aparece libre en , y
- no es variable de enlace en .
Las dos condiciones no son pedantería. Si , el renombre capturaría esa libre (pasaría a estar ligada, cambiando el significado). Si ya liga dentro de , se produce un conflicto de sombreado (shadowing): el nuevo ligador externo chocaría con el interno.
La relación es la menor relación que contiene el renombramiento de la Definición 7.15 y es:
- compatible: si , entonces , y ;
- reflexiva, simétrica y transitiva (una relación de equivalencia).
Sea , aplicado a .
- — válido: del cuerpo y no es enlace.
- Renombrar es inválido: está libre en el cuerpo y quedaría capturada.
- Renombrar en un solo paso es inválido: ya es variable de enlace en el cuerpo (el interior). La conversión a es verdadera, pero exige pasos intermedios que primero liberen el nombre .
Una variable libre queda capturada cuando una operación textual la coloca bajo un ligador que la ata. Una operación correcta sobre términos lambda debe evitar la captura.
La sustitución, cláusula por cláusula
Sea el término que resulta de sustituir por todas las ocurrencias libres de en . Se define por recursión sobre :
- Variables:
- (1a) ;
- (1b) , si .
- Aplicación: .
- Abstracción: , donde es una variante de tal que .
- La condición impide la captura: las variables libres de no deben quedar atadas por el ligador. La condición impide que el renombre convierta ocurrencias ligadas en objetivos de la sustitución.
- Cuando y , no hace falta renombrar: .
- Cuando , la no ocurre libre en el cuerpo y la sustitución no hace nada: .
Compárense: En la segunda, la cláusula (3) sin renombre da : una función constante que devuelve la libre. En la primera, aplicar la cláusula (3) sin renombrar daría (¡la identidad!), capturando la . La cláusula obliga a elegir fresco: que es -equivalente a , como debe ser: los dos términos de partida eran -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, , 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
Sean y . Entonces:
Por inducción sobre la estructura de ; 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 , el lado derecho re-sustituiría dentro de ocurrencias de que el izquierdo jamás toca.
De aquí en adelante los términos -equivalentes se identifican: se escribe también para la identidad módulo , como . 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.