Paradigmas de Lenguajes de Programación 1er cuatrimestre de 2007 Práctica 2 - Introducción al cálculo lambda tipado Índice 1. Generalidades 1 2. Semántica operacional 2 3. Tipado 4 4. Extensiones 6 En esta práctica, salvo que se especifique lo contrario, las letras M, N, P, Q, ... denotan términos tipables. 1. Generalidades Ejercicio 1 Para los siguientes términos: a) ux(yz)(λv.vy) b) (λxyz.xz(yz))uvw c) w(λxyz.xz(yz))uv Se pide: a) Insertar todos los paréntesis de acuerdo a la convención usual. b) Indicar cuáles ocurrencias de variables aparecen ligadas y cuáles libres. c) ¿En cuál de los términos anteriores ocurre (λxyz.xz(yz))u ? d) ¿Cuáles de los términos anteriores son formas normales? e) ¿Ocurre x(yz) en ux(yz)? Ejercicio 2 Mostrar un término que no sea tipable y que no tenga variables libres ni abstracciones. Ejercicio 3 Sean σ, τ, ρ tipos. Según la definición de sustitución, calcular: Página 1 de 8 Paradigmas de Lenguajes de Programación 1er cuatrimestre de 2007 a) (λy : σ.x(λx : τ.x)){x ← (λy : ρ.xy)} b) (y(λv : σ.xv)){x ← (λy : τ.vy)} Renombrar variables en ambos términos para poder evaluarlos con mayor facilidad. Ejercicio 4 Utilizando la definición de substitución usual, la noción de longitud de un término M notada |M |, y la noción de subtérmino, notada con ⊆, probar: a) M {x ← x} = M b) |M {x ← y}| = |M | c) si x 6∈ F V (M ) entonces M {x ← N } = M d) si M ⊆ E entonces |M | ≤ |E| e) |E{x ← M }| ≥ |E|. ¿En qué casos vale la igualdad? 2. Semántica operacional Ejercicio 5 Calcular las formas normales de los siguientes términos : a) (λx : Bool, y.Bool → Bool.yx)true(λx : Bool.x) b) (λx : Bool, y.Bool → Bool.y(yx))false(λx : Bool.x) c) (λx : Bool, y.Bool → Bool.y(yx))false(λx : Bool.x) d) SSSSSSS, donde S = λx : Bool → Bool → Bool, y : Bool → Bool, z : Bool.xz(yz) Ejercicio 6 a) Supongamos que if M then P else Q → D. ¿Es cierto que D tendrá necesariamente la forma if M 0 then P 0 else Q0 ? b) Supongamos que M → → M 0, P → → P 0, Q → → Q0 . ¿Es cierto que if M then P else Q → → if M 0 then P 0 else Q0 ? Ejercicio 7 a) ¿Da lo mismo evaluar suc(pred(M )) que pred(suc(M ))? ¿Por qué? b) ¿Es verdad que para todo M vale que isZero(suc(M )) → → false? Si no lo es, ¿para qué términos vale? Página 2 de 8 Paradigmas de Lenguajes de Programación 1er cuatrimestre de 2007 c) ¿Para qué términos M vale que isZero(pred(M )) → → true? (Pista: no pensar solamente en formas normales.) Ejercicio 8 Hallar un término M tal que se cumpla: M3 → → true Mn → → false si n 6= 3 Ejercicio 9 Probar que si E → F entonces F V (F ) ⊆ F V (E). Mostrar casos en que valga la igualdad y casos en que no. Ejercicio 10 Sean M, N, P, Q términos. a) ¿Es cierto que si M → N entonces M {x ← P } → N {x ← P }? b) ¿Es cierto que si P → Q entonces M {x ← P } → M {x ← Q}? c) ¿Es cierto que si M → N entonces M P → N P ? d) ¿Es cierto que si P → Q entonces M P → M Q? Ejercicio 11 De acuerdo a lo visto en clase y los ejercicios que se vienen haciendo, discutir las siguientes afirmaciones: “todo programa devuelve un valor”, “todo programa que termina devuelve un valor”, “todo programa cerrado devuelve un valor”. (Pista: ver el ejercicio 9.) Ejercicio 12 Conectivos booleanos Definir términos Not, And, Or, Xor, que simulen desde la reducción los conectivos clásicos usuales, por ej. And M N → → true sii M → → true y N → → true. Ejercicio 13 Determinismo. a) *Probar que la relación definida → es determinı́stica (o una función parcial). Más precisamente, probar (por inducción) que si M → N y M → N 0 entonces N = N 0 . b) ¿Vale lo mismo con muchos pasos? Es decir, ¿es cierto que si M → → M0 y M → → M 00 0 00 entonces M = M ? c) ¿Acaso es cierto que si M → M 0 y M → → M 00 entonces M 0 = M 00 ? Ejercicio 14 *Pseudo confluencia o absorción. Probar que si M → →U yM → → V con U una forma normal, entonces V → → U. Página 3 de 8 Paradigmas de Lenguajes de Programación 1er cuatrimestre de 2007 Ejercicio 15 Reducir los siguientes términos a forma normal usando la estrategia call-by-name 1 . Tener en cuenta que: def comp = λf : nat → nat.λg : nat → nat.λx : nat.f (gx) a) comp (λx : nat.x + 1) (λx : nat.x + 1) 5 b) let f (x : nat) : nat = 3 in letrec g(x : nat) : nat = g(x + 1) in f (g 5) let not = λx : bool .if x then false else true in letrec f = λx : bool .if x then true else f (not x) in f false c) Ejercicio 16 Suponiendo una estrategia de reducción call-by-name ¿Cuáles de las expresiones del ejercicio 5 están en forma normal? 3. Tipado Sean σ, τ tipos. Definimos los siguientes términos: Kστ = λx : σ, y : τ.x id σ = λx : σ.x Sστ = λx : σ, y : τ, z : ρ.xz(yz) Ejercicio 17 Probar que a) x : Bool, y : Bool . if x then x else y : Bool b) x : Bool → Bool, y : Bool . if xy then y else xy : Bool Ejercicio 18 Para σ, τ tipos cualesquiera, probar que valen: a) .Sστ : (σ → τ → ρ) → (σ → τ ) → (σ → ρ) b) .Sστ Kστ : (σ → τ ) → σ → σ c) .Kστ id σ : τ → σ → σ Ejercicio 19 Numerales de Church. Notación: M 0 (N ) = N, M n+1 (N ) = M (M n (N )) Indicar tipos σ y τ apropiados de modo que los términos de la forma λx : σ, y : τ.y n (x) resulten tipables. (Nota: el par (σ, τ ) deben ser el mismo para todos los términos.) Observar si tienen todos el mismo tipo. ¿Qué conclusión se saca? Ejercicio 20 1 Ojo, tiene nada que ver con la modalidad de pasaje de parámetros del paradigma imperativo Página 4 de 8 Paradigmas de Lenguajes de Programación 1er cuatrimestre de 2007 Probar la siguiente propiedad de unicidad de tipado: si Γ . M : σ y Γ . M : τ son derivables para M un término, entonces σ = τ . Ayuda: Usar inducción estructural sobre M , apelando al siguiente lema de generación: si Γ . M : σ es derivable vale lo siguiente: si M = x, entonces x : σ ∈ Γ si M = n, entonces σ = nat si M = λx : τ.N , entonces existe ρ2 tq σ = τ → ρ y Γ, x : τ . N : ρ es derivable si M = P Q, entonces existe ρ tq Γ . P : ρ → σ y Γ . Q : ρ son derivables (Nota: por simplicidad se restringe este ejercicio al uso de naturales y no booleanos.) Ejercicio 21 a) Mostrar con un ejemplo que la unicidad de tipos puede fallar si se consideran contextos distintos, es decir: Γ . M : σ y Γ0 . M : σ 0 no implica que σ = σ 0 . b) Mostrar con un ejemplo que la preservación de tipos (subject reduction) puede fallar si se consideran contextos distintos, es decir: Γ . M : σ y M → M 0 no implica que Γ0 . M 0 : σ. Ejercicio 22 Probar, usando el lema de generación, que no existen Γ y σ tales que Γ . xx : σ. ¿Qué conclusión se puede sacar de esto?2 (Nota male: puede probarse que tampoco pueden tiparse λx : σ.xx, id (λx : σ.xx) y tantos otros términos.) Ejercicio 23 a) Probar que si Γ . M : σ es derivable y Γ ∩ Γ0 contiene a todas las variables libres de M , entonces Γ0 . M : σ. b) (Weakening) Si Γ . M : σ es derivable y x ∈ / dom(Γ), entonces Γ, x : τ . M : σ es derivable. c) (Strengthening) Si Γ, Γ0 . M : σ es derivable y F V (M ) ⊆ Dom(Γ), entonces Γ . M : σ es derivable. Aquı́, Γ, Γ0 denota la unión de los contextos y asume que tienen dominios disjuntos. (Pista: para alguna prueba puede usarse algún item anterior.) Ejercicio 24 a) Probar que si Γ . M : N at y M → M 0 entonces Γ . suc(M 0 ) : N at y Γ . pred(M 0 ) : N at. b) Probar que si Γ . if B then P else Q : σ, B → B 0 , P → P 0 y Q → Q0 , entonces Γ . if B 0 then P 0 else Q0 : σ. 2 No valen conclusiones triviales o tautológicas, más bien debe interpretarse pragmáticamente esta pregunta. Página 5 de 8 Paradigmas de Lenguajes de Programación 1er cuatrimestre de 2007 Ejercicio 25 Decir si son V o F: a) Γ . M : σ y Γ . N : σ 0 , entonces existe τ tal que Γ . M N : τ b) Γ . M : σ entonces para todo σ 0 existe τ tal que Γ . λx : σ 0 .M : τ Ejercicio 26 Probar el lema de sustitución: Si Γ, x : τ ¤ M : σ y Γ ¤ N : τ son derivables, entonces Γ ¤ M {x ← N } : σ es derivable. 4. Extensiones Ejercicio 27 a) Definir la función apply σ que toma una función f : σ → σ y un x : σ y aplica f a x. b) Definir la función and que toma dos booleanos y retorna su conjunción. c) Definir la función mult que multiplica dos números naturales. Puede asumir que ya dispone de una función que resta números naturales monus. Ejercicio 28 Considerar la siguiente definición: def search = λp : nat → bool .letrec f (x : nat) : nat = if (p x) then x else f (x + 1) in f 0 Definir la función predecesor pred usando search. En el caso de 0 definir pred de manera que pred 0 ³ 0. Ejercicio 29 PCF extendido con el tipo unit y unión disjunta consiste en extender las expresiones de tipo del siguiente modo: σ ::= nat | σ → σ | σ × σ | unit | σ + σ unit es un tipo que tiene un único valor, a saber ∗ y es de utilidad cuando se combina con la unión disjunta. Las reglas de tipado para unit y unión disjunta son3 : Γ ¤ ∗ : unit Γ ¤ inleft ρ,σ : ρ → σ + ρ Γ ¤ inright ρ,σ : σ → σ + ρ Γ ¤ case ρ,σ,τ : (ρ + σ) → (ρ → τ ) → (σ → τ ) → τ 3 Los nuevos términos pueden deducirse a partir de las reglas de tipado. Página 6 de 8 Paradigmas de Lenguajes de Programación 1er cuatrimestre de 2007 Los axiomas de reducción adicionales son: Γ¤M :ρ Γ¤P :ρ→τ Γ¤Q:σ →τ Γ ¤ case ρ,σ,τ (inleft ρ,σ M ) P Q → P M : τ Γ¤M :σ Γ¤P :ρ→τ Γ¤Q:σ →τ Γ ¤ case ρ,σ,τ (inright ρ,σ M ) P Q → Q M : τ En este sistema no contamos con el tipo de datos bool , ni con las constantes true y false. Los mismos pueden definirse del siguiente modo: bool def = unit + unit true def inleft unit,unit ∗ false def = = inright unit,unit ∗ a) Definir if M then P else Q en términos de case ρ,σ,τ . b) Probar los axiomas de reducción de if − then − else, a saber if true then P else Q ³ P if false then P else Q ³ Q Ejercicio 30 Este ejercicio extiende PCF con listas para obtener PCFL. Comenzamos ampliando el conjunto de tipos: σ ::= nat | bool | σ → σ | σ × σ | [σ] donde [σ] representa el tipo de las listas cuyas componentes son de tipo σ. El conjunto de términos ahora incluye: M ::= . . . | nilσ | M :: N | case M of {nil → P | h :: t → Q} donde nil σ es la lista vacı́a cuyos elementos son de tipo σ, M :: N agrega M a la lista N y case M of {nil → P | h :: t → Q} es el observador de listas (h y t son variables que se ligan en Q). a) Agregar reglas de tipado para las nuevas expresiones. b) Agregar los (dos) axiomas de reducción asociados a las nuevas expresiones. Ejercicio 31 Definir las siguientes funciones en PCFL: def a) head : [σ] → σ y tail : [σ] → [σ] (asumir que ⊥σ = fix x : σ.x). b) iterate de tipo (σ → σ) → σ → [σ] que dado f y x retorna la lista infinita x :: f x :: f (f x) :: f (f (f x)) :: . . . Página 7 de 8 Paradigmas de Lenguajes de Programación 1er cuatrimestre de 2007 c) zip : [ρ] → [σ] → [ρ × σ] que se comporta como la función homónima de Haskell. d) take : nat → ([σ] → [σ]) que se comporta como la función homónima de Haskell. Página 8 de 8