Sei sulla pagina 1di 3

Clase Practica de Subtipado

Paradigmas de Lenguajes de Programacion


Segundo cuatrimestre - 2008

Las soluciones que aparecen en este documento tomenlas solo como guas, no son exhaustivas y
algunas secciones de las pruebas no estan formalmente escritas.

1. Axiomas

(S-Refl)
S <: S
S <: T T <: U
(S-Trans)
S <: U
{li |1 i n} {kj |1 j m} kj = li Sj <: Ti
(S-RCD)
{kj : Sj |1 j m} <: {li : Ti |1 i n}
A <: A0 B <: B 0
(S-Arrow)
A0 B <: A B 0

(S-BoolNat)
Bool <: N at

(S-NatInt)
N at <: Int

(S-IntFloat)
Int <: F loat

1.1. Ejercicio 1
Dar una derivacion que pruebe:
{x : N at} {x : N at, y : Bool} <: {x : Bool, y : N at} {y : N at}
Para poder aplicar la regla S-Arrow tenemos que ver que:
1. {x : Bool, y : N at} <: {x : N at}
2. {x : N at, y : Bool} <: {y : N at}
1:
{x} {x, y} (S-BoolNat)
Bool <: N at (S-RCD)
{x : Bool, y : N at} <: {x : N at}
2:
{y} {x, y} (S-BoolNat)
Bool <: N at (S-RCD)
{x : N at, y : Bool} <: {y : N at}
{x : Bool, y : N at} <: {x : N at}(1) {x : N at, y : Bool} <: {y : N at}(2)
(S-Arrow)
{x : N at} {x : N at, y : Bool} <: {x : Bool, y : N at} {y : N at}

1
1.2. Ejercicio 2
Cuantos subtipos y supertipos (no estrictos) tiene {x : N at, y : Bool} N at? Contar los
tipos equivalentes (permutacion de labels en los registros) como un unico tipo.

Sea sup(x) la cantidad de supertipos de x y sub(x) la cantidad de subtipos de x. Podemos usar


las siguientes identidades para contar, que salen de razonar cuantas opciones tenemos para cada
parte del tipo:

sup(A B) = sub(A) sup(B)


sup({l1 : T1 , ..., ln : Tn }) = (sup(Ti ) + 1)
sub(A B) = sup(A) sub(B)
sub({l1 : T1 , ..., ln : Tn }) = 1

sub({x : N at, y : Bool} N at) = sup({x : N at, y : Bool}) sub(N at)


sup({x : N at, y : Bool}) = (sup(N at) + 1) (sup(Bool) + 1)
sup(N at) = 3
sup(Bool) = 4
sup({x : N at, y : Bool}) = 4 5 = 20
sub(N at) = 2
sub({x : N at, y : Bool} N at) = 20 2 = 40

sup({x : N at, y : Bool} N at) = sub({x : N at, y : Bool}) sup(N at)


sub({x : N at, y : Bool}) =
sup({x : N at, y : Bool} N at) =

Y si quisieramos contar los subtipos y supertipos estrictos?


Respuesta: basta con restar 1 a la cantidad de subtipos o supertipos no estrictos. Pensar por
que.

1.3. Ejercicio 3
Reemplazar cada una de las letras A, B, C y D por alguno de los tipos Bool, N at, Int o F loat
de manera que cada letra sea asignada un tipo distinto y que sea cierto:

{x : A B, y : D} <: {x : C D, y : C}

Por (S-RCD) (A B <: C D) (D <: C).


Por (S-Arrow) C <: A B <: D.
En conclusion B <: D <: C <: A por lo cual la respuesta debe ser: B = Bool, D = N at, C = Int,
A = F loat.

1.4. Ejercicio 4
Supongamos solo podemos construir tipos a partir de un tipo basico y funciones (no hay
registros). Demostrar que S <: T sii S y T son sintacticamente iguales.

) Trivial. T <: T se concluye por la regla S-Refl.


) Primero miremos este lema:

Lemma 1.1. T <: S sii ambos tipos son funciones, o registros o tipos basicos.

Demostracion. Es facil de ver. Razonar por el absurdo y analizar por induccion que regla se podra
haber aplicado para concluir esto.

2
Ahora s, podemos intentar demostrarlo por induccion en la construccion del tipo. Queremos
ver que S <: T implica que S y T son iguales. Hagamos induccion simultanea en S y T .

<: . Son sintacticamente iguales.

<: T1 T2 es falso (por el lema anterior). Luego, la implicacion es verdadera.

S1 S2 <: tambien es falso. Luego, la implicacion es verdadera.


S1 S2 <: T1 T2 . Por S-Arrow (en algun momento se uso, o en caso contrario hubo
solo aplicaciones de S-refl, esto se puede ver por induccion en la derivacion), sabemos que
T1 <: S1 y S2 <: T2 . Por HI, T1 y S1 son identicos, y S2 y T2 tambien. Luego, S1 S2 y
T1 T2 son identicos.

1.5. Ejercicio 5
Encontrar tipos S y T tal que haya infinitos X que verifiquen S <: X <: T

S = {x : {} Bool}
T = {}

Notar que S <: T , y ademas para cualquier tipo registro R no vaco cumple R <: {}, y por lo
tanto {x : {} Bool} <: {x : R Bool}. Es muy facil ver que hay infinitos tipos no vacos R
tal que R <: {}.

Potrebbero piacerti anche