Document

Anuncio
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
Descargar