Nivel 1 · El cálculo lambda

Sintaxis: términos y variables libres

En la matemática usual una función es un conjunto de pares ordenados: un objeto derivado de la teoría de conjuntos. El cálculo lambda , inventado por Church en los años treinta, invierte esa jerarquía: la función es el objeto primitivo, y todo lo demás (números, valores de verdad, estructuras de datos) se codifica con funciones. El objetivo original de Church era fundacional: precisar qué funciones son «computables» mediante un algoritmo, pregunta que respondió en Church (1936) . En lugar de decenas de instrucciones, todo el sistema se resume en tres reglas de formación y una regla de cómputo. Esta página presenta las tres reglas de formación; el material sigue a Nederpelt y Geuvers (2014) .

Las tres reglas que generan todo

Definición 7.1 (El conjunto Λ de los λ-términos)

El conjunto Λ\Lambda de todos los λ-términos se define inductivamente con tres reglas:

  1. Cualquier variable uVu \in V, donde V={x,y,z,}V = \{x, y, z, \dots\}, es un λ-término. Son los átomos del lenguaje.
  2. Si M,NΛM, N \in \Lambda, entonces (MN)Λ(M N) \in \Lambda (aplicación: el proceso de aplicar una función a un argumento).
  3. Si uVu \in V y MΛM \in \Lambda, entonces (λu.M)Λ(\lambda u .\, M) \in \Lambda (abstracción: el proceso que permite crear nuevas funciones).

Alternativamente, en notación gramatical BNF: Λ=V  (ΛΛ)  (λV.Λ),\Lambda = V \ \mid\ (\Lambda\, \Lambda) \ \mid\ (\lambda V .\, \Lambda), donde cada alternativa especifica cómo construir λ-términos a través de variables, aplicaciones y abstracciones.

Nota 7.2 (Convenciones de notación)
  • Las variables de VV se denotan x,y,z,x, y, z, \dots
  • Los λ-términos de Λ\Lambda se denotan L,M,N,P,Q,R,L, M, N, P, Q, R, \dots
  • Identidad sintáctica (\equiv): dos λ-términos son idénticos si sus estructuras son iguales. Por ejemplo, xxx \equiv x pero x≢yx \not\equiv y; también (xz)(xz)(x\,z) \equiv (x\,z), pero (xz)≢(xy)(x\,z) \not\equiv (x\,y).

La abstracción λx.M\lambda x.\, M se lee «la función que a cada xx le asigna MM»; la aplicación MNM N se lee «MM evaluada en NN». Nótese que la sintaxis permite aplicar cualquier término a cualquier término: nada impide escribir xxx\,x. Esa libertad tendrá consecuencias importantes más adelante en el módulo.

Nota 7.9 (Convenciones para ahorrar paréntesis)

Para mejorar la legibilidad:

  • Se pueden omitir los paréntesis más externos: MNM N significa (MN)(M N) y λx.M\lambda x .\, M significa (λx.M)(\lambda x .\, M).
  • La aplicación es asociativa a la izquierda: MNLM N L se interpreta como ((MN)L)((M N) L).
  • La abstracción tiene mayor precedencia que la aplicación: λx.MN\lambda x .\, M N significa λx.(MN)\lambda x .\, (M N).
  • Abstracciones combinadas: λxy.M\lambda x y .\, M significa λx.(λy.M)\lambda x .\, (\lambda y .\, M).

Subtérminos: las partes de un término

Un λ-término complejo está construido a partir de otros más simples. Para analizar y manipular estas expresiones se necesita referirse a las partes que lo forman; a estas partes se les llama subtérminos.

Definición 7.3 (Conjunto de subtérminos, Sub)

Dado un λ-término PΛP \in \Lambda, el conjunto de sus subtérminos, denotado Sub(P)\operatorname{Sub}(P), se define por inducción sobre la estructura de PP, donde xVx \in V y M,NΛM, N \in \Lambda:

  1. Variable: Sub(x)={x}\operatorname{Sub}(x) = \{x\}.
  2. Aplicación: Sub(MN)=Sub(M)Sub(N){MN}\operatorname{Sub}(M N) = \operatorname{Sub}(M) \cup \operatorname{Sub}(N) \cup \{M N\}.
  3. Abstracción: Sub(λx.M)=Sub(M){λx.M}\operatorname{Sub}(\lambda x .\, M) = \operatorname{Sub}(M) \cup \{\lambda x .\, M\}.

Un λ-término LL es un subtérmino de MM si LSub(M)L \in \operatorname{Sub}(M).

Nota 7.5 (Demostraciones por inducción estructural)

La técnica de demostración natural sobre conjuntos definidos recursivamente, como Λ\Lambda, es la inducción estructural. La prueba sigue la estructura de la definición inductiva del conjunto y consta de dos partes:

  1. Caso base: se demuestra que la propiedad se cumple para los elementos atómicos (los que no se construyen a partir de otros), como las variables.
  2. Paso inductivo: se demuestra que si la propiedad se cumple para los componentes más simples, también se cumple para los elementos compuestos construidos a partir de ellos: se asume la propiedad para MM y NN (la hipótesis de inducción) y se prueba para (MN)(M N) y (λx.M)(\lambda x .\, M).
Lema 7.6 (Reflexividad y transitividad de Sub)

Para todos los λ-términos MM se tiene:

  1. Reflexividad: MSub(M)M \in \operatorname{Sub}(M).
  2. Transitividad: si LSub(M)L \in \operatorname{Sub}(M) y MSub(N)M \in \operatorname{Sub}(N), entonces LSub(N)L \in \operatorname{Sub}(N).
Demostración.

(1) Reflexividad. Se prueba para cada caso de la inducción estructural:

{M=x    xSub(x),M=(PQ)    (PQ)Sub((PQ)),M=(λx.P)    (λx.P)Sub((λx.P)),\begin{cases} M = x \implies x \in \operatorname{Sub}(x), \\ M = (P\, Q) \implies (P\, Q) \in \operatorname{Sub}((P\, Q)), \\ M = (\lambda x .\, P) \implies (\lambda x .\, P) \in \operatorname{Sub}((\lambda x .\, P)), \end{cases}

pues en las tres cláusulas de la Definición 7.3 el propio término pertenece al conjunto. Por lo tanto, MSub(M)M \in \operatorname{Sub}(M) para cualquier MM.

(2) Transitividad. Por inducción estructural sobre NN.

  • Caso de variable: sea N=xN = x. Entonces Sub(N)={x}\operatorname{Sub}(N) = \{x\}, de modo que MSub(N)M \in \operatorname{Sub}(N) fuerza M=xM = x, y a su vez LSub(M)={x}L \in \operatorname{Sub}(M) = \{x\} fuerza L=xL = x. Por lo tanto, LSub(N)L \in \operatorname{Sub}(N).
  • Caso de aplicación: sea N(PQ)N \equiv (P\, Q), con Sub(N)=Sub(P)Sub(Q){(PQ)}\operatorname{Sub}(N) = \operatorname{Sub}(P) \cup \operatorname{Sub}(Q) \cup \{(P\, Q)\}. De MSub(N)M \in \operatorname{Sub}(N) se tienen tres casos. Si MSub(P)M \in \operatorname{Sub}(P), la hipótesis de inducción sobre PP da LSub(P)Sub(N)L \in \operatorname{Sub}(P) \subseteq \operatorname{Sub}(N). Si MSub(Q)M \in \operatorname{Sub}(Q), la hipótesis de inducción sobre QQ da LSub(Q)Sub(N)L \in \operatorname{Sub}(Q) \subseteq \operatorname{Sub}(N). Si M(PQ)M \equiv (P\, Q), entonces MNM \equiv N y LSub(M)L \in \operatorname{Sub}(M) es directamente LSub(N)L \in \operatorname{Sub}(N).
  • Caso de abstracción: sea N(λx.P)N \equiv (\lambda x .\, P), con Sub(N)=Sub(P){(λx.P)}\operatorname{Sub}(N) = \operatorname{Sub}(P) \cup \{(\lambda x .\, P)\}. De MSub(N)M \in \operatorname{Sub}(N) se tienen dos casos. Si MSub(P)M \in \operatorname{Sub}(P), la hipótesis de inducción sobre PP da LSub(P)Sub(N)L \in \operatorname{Sub}(P) \subseteq \operatorname{Sub}(N). Si M(λx.P)M \equiv (\lambda x .\, P), entonces MNM \equiv N y la conclusión es inmediata.

En todos los casos LSub(N)L \in \operatorname{Sub}(N).

Ejemplo 7.7 (Subtérminos)
  • Los subtérminos de (xz)(x\, z) son (xz),x,z(x\, z), x, z.
  • El conjunto de subtérminos de (λx.(xx))(\lambda x .\, (x\, x)) es {(λx.(xx)), (xx), x}\{(\lambda x .\, (x\, x)),\ (x\, x),\ x\}.
  • Para ((λx.(xx))(λx.(xx)))((\lambda x .\, (x\, x))\, (\lambda x .\, (x\, x))), el conjunto es {((λx.(xx))(λx.(xx))), (λx.(xx)), (xx), x}.\{((\lambda x .\, (x\, x))\, (\lambda x .\, (x\, x))),\ (\lambda x .\, (x\, x)),\ (x\, x),\ x\}. Obsérvese que, aunque Sub(P)\operatorname{Sub}(P) es un conjunto, un mismo subtérmino puede tener varias ocurrencias en PP: aquí (λx.(xx))(\lambda x .\, (x\, x)) ocurre dos veces y xx cuatro veces.
Definición 7.8 (Subtérmino propio)

Un subtérmino propio de un λ-término MM es cualquier subtérmino LL de MM tal que L≢ML \not\equiv M.

Ocurrencias libres, ligadas y de enlace

Las ocurrencias de variables en un λ-término se dividen en tres categorías. La situación es análoga a la de la variable de integración en 01f(x)dx\int_0^1 f(x)\, dx o la variable cuantificada en xP(x)\forall x\, P(x): la xx ahí es un nombre interno, «ligado», mientras que un parámetro que viene del contexto exterior es «libre». En el cálculo lambda, el símbolo λ\lambda es quien crea esta clasificación:

  • Las ocurrencias de enlace son las que están inmediatamente después de un símbolo λ\lambda.
  • Las demás ocurrencias son libres o ligadas según estén o no dentro del alcance de una abstracción λ\lambda que las ate:
    • una variable xx es inicialmente libre cuando es usada sola;
    • en una abstracción (λx.M)(\lambda x .\, M), todas las ocurrencias libres de xx en MM se vuelven ligadas; por esta razón la xx inmediatamente después de λ\lambda se denomina variable de enlace.

Esto lleva a la siguiente definición recursiva.

Definición 7.10 (Conjunto de variables libres, FV)

Dado un λ-término MM, el conjunto de variables libres FV(M)FV(M) se define recursivamente:

  1. (Variable) FV(x)={x}FV(x) = \{x\}.
  2. (Aplicación) FV(MN)=FV(M)FV(N)FV(M N) = FV(M) \cup FV(N).
  3. (Abstracción) FV(λx.M)=FV(M){x}FV(\lambda x .\, M) = FV(M) \setminus \{x\}.
Ejemplo 7.11 (Cálculo de FV, cláusula por cláusula)
  1. Mostrar que FV(λx.xy)={y}FV(\lambda x .\, x\, y) = \{y\}:
FV(λx.xy)=FV(xy){x}(regla de Abstraccioˊn)=(FV(x)FV(y)){x}(regla de Aplicacioˊn en xy)=({x}{y}){x}(regla de Variable en x y y)={x,y}{x}={y}.\begin{aligned} FV(\lambda x .\, x\, y) &= FV(x\, y) \setminus \{x\} && \text{(regla de Abstracción)} \\ &= (FV(x) \cup FV(y)) \setminus \{x\} && \text{(regla de Aplicación en } x\, y\text{)} \\ &= (\{x\} \cup \{y\}) \setminus \{x\} && \text{(regla de Variable en } x \text{ y } y\text{)} \\ &= \{x, y\} \setminus \{x\} = \{y\}. \end{aligned}
  1. Mostrar que FV(x(λx.xy))={x,y}FV(x(\lambda x .\, x\, y)) = \{x, y\}:
FV(x(λx.xy))=FV(x)FV(λx.xy)(regla de Aplicacioˊn)={x}(FV(xy){x})(regla de Abstraccioˊn)={x}(({x}{y}){x})(reglas de Aplicacioˊn y Variable)={x}{y}={x,y}.\begin{aligned} FV\bigl(x(\lambda x.\, x\,y)\bigr) &= FV(x) \cup FV(\lambda x.\, x\,y) && \text{(regla de Aplicación)} \\ &= \{x\} \cup \bigl(FV(x\,y) \setminus \{x\}\bigr) && \text{(regla de Abstracción)} \\ &= \{x\} \cup \bigl((\{x\} \cup \{y\}) \setminus \{x\}\bigr) && \text{(reglas de Aplicación y Variable)} \\ &= \{x\} \cup \{y\} = \{x, y\}. \end{aligned}
Nota 7.12 (FV recoge nombres, no ocurrencias)
  • La definición de FVFV recoge todas las variables que son libres en algún lugar del término. Otras ocurrencias de esas mismas variables pueden estar ligadas.
  • En el término x(λx.xy)x(\lambda x .\, x\, y) tanto xx como yy ocurren libres. Sin embargo, solo la primera ocurrencia de xx es libre: la ocurrencia después del λ\lambda es de enlace y la última ocurrencia de xx es ligada.
Ejemplo 7.13 (Identificación de ocurrencias)

Considérese M(λx.xy)(λz.z)M \equiv (\lambda x .\, x\, y)\, (\lambda z .\, z). Cada ocurrencia de variable se clasifica así:

  • Ocurrencias de enlace (inmediatamente después de un λ\lambda; su función es crear un enlace): la xx de λx\lambda x y la zz de λz\lambda z.
  • Ocurrencias ligadas (dentro del alcance de una ocurrencia de enlace correspondiente): la xx del cuerpo (xy)(x\, y), ligada por λx\lambda x; y la zz del cuerpo (z)(z), ligada por λz\lambda z.
  • Ocurrencia libre (sin ocurrencia de enlace correspondiente que la alcance): la yy, ya que no hay ningún λy\lambda y en el término.

Términos cerrados

Definición 7.14 (Términos lambda cerrados, Λ⁰)

Considérense las siguientes definiciones:

  1. Un λ-término MM es cerrado si FV(M)=FV(M) = \varnothing.
  2. Un λ-término cerrado también se llama combinador.
  3. El conjunto de todos los λ-términos cerrados se denota por Λ0\Lambda^0.

Un término cerrado no depende de ningún contexto exterior: es una función autocontenida, como la identidad λx.x\lambda x.\, x o la constante λxy.x\lambda x y.\, x. La siguiente página aborda la operación que da vida a estos términos: la sustitución (Definición 7.20), y con ella el delicado asunto de renombrar variables ligadas sin cambiar el significado.