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 Λ de todos los λ-términos se define inductivamente con tres reglas:
Cualquier variable u∈V, donde V={x,y,z,…}, es un λ-término. Son los átomos
del lenguaje.
Si M,N∈Λ, entonces (MN)∈Λ (aplicación: el proceso de aplicar una
función a un argumento).
Si u∈V y M∈Λ, entonces (λu.M)∈Λ (abstracción: el
proceso que permite crear nuevas funciones).
Alternativamente, en notación gramatical BNF:
Λ=V∣(ΛΛ)∣(λV.Λ),
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 V se denotan x,y,z,…
Los λ-términos de Λ se denotan L,M,N,P,Q,R,…
Identidad sintáctica (≡): dos λ-términos son idénticos si sus estructuras son
iguales. Por ejemplo, x≡x pero x≡y; también (xz)≡(xz), pero
(xz)≡(xy).
La abstracción λx.M se lee «la función que a cada x le asigna M»; la aplicación
MN se lee «M evaluada en N». Nótese que la sintaxis permite aplicar cualquier término a
cualquier término: nada impide escribir xx. 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:MN significa (MN) y λx.M
significa (λx.M).
La aplicación es asociativa a la izquierda:MNL se interpreta como ((MN)L).
La abstracción tiene mayor precedencia que la aplicación:λx.MN significa
λx.(MN).
Abstracciones combinadas:λxy.M significa λx.(λ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∈Λ, el conjunto de sus subtérminos, denotado
Sub(P), se define por inducción sobre la estructura de P, donde x∈V y
M,N∈Λ:
Variable:Sub(x)={x}.
Aplicación:Sub(MN)=Sub(M)∪Sub(N)∪{MN}.
Abstracción:Sub(λx.M)=Sub(M)∪{λx.M}.
Un λ-término L es un subtérmino de M si L∈Sub(M).
Nota 7.5(Demostraciones por inducción estructural)
La técnica de demostración natural sobre conjuntos definidos recursivamente, como Λ, es la
inducción estructural. La prueba sigue la estructura de la definición inductiva del conjunto y
consta de dos partes:
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.
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 M y N (la hipótesis de inducción) y se prueba para (MN) y
(λx.M).
Lema 7.6(Reflexividad y transitividad de Sub)
Para todos los λ-términos M se tiene:
Reflexividad:M∈Sub(M).
Transitividad: si L∈Sub(M) y M∈Sub(N), entonces
L∈Sub(N).
Demostración.
(1) Reflexividad. Se prueba para cada caso de la inducción estructural:
pues en las tres cláusulas de la Definición 7.3 el propio
término pertenece al conjunto. Por lo tanto, M∈Sub(M) para cualquier M.
(2) Transitividad. Por inducción estructural sobre N.
Caso de variable: sea N=x. Entonces Sub(N)={x}, de modo que
M∈Sub(N) fuerza M=x, y a su vez
L∈Sub(M)={x} fuerza L=x. Por lo tanto,
L∈Sub(N).
Caso de aplicación: sea N≡(PQ), con
Sub(N)=Sub(P)∪Sub(Q)∪{(PQ)}.
De M∈Sub(N) se tienen tres casos. Si M∈Sub(P), la
hipótesis de inducción sobre P da L∈Sub(P)⊆Sub(N).
Si M∈Sub(Q), la hipótesis de inducción sobre Q da
L∈Sub(Q)⊆Sub(N). Si M≡(PQ), entonces
M≡N y L∈Sub(M) es directamente L∈Sub(N).
Caso de abstracción: sea N≡(λx.P), con
Sub(N)=Sub(P)∪{(λx.P)}. De
M∈Sub(N) se tienen dos casos. Si M∈Sub(P), la
hipótesis de inducción sobre P da L∈Sub(P)⊆Sub(N).
Si M≡(λx.P), entonces M≡N y la conclusión es inmediata.
En todos los casos L∈Sub(N).
Ejemplo 7.7(Subtérminos)
Los subtérminos de (xz) son (xz),x,z.
El conjunto de subtérminos de (λx.(xx)) es
{(λx.(xx)),(xx),x}.
Para ((λx.(xx))(λx.(xx))), el conjunto es
{((λx.(xx))(λx.(xx))),(λx.(xx)),(xx),x}.
Obsérvese que, aunque Sub(P) es un conjunto, un mismo subtérmino puede tener
varias ocurrencias en P: aquí (λx.(xx)) ocurre dos veces y x cuatro veces.
Definición 7.8(Subtérmino propio)
Un subtérmino propio de un λ-término M es cualquier subtérmino L de M tal que
L≡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 o la variable cuantificada en
∀xP(x): la x 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 λ es quien crea esta
clasificación:
Las ocurrencias de enlace son las que están inmediatamente después de un símbolo λ.
Las demás ocurrencias son libres o ligadas según estén o no dentro del alcance de una
abstracción λ que las ate:
una variable x es inicialmente libre cuando es usada sola;
en una abstracción (λx.M), todas las ocurrencias libres de x en M se vuelven
ligadas; por esta razón la x inmediatamente después de λ 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 M, el conjunto de variables libres FV(M) se define recursivamente:
(Variable)FV(x)={x}.
(Aplicación)FV(MN)=FV(M)∪FV(N).
(Abstracción)FV(λx.M)=FV(M)∖{x}.
Ejemplo 7.11(Cálculo de FV, cláusula por cláusula)
Mostrar que FV(λx.xy)={y}:
FV(λx.xy)=FV(xy)∖{x}=(FV(x)∪FV(y))∖{x}=({x}∪{y})∖{x}={x,y}∖{x}={y}.(regla de Abstraccioˊn)(regla de Aplicacioˊn en xy)(regla de Variable en x y y)
Mostrar que FV(x(λx.xy))={x,y}:
FV(x(λx.xy))=FV(x)∪FV(λx.xy)={x}∪(FV(xy)∖{x})={x}∪(({x}∪{y})∖{x})={x}∪{y}={x,y}.(regla de Aplicacioˊn)(regla de Abstraccioˊn)(reglas de Aplicacioˊn y Variable)
Nota 7.12(FV recoge nombres, no ocurrencias)
La definición de FV 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) tanto x como y ocurren libres. Sin embargo, solo la
primera ocurrencia de x es libre: la ocurrencia después del λ es de enlace y la última
ocurrencia de x es ligada.
Ejemplo 7.13(Identificación de ocurrencias)
Considérese M≡(λx.xy)(λz.z). Cada ocurrencia de variable se
clasifica así:
Ocurrencias de enlace (inmediatamente después de un λ; su función es crear un
enlace): la x de λx y la z de λz.
Ocurrencias ligadas (dentro del alcance de una ocurrencia de enlace correspondiente): la
x del cuerpo (xy), ligada por λx; y la z del cuerpo (z), ligada por
λz.
Ocurrencia libre (sin ocurrencia de enlace correspondiente que la alcance): la y, ya que
no hay ningún λy en el término.
Términos cerrados
Definición 7.14(Términos lambda cerrados, Λ⁰)
Considérense las siguientes definiciones:
Un λ-término M es cerrado si FV(M)=∅.
Un λ-término cerrado también se llama combinador.
El conjunto de todos los λ-términos cerrados se denota por Λ0.
Un término cerrado no depende de ningún contexto exterior: es una función autocontenida, como la
identidad λx.x o la constante λxy.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.