• No se han encontrado resultados

Cálculo Lambda - primera parte. Paradigmas de Lenguajes de Programación. Primer cuatrimestre

N/A
N/A
Protected

Academic year: 2021

Share "Cálculo Lambda - primera parte. Paradigmas de Lenguajes de Programación. Primer cuatrimestre"

Copied!
26
0
0

Texto completo

(1)

alculo Lambda - primera parte

Paradigmas de Lenguajes de Programaci´on

(2)

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

(3)

Empecemos con un ejemplo

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

¿Qu´e significa esto?

(4)

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

(5)

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

(6)

¿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

(7)

Convenciones

Convenci´on de par´entesis Convenci´on de limpieza

(8)

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.

(9)

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

(10)

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.

(11)

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

(12)

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

(13)

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}

(14)

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

(15)

Simplificando la escritura

Podemos definir macros para expresiones que vayamos a utilizar con frecuencia. Por ejemplo:

anddef=λx: Bool.λy: Bool.ifxthenyelsefalse

(16)

Un nuevo tipo: los Naturales

σ ::= Bool|σ →ρ|Nat

(17)

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) :Bool

(18)

Probemos...

∅.pred(succ(0)) :Nat

(19)

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)

(20)

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)

(21)

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

(22)

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

(23)

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:

(24)

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=

(25)

En la pr´

oxima clase...

Ejemplos r´apidos y sofisticados C´omo definir nuevas extensiones

(26)

Continuar´

a...

¿? ¿?¿? ¿?

¿?

¿?

¿?

¿?

¿?

¿?¿? ¿? ¿?

Referencias

Documento similar