Sunteți pe pagina 1din 26

C

alculo Lambda - primera parte

Calculo Lambda - primera parte


Paradigmas de Lenguajes de Programacion

Primer cuatrimestre - 2014

C
alculo Lambda - primera parte

Para que sirve el calculo 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 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

Empecemos con un ejemplo

(x : Bool.y : Bool Bool.y (yx))((z : Bool.true)false)(w : Bool.w )

Que significa esto?


Tiene sentido? Representa un valor? C
omo nos damos cuenta?

C
alculo Lambda - primera parte

Componentes del calculo lambda (y de todas sus


extensiones)
Para poder modelar formalmente cualquier aspecto de la
programacion en este lenguaje, necesitamos definir:
Sintaxis de los tipos
Sintaxis de los terminos
Reglas de tipado
Que consideramos como valores
Reglas de semantica
Todo esto lo iremos viendo a lo largo de esta clase (y tambien en
la siguiente, para nuevas extensiones).

C
alculo Lambda - primera parte

Repasemos los primeros tipos y terminos


Las expresiones de tipos (o simplemente tipos) de b son
::= Bool |
Sea X un conjunto infinito enumerable de variables y x X . Los
terminos de b estan dados por
M ::= x
|

true

false

if M then P else Q

x : .M

MN

C
alculo Lambda - primera parte

Cuales de estas expresiones son terminos?

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

C
alculo Lambda - primera parte

Convenciones

Convencion de parentesis
Convencion de limpieza
Poner parentesis en wzx : ( ) .xy : .y

C
alculo Lambda - primera parte

Terminos con y sin sentido


true false es un termino, aunque medio sospechoso.
Intuitivamente: que querramos obtener al evaluarlo?

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?

De este filtro se ocupara nuestro sistema de tipado.


(Entre otras cosas! M
as detalles en la tercera te
orica de c
alculo lambda, cuando veamos inferencia de tipos.)

C
alculo Lambda - primera parte

Axiomas y reglas de tipado


x :
(T-Var)
.x :
(T-False)

(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:

.(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


que tipo es el argumento de cada funci
on.

C
alculo Lambda - primera parte

Semantica operacional (1/3)


Valores
V

::= true | false | x : .M

Cuales de estos terminos 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

C
alculo Lambda - primera parte

Semantica operacional (2/3)

Reglas de evaluacion en un paso (1/2)


(E-IfTrue)
if true then M2 else M3 M2
(E-IfFalse)
if false then M2 else M3 M3
M1 M10
if M1 then M2 else M3 if M10 then M2 else M3

(E-If)

C
alculo Lambda - primera parte

Semantica operacional (3/3)


Reglas de evaluacion en un paso (2/2)
M1 M10
M1 M2 M10 M2
M2 M20
V1 M2 V1 M20

(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 )

Cual es el resultado de evaluarlos?

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

Podemos definir macros para expresiones que vayamos a utilizar


con frecuencia. Por ejemplo:
def

and = x : Bool.y : Bool.if x then y else false

Que otras macros podemos definir?

C
alculo Lambda - primera parte

Un nuevo tipo: los Naturales

::= Bool | | Nat


M ::= . . . | 0 | succ(M) | pred(M) | iszero(M)

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

{x : Nat} . iszero(pred(succ(x))) : Bool

C
alculo Lambda - primera parte

Semantica operacional (1/2)


Valores
V

::= . . . | n donde n abrevia succn (0).

Reglas de evaluacion en un paso (1/2)


M1 M10
succ(M1 ) succ(M10 )

(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

Semantica operacional (2/2)

Reglas de evaluacion en un paso (2/2)


(E-IsZeroZero)
iszero(0) true
(E-IsZeroSucc)
iszero(succ(n)) false
M1 M10
iszero(M1 ) iszero(M10 )

(E-IsZero)

C
alculo Lambda - primera parte

...Y ahora evaluemos

(x : Nat. iszero(pred(succ(x)))) 0

Y si en vez de 0 dijera succ(0)? O succ(succ(0))?

Cual es la forma normal de succ(pred(pred(succ(0))))?


Y la de succ(pred(pred(succ(x))))?

C
alculo Lambda - primera parte

Recursion y punto fijo


Veamos esta extension:
M ::= . . . | fix M
. M : 1 1

(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

Recursion como punto fijo


Que tipo tiene el siguiente termino? Que 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 32

C
alculo Lambda - primera parte

Definiendo funciones recursivas

Podemos definir la suma como macro. Por ejemplo:


def

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...

Ejemplos rapidos y sofisticados


Como definir nuevas extensiones

C
alculo Lambda - primera parte

Continuara...

? ?

? ?

? ? ? ? ? ? ?

(x : clase.Fin x) (C alculo Lambda I )

S-ar putea să vă placă și