Cálculo Lambda - primera parte Paradigmas de Lenguajes de Programación Primer cuatrimestre - 2014
Para qué sirve el cálculo lambda? Provee un modelo de cómputo simple que permite representar todas las funciones computables. Sirve como marco formal para estudiar propiedades de procesos de cómputo, programas, lenguajes... Facilita la realización de pruebas de concepto antes de incorporar extensiones a lenguajes de programación....etc. (ver bibliografía).
Empecemos con un ejemplo (λx : Bool.λy : Bool Bool.y(yx))((λz : Bool.true)false)(λw : Bool.w) Qué significa esto? Tiene sentido? Representa un valor? Cómo nos damos cuenta?
Componentes del cálculo lambda (y de todas sus extensiones) Para poder modelar formalmente cualquier aspecto de la programación en este lenguaje, necesitamos definir: Sintaxis de los tipos Sintaxis de los términos Reglas de tipado Qué consideramos como valores Reglas de semántica Todo esto lo iremos viendo a lo largo de esta clase (y también en la siguiente, para nuevas extensiones).
Repasemos los primeros tipos y términos Las expresiones de tipos (o simplemente tipos) de λ b son σ ::= Bool σ τ Sea X un conjunto infinito enumerable de variables y x X. Los términos de λ b están dados por M ::= x true false if M then P else Q λx : σ.m M N
Cuáles de estas expresiones son términos? λx : Bool Bool.(x true) (λx : Bool Bool.(x true))(λy : Bool.y) if x then y else λz : Bool.z x(λy : Bool.y) λx : Bool λx : Bool.y true false if true then λx : Bool.x
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 tercera teórica de cálculo lambda, 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...Y ahora tipemos nuestro primer ejemplo: (λx : Bool.λy : Bool Bool.y(yx))((λz : Bool.true)false)(λw : Bool.w):? Podemos hacerlo, ya que las anotaciones de tipos nos dicen de qué tipo es el argumento de cada función.
Semántica operacional (1/3) Valores V ::= true false λx : σ.m Cuáles de estos términos son valores? if true then λx : Bool.x else λx : Bool.false if x then false else true λx : Bool.false (λx : Bool.x)false λx : Bool.(λy : Bool.x)false λx : Bool.x true
Semántica operacional (2/3) 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 (3/3) 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 a los términos que vimos antes: (λx : Bool.λy : Bool.if x then true else y) false (λx : Bool.λy : Bool Bool.y(yx))((λz : Bool.true)false)(λw : Bool.w) Cuál es el resultado de evaluarlos? Y este otro? if (λb : Bool.true) false then (λx : Bool.x) true else (λy : Bool.y) false
Simplificando la escritura Podemos definir macros para expresiones que vayamos a utilizar con frecuencia. Por ejemplo: and def = λx : Bool.λy : Bool.if x then y else false Qué otras macros podemos definir?
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 Veamos 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)))) Verifiquemos: M : Nat Nat Nat...Y ahora evaluemos: M 3 2
Definiendo funciones recursivas Podemos definir la suma como macro. Por ejemplo: suma def = (λx : Nat. fix(λs : Nat Nat.λy : Nat.if iszero(y) then x else succ(s pred(y)))) (No es la única definición posible.) 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 )