Document

Anuncio
Paradigmas de Lenguajes de Programación
2o Cuatrimestre de 2006
Práctica No 3 - Inferencia de Tipos
Aclaraciones:
Las expresiones de tipos que usaremos en esta práctica están definidos intuiductivamente
por:
tipo = Int | Bool | varDeT ipo | tipo → tipo
Usaremos la siguiente sintaxis para las expresiones:
expr = cte | var | expr expr | \var.expr
Notar que es un subconjunto muy básico de PCF sin tipos en las abstracciones lambda
y que no cuenta con recursión.
Las siguientes constantes serán usadas en esta práctica, aquı́ damos su tipo:
Si n es un entero, luego n: Int
Además:
true : Bool
false : Bool
+ : Int -> Int -> Int
* : Int -> Int -> Int
/ : Int -> Int -> Int
< : Int -> Int -> Bool
&& : Bool -> Bool -> Bool
not : Bool -> Bool
id : a -> a
if . then . else . : Bool -> a -> a -> a
Donde las últimas tres son constantes polimórficas dado que su expresión de tipo contiene variables de tipo.
Ejercicio 1
Inferir el tipo de las siguientes expresiones utilizando el árbol de parsing y mostrar qué reglas
se aplican en cada paso.
i. (2 < 3) && False
ii. \x.\y. if x then y * y else y / 2
iii. \a.\b.\c. if b then a else 1 + ((id c) + a)
Ejercicio 2
Utilizar el árbol de parsing para encontrar y justificar errores de tipo en las siguientes expresiones.
Página 1 de 2
Paradigmas de Lenguajes de Programación
2o Cuatrimestre de 2006
i. \a.\b.\c. if c < b then not c else a + b
ii. \a. a + (a 3)
iii. \a. a a
Ejercicio 3
Utilizando el algoritmo formal de inferencia, hallar el tipo de las siguientes expresiones.
i. \x. if x > 0 then -1 else 0
ii. \x.\y.\g.\h.\j. x * (g x) * h (x < y) + j (x h (y < x))
Ejercicio 4
Tomando en cuenta un nuevo tipo Void y la siguiente extensión del lenguaje:
expr = . . . | nada
Extender el algoritmo formal de inferencia para que cualquier expresión que contenga algún
nada sea de tipo Void.
Ejercicio 5
Tener en cuenta un nuevo tipo tupla definido como:
tipo = . . . | (tipo × tipo)
Y expresiones nuevas definidas como:
expr = . . . | (expr, expr)
Extender el algoritmo formal de inferencia para que funcione sobre esta versión extendida.
Ejercicio 6
Intentar tipar la siguiente expresión utilizando la versión extendida del algoritmo del ejercicio
anterior.
(\f.(f 2, f true)) (\x.x)
Mostrar en qué punto del mismo falla y por qué motivo.
Ejercicio 7
(Discusión) Supongamos que queremos extender el sistema de tipos presentado en clase
para soportar subtipos (polimorfismo de inclusión). ¿Qué tipos de reglas deberı́an agregarse
y cuáles serı́an las dificultades?
Página 2 de 2
Descargar