C´
alculo Lambda - primera parte
Paradigmas de Lenguajes de Programaci´on
¿Para qu´
e sirve el c´
alculo lambda?
Provee un modelo de c´omputo simple que permite representar todas las funciones computables.
Sirve como marco formal para estudiar propiedades de procesos de c´omputo, programas, lenguajes...
Facilita la realizaci´on de pruebas de concepto antes de incorporar extensiones a lenguajes de programaci´on. ...etc. (ver bibliograf´ıa).
Empecemos con un ejemplo
(λx: Bool.λy : Bool→Bool.y(yx))((λz: Bool.true)false)(λw: Bool.w)
¿Qu´e significa esto?
Componentes del c´
alculo lambda (y de todas sus
extensiones)
Para poder modelar formalmente cualquier aspecto de la programaci´on en este lenguaje, necesitamos definir:
Sintaxis de los tipos Sintaxis de los t´erminos Reglas de tipado
Qu´e consideramos como valores Reglas de sem´antica
Todo esto lo iremos viendo a lo largo de esta clase (y tambi´en en la siguiente, para nuevas extensiones).
Repasemos los primeros tipos y t´
erminos
Lasexpresiones de tipos(o simplementetipos) deλb son
σ ::= Bool|σ →τ
SeaX un conjunto infinito enumerable de variables yx∈ X. Los
t´erminos deλb est´an dados por
M ::= x | true | false | ifM then P elseQ | λx :σ.M | M N
¿Cu´
ales de estas expresiones son t´
erminos?
λ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
Convenciones
Convenci´on de par´entesis Convenci´on de limpieza
T´
erminos con y sin sentido
true false esun t´ermino, aunque “medio sospechoso”. Intuitivamente: ¿qu´e querr´ıamos obtener al evaluarlo? x x tambi´en es un t´ermino.
Intuitivamente: ¿qu´e tipo deber´ıa tener?
Moraleja: aun sobre t´erminos v´alidos caben preguntas como . . . En nuestro contexto / para nuestros fines, ¿esto tiene sentido? ¿Ser´ıa deseable que tenga sentido? ¿Qu´e tipo deber´ıa tener? ¿Deber´ıa tener tipo? ¿Podr´ıatener alguno?
De este filtro se ocupar´a nuestro sistema detipado.
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:τ (T-Abs) Γ. λx:σ.M :σ→τ Γ.M:σ→τ Γ.N:σ (T-App) Γ.M N :τ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´e tipo es el argumento de cada funci´on.
Sem´
antica operacional (1/3)
Valores
V ::= true|false|λx :σ.M
¿Cu´ales de estos t´erminos son valores?
if true then λx : Bool.x elseλx: Bool.false
if x then false elsetrue
λx: Bool.false
(λx : Bool.x)false
λx: Bool.(λy: Bool.x)false
Sem´
antica operacional (2/3)
Reglas de evaluaci´on en un paso (1/2)
(E-IfTrue) iftrue thenM2elseM3→M2
(E-IfFalse) iffalsethen M2elseM3→M3
M1→M10
(E-If) ifM1then M2elseM3→ifM10 thenM2 elseM3
Sem´
antica operacional (3/3)
Reglas de evaluaci´on en un paso (2/2) M1→M10 (E-App1 oµ) M1M2→M10M2 M2→M20 (E-App2 o ν) V1M2→V1M20 (E-AppAbs o β) (λx :σ.M)V →M{x←V}
Ejercicios
Volvamos a los t´erminos 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´al es el resultado de evaluarlos?
¿Y este otro?
if (λb:Bool.true)false
then(λx :Bool.x)true
Simplificando la escritura
Podemos definir macros para expresiones que vayamos a utilizar con frecuencia. Por ejemplo:
anddef=λx: Bool.λy: Bool.ifxthenyelsefalse
Un nuevo tipo: los Naturales
σ ::= Bool|σ →ρ|Nat
Tipado
(T-Zero) Γ.0 :Nat Γ.M :Nat (T-Succ) Γ.succ(M) :Nat Γ.M:Nat (T-Pred) Γ.pred(M) :Nat Γ.M :Nat (T-IsZero) Γ.iszero(M) :BoolProbemos...
∅.pred(succ(0)) :Nat
Sem´
antica operacional (1/2)
Valores
V ::= . . .|n donden abrevia succn(0).
Reglas de evaluaci´on en un paso (1/2)
M1→M10 (E-Succ) succ(M1)→succ(M10) (E-PredZero) pred(0)→0 (E-PredSucc) pred(succ(n))→n M1→M10 (E-Pred) pred(M1)→pred(M10)
Sem´
antica operacional (2/2)
Reglas de evaluaci´on en un paso (2/2)
(E-IsZeroZero) iszero(0)→true (E-IsZeroSucc) iszero(succ(n))→false M1→M10 (E-IsZero) iszero(M1)→iszero(M10)
...Y ahora evaluemos
(λx :Nat.iszero(pred(succ(x)))) 0
¿Y si en vez de 0 dijera succ(0)? ¿O succ(succ(0))?
¿Cu´al es la forma normal de succ(pred(pred(succ(0))))? ¿Y la de succ(pred(pred(succ(x))))?
Recursi´
on y punto fijo
Veamos esta extensi´on:
M ::= . . . |fix M Γ.M :σ1→σ1 (T-Fix) Γ.fix M:σ1 M1→M10 (E-Fix) fix M1→fix M10 (E-FixBeta) fix (λx:σ.M)→M{x ←fix (λx:σ.M)}
Recursi´
on como punto fijo
¿Qu´e tipo tiene el siguiente t´ermino? ¿Qu´e representa?
M= (λx:Nat.fix(λs:Nat→Nat.λy:Nat.if iszero(y) thenxelse succ(spred(y))))
Verifiquemos:
∅.M:Nat→Nat→Nat
...Y ahora evaluemos:
Definiendo funciones recursivas
Podemos definir la suma como macro. Por ejemplo:
sumadef= (λx:Nat.fix(λs:Nat→Nat.λy:Nat.if iszero(y) thenxelse succ(spred(y))))
(No es la ´unica definici´on posible.)
Ejercicio: definir el producto como macro usandosumay fix. Una soluci´on posible:
productodef=
En la pr´
oxima clase...
Ejemplos r´apidos y sofisticados C´omo definir nuevas extensiones
Continuar´
a...
¿? ¿?¿? ¿?