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