Documente Academic
Documente Profesional
Documente Cultură
C
alculo Lambda - primera parte
Provee un modelo de c
omputo simple que permite representar
todas las funciones computables.
Sirve como marco formal para estudiar propiedades de
procesos de computo, programas, lenguajes...
Facilita la realizaci
on de pruebas de concepto antes de
incorporar extensiones a lenguajes de programacion.
...etc. (ver bibliografa).
C
alculo Lambda - primera parte
C
alculo Lambda - primera parte
C
alculo Lambda - primera parte
true
false
if M then P else Q
x : .M
MN
C
alculo Lambda - primera parte
C
alculo Lambda - primera parte
Convenciones
Convencion de parentesis
Convencion de limpieza
Poner parentesis en wzx : ( ) .xy : .y
C
alculo Lambda - primera parte
x x tambien es un termino.
Intuitivamente: que tipo debera tener?
Moraleja: aun sobre terminos v
alidos caben preguntas como . . .
En nuestro contexto / para nuestros fines, esto tiene sentido?
Sera deseable que tenga sentido? Qu
e tipo debera tener?
Debera tener tipo? Podra tener alguno?
C
alculo Lambda - primera parte
(T-True)
. true : Bool
. false : Bool
. M : Bool
.P :
.Q :
(T-If)
. if M then P else Q :
.M :
, x : . M :
.N :
(T-Abs)
. x : .M :
(T-App)
.MN :
C
alculo Lambda - primera parte
Ejercicio
Demostrar la validez del siguiente juicio de tipado:
C
alculo Lambda - primera parte
C
alculo Lambda - primera parte
(E-If)
C
alculo Lambda - primera parte
(E-App1 o )
(E-App2 o )
(x : .M) V M{x V }
(E-AppAbs o )
C
alculo Lambda - primera parte
Ejercicios
Volvamos a los terminos 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 )
Y este otro?
if (b : Bool.true) false
then (x : Bool.x) true
else (y : Bool.y ) false
C
alculo Lambda - primera parte
Simplificando la escritura
C
alculo Lambda - primera parte
C
alculo Lambda - primera parte
Tipado
(T-Zero)
. 0 : Nat
. M : Nat
. M : Nat
(T-Succ)
. succ(M) : Nat
(T-Pred)
. pred(M) : Nat
. M : Nat
(T-IsZero)
. iszero(M) : Bool
C
alculo Lambda - primera parte
Probemos...
. pred(succ(0)) : Nat
C
alculo Lambda - primera parte
(E-Succ)
(E-PredZero)
pred(0) 0
(E-PredSucc)
pred(succ(n)) n
M1 M10
pred(M1 ) pred(M10 )
(E-Pred)
C
alculo Lambda - primera parte
(E-IsZero)
C
alculo Lambda - primera parte
(x : Nat. iszero(pred(succ(x)))) 0
C
alculo Lambda - primera parte
(T-Fix)
. fix M : 1
M1 M10
fix M1 fix M10
(E-Fix)
(E-FixBeta)
fix (x : .M) M{x fix (x : .M)}
(El conjunto de tipos y el de valores no se modifican.)
C
alculo Lambda - primera parte
Verifiquemos:
. M : Nat Nat Nat
C
alculo Lambda - primera parte
suma = (x : Nat. fix(s : Nat Nat.y : Nat.if iszero(y ) then x else succ(s pred(y ))))
(No es la u
nica definici
on posible.)
Ejercicio: definir el producto como macro usando suma y fix.
Una solucion posible:
def
producto =
x : Nat. fix (p : Nat Nat.y : Nat.if iszero(y ) then 0 else suma x (p pred(y )))
C
alculo Lambda - primera parte
En la proxima clase...
C
alculo Lambda - primera parte
Continuara...
? ?
? ?
? ? ? ? ? ? ?