La página anterior fijó la forma del juicio Γ⊢M:σ
(Definición 7.51).
Para verificar si un λ-término es tipable se introduce ahora un sistema de
derivación: tres reglas, una por cada forma de término de la
Definición 7.50.
Un juicio es derivable si se obtiene aplicando estas reglas un número finito de veces. Todo el
material sigue a Nederpelt y Geuvers (2014)
.
Las reglas de derivación
(variable): una declaración x:σ presente en el contexto Γ es derivable en
ese mismo contexto.
Γ⊢x:σsi(x:σ)∈Γ.
(aplicación): si M:σ→τ y N:σ son válidos en el contexto
Γ, entonces MN:τ es derivable en el mismo contexto.
Γ⊢MN:τΓ⊢M:σ→τΓ⊢N:σ.
(abstracción): si M:τ es derivable en el contexto extendido Γ,x:σ,
entonces λx:σ.M:σ→τ es derivable en Γ.
Γ⊢λx:σ.M:σ→τΓ,x:σ⊢M:τ.
La notación de fracción se lee de arriba hacia abajo: los juicios sobre la línea son las
premisas y el juicio bajo la línea es la conclusión. Vale la pena observar el movimiento de
las declaraciones: la regla (aplicación) mantiene el contexto fijo, mientras que la regla
(abstracción) retira la declaración x:σ del contexto y la convierte en la parte
izquierda de un tipo flecha. Las variables libres se pagan con declaraciones; las ligadas, con
flechas.
Primera derivación: la función constante
Ejemplo 7.52(Derivación simbólica de la función «constante»)
Demostrar el juicio:
⊢λx:σ.λy:τ.x:σ→(τ→σ).
Demostración.
Sea x:σ,y:τ el contexto inicial.
El objetivo es demostrar el juicio x:σ,y:τ⊢x:σ. Se aplica la
regla (variable), ya que la declaración (x:σ) es un miembro del contexto
{x:σ,y:τ}. Esto establece el juicio inicial:
x:σ,y:τ⊢x:σ.(1)
El objetivo es demostrar x:σ⊢λy:τ.x:τ→σ.
Usando el juicio (1) como premisa, se aplica la regla (abstracción): se abstrae la
variable y, se elimina y:τ del contexto y se construye un tipo flecha:
x:σ⊢λy:τ.x:τ→σx:σ,y:τ⊢x:σ.(2)
El objetivo es demostrar el juicio final. Se aplica nuevamente la regla (abstracción),
usando ahora el juicio (2) como premisa. Esta vez se abstrae la variable x, eliminando
x:σ del contexto, que queda vacío:
∅⊢λx:σ.(λy:τ.x):σ→(τ→σ)x:σ⊢λy:τ.x:τ→σ.
La composición de los pasos (1), (2) y (3) forma el siguiente árbol de derivación, que
representa la prueba completa en una única estructura formal:
El siguiente ejemplo, tomado de la tesis, ejercita las tres reglas, incluida (aplicación).
Ejemplo 7.53(Derivación con las tres reglas)
Demostrar el juicio:
⊢λy:α→β.λz:α.yz:(α→β)→(α→β).
Demostración.
Sea Γ1={y:α→β,z:α} el contexto inicial.
Para derivar la aplicación yz, primero se necesita el tipo de y. En Γ1 la
declaración y:α→β está presente, y la regla (variable) se aplica:
y:α→β,z:α⊢y:α→β.(1)
De manera similar se necesita el tipo de z. En el mismo contexto Γ1 la declaración
z:α está presente, por lo que la regla (variable) se aplica de nuevo:
y:α→β,z:α⊢z:α.(2)
Con los juicios (1) y (2) como premisas, la regla (aplicación) combina la función y su
argumento para producir el resultado:
Γ1⊢yz:βΓ1⊢y:α→βΓ1⊢z:α.(3)
El objetivo es demostrar
y:α→β⊢λz:α.yz:α→β.
Usando el juicio (3) como premisa, se aplica la regla (abstracción) para la variable z,
lo que elimina z:α del contexto:
y:α→β⊢λz:α.yz:α→βy:α→β,z:α⊢yz:β.(4)
Para demostrar el juicio original se aplica la regla (abstracción) por última vez, usando
el juicio (4) como premisa para abstraer la variable y. Esto elimina
y:α→β y deja el contexto vacío:
∅⊢λy:α→β.(λz:α.yz):(α→β)→(α→β)y:α→β⊢λz:α.yz:α→β.
Notación de banderas
Una alternativa para evitar la repetición de declaraciones en los contextos es la notación de
banderas: las declaraciones se presentan en recuadros (las «banderas») y se asume que forman
parte del contexto de todos los juicios escritos bajo ellas. El mismo ejemplo se reescribe,
siguiendo el ejemplo 2.4.6 de Nederpelt y Geuvers (2014)
, así:
(1)
y:α→β
introducción de y
(2)
z:α
introducción de z
(3)
y:α→β
(variable) en (1)
(4)
z:α
(variable) en (2)
(5)
yz:β
(aplicación) en (3) y (4)
(6)
λz:α.yz:α→β
(abstracción) en (5)
(7)
λy:α→β.λz:α.yz:(α→β)→α→β
(abstracción) en (6)
Este formato resulta más compacto y fácil de leer, especialmente para derivaciones complejas. En
general, la notación de banderas equivale a la notación lineal y de árbol por medio de la
siguiente relación: cada línea derivada dentro de las banderas es el juicio cuyo contexto son
las banderas abiertas en ese punto,
donde «Paso k» denota el k-ésimo paso de derivación (las líneas (3) a (7)).
Explóralo tú mismo
El siguiente widget contiene exactamente la derivación del
Ejemplo 7.53 y, como calentamiento, la de la función
identidad. Cada juicio puede expandirse hacia arriba hasta sus premisas, y el botón de la
esquina alterna entre la presentación de árbol y la de banderas: son la misma
derivación.
Explorador de derivaciones de tipado (λ→)
Se parte de la conclusión; pulsa «+» para preguntar de dónde sale cada juicio (leyendo las reglas de abajo hacia arriba).
⊢λx:σ.x:σ→σ
Pasa el cursor por el nombre de una regla para ver su esquema. Las dos vistas presentan la MISMA derivación.
Términos legales
Con el sistema de derivación disponible, la noción de «estar bien tipado» adquiere su forma
definitiva.
Definición 7.54(Término legal)
Un término pre-tipado M en λ→ se denomina legal si existen un contexto
Γ y un tipo ρ tales que
Γ⊢M:ρ.
El lema de variables libres
La primera propiedad general de λ→ conecta la sintaxis pura (el conjunto
FV de la
Definición 7.10)
con el sistema de tipado (el dominio de un contexto, de la
Definición 7.55).
Lema 7.57(Variables libres)
Si Γ⊢L:σ, entonces el conjunto de variables libres de L es un subconjunto
del dominio de Γ, es decir, FV(L)⊆dom(Γ).
Esto garantiza que cada variable libre en un término legal tiene un tipo asignado
explícitamente en el contexto de tipado.
Demostración.
A probar: FV(L)⊆dom(Γ). La prueba se realiza por inducción
estructural sobre la derivación de Γ⊢L:σ. Para cada caso se analiza la
forma del término L y la regla de tipado que lo justifica.
(Variable). El término es L≡x. La forma del juicio es Γ⊢x:σ.
Por regla de (variable): la validez de este juicio exige que la declaración
(x:σ) esté en el contexto Γ.
Por definición de dominio: si (x:σ)∈Γ, se sigue que
x∈dom(Γ).
Por la Definición 7.10,
cláusula de variables: el conjunto de variables libres para una variable es
FV(x)={x}.
Por lo tanto, se concluye directamente que FV(x)⊆dom(Γ).
(Aplicación). El término es L≡MN. La forma del juicio es
Γ⊢MN:τ.
Por regla de (aplicación): este juicio se deriva de dos premisas con el mismo contexto:
Γ⊢M:σ→τyΓ⊢N:σ.
Hipótesis de inducción (H.I.): la propiedad se asume válida para las derivaciones de las
premisas:
FV(M)⊆dom(Γ)yFV(N)⊆dom(Γ).
Por lo tanto, aplicando la cláusula de aplicación de la
Definición 7.10
y la H.I.:
FV(MN)=FV(M)∪FV(N)⊆dom(Γ)∪dom(Γ)=dom(Γ).
(Abstracción). El término es L≡λx:σ.M. La forma del juicio es
Γ⊢L:σ→τ.
Por regla de (abstracción): este juicio se deriva de la premisa
Γ,x:σ⊢M:τ.
Hipótesis de inducción (H.I.): la propiedad se asume válida para la derivación de la
premisa:
FV(M)⊆dom(Γ,x:σ).
Por lo tanto, aplicando la cláusula de abstracción de la
Definición 7.10
y el hecho de que
dom(Γ,x:σ)=dom(Γ)∪{x}:
FV(λx:σ.M)=FV(M)∖{x}⊆(dom(Γ)∪{x})∖{x}=dom(Γ).
Por lo tanto, FV(L)⊆dom(Γ).
Las derivaciones de esta página anotaron cada abstracción con su tipo, al estilo de Church. La
página siguiente examina esa decisión de diseño y su alternativa, el estilo de Curry, en el que
los tipos se infieren en lugar de declararse.