Cálculo Lambda - primera parte Paradigmas de Lenguajes de Programación Segundo cuatrimestre - 2010
Tipos y términos Las expresiones de tipos (o simplemente tipos) de C-λ b son σ ::= Bool σ τ Sea X un conjunto infinito enumerable de variables y x X. Los términos de C-λ b están dados por M ::= x true false if M then P else Q λx : σ.m M N
Convenciones Convención de paréntesis Convención de limpieza Poner paréntesis en wzλx : (σ σ) τ τ.xλy : σ.y
Términos con y sin sentido true false es un término, aunque medio sospechoso. Intuitivamente: qué querríamos obtener al evaluarlo? x x también es un término. Intuitivamente: qué tipo debería tener? Moraleja: aun sobre términos válidos caben preguntas como... En nuestro contexto / para nuestros fines, esto tiene sentido? Sería deseable que tenga sentido? Qué tipo debería tener? Debería tener tipo? Podría tener alguno? De este filtro se ocupará nuestro sistema de tipado. ( Entre otras cosas! Más detalles en la próxima teórica, cuando veamos inferencia de tipos.)
Axiomas y reglas de tipado x : σ Γ (T-Var) Γ x : σ (T-True) Γ true : Bool (T-False) Γ false : Bool Γ M : Bool Γ P : σ Γ Q : σ (T-If) Γ if M then P else Q : σ Γ, x : σ M : τ Γ λx : σ.m : σ τ (T-Abs) Γ M : σ τ Γ M N : τ Γ N : σ (T-App)
Ejercicio Demostrar la validez del siguiente juicio de tipado: (λx : Bool.λy : Bool.if x then true else y) false : Bool Bool
Semántica operacional (1/2) Valores V ::= true false λx : σ.m Reglas de evaluación en un paso (1/2) (E-IfTrue) if true then M 2 else M 3 M 2 (E-IfFalse) if false then M 2 else M 3 M 3 M 1 M 1 if M 1 then M 2 else M 3 if M 1 then M 2 else M 3 (E-If)
Semántica operacional (2/2) Reglas de evaluación en un paso (2/2) M 1 M 1 M 1 M 2 M 1 M 2 (E-App1 o µ) M 2 M 2 (E-App2 o ν) V 1 M 2 V 1 M 2 (E-AppAbs o β) (λx : σ.m) V M{x V }
Ejercicios Volvamos al término que vimos antes: (λx : Bool.λy : Bool.if x then true else y) false Cuál es el resultado de evaluarlo? Y este otro? if (λb : Bool.true) false then (λx : Bool.x) true else (λy : Bool.y) false
Un nuevo tipo: los Naturales σ ::= Bool Nat σ ρ M ::=... 0 succ(m) pred(m) iszero(m)
Tipado (T-Zero) Γ 0 : Nat Γ M : Nat Γ M : Nat (T-Succ) (T-Pred) Γ succ(m) : Nat Γ pred(m) : Nat Γ M : Nat (T-IsZero) Γ iszero(m) : Bool
Probemos... pred(succ(0)) : Nat {x : Nat} iszero(pred(succ(x))) : Bool
Semántica operacional (1/2) Valores V ::=... n donde n abrevia succ n (0). Reglas de evaluación en un paso (1/2) M 1 M 1 (E-Succ) succ(m 1 ) succ(m 1) (E-PredZero) pred(0) 0 (E-PredSucc) pred(succ(n)) n M 1 M 1 (E-Pred) pred(m 1 ) pred(m 1)
Semántica operacional (2/2) Reglas de evaluación en un paso (2/2) (E-IsZeroZero) iszero(0) true (E-IsZeroSucc) iszero(succ(n)) false M 1 M 1 (E-IsZero) iszero(m 1 ) iszero(m 1)
...Y ahora evaluemos (λx : Nat. iszero(pred(succ(x)))) 0 Y si en vez de 0 dijera succ(0)? O succ(succ(0))? Cuál es la forma normal de succ(pred(pred(succ(0))))? Y la de succ(pred(pred(succ(x))))?
Recursión y punto fijo Recordemos esta extensión: M ::=... fix M Γ M : σ 1 σ 1 (T-Fix) Γ fix M : σ 1 M 1 M 1 (E-Fix) fix M 1 fix M 1 (E-FixBeta) fix (λx : σ.m) M{x fix (λx : σ.m)} (El conjunto de tipos y el de valores no se modifican.)
Recursión como punto fijo Qué tipo tiene el siguiente término? Qué representa? M = (λx : Nat. fix(λs : Nat Nat.λy : Nat.if iszero(y) then x else succ(s pred(y))))
Recursión como punto fijo Qué tipo tiene el siguiente término? Qué representa? M = (λx : Nat. fix(λs : Nat Nat.λy : Nat.if iszero(y) then x else succ(s pred(y)))) Verifiquemos: M : Nat Nat Nat
Recursión como punto fijo Qué tipo tiene el siguiente término? Qué representa? M = (λx : Nat. fix(λs : Nat Nat.λy : Nat.if iszero(y) then x else succ(s pred(y)))) Verifiquemos: M : Nat Nat Nat...Y ahora evaluemos: M 3 2
Simplificando la escritura Podemos definir macros para expresiones que vayamos a utilizar con frecuencia. Por ejemplo: suma def = (λx : Nat. fix(λs : Nat Nat.λy : Nat.if iszero(y) then x else succ(s pred(y)))) Ejercicio: definir el producto como macro usando suma y fix. Una solución posible: producto def = λx : Nat. fix (λp : Nat Nat.λy : Nat.if iszero(y) then 0 else suma x (p pred(y)))
En la próxima clase... Ejemplos rápidos y sofisticados Cómo definir nuevas extensiones
Continuará...????????????? (λx : clase.fin x) (Cálculo Lambda I )