Subtipado (2) Paradigmas de lenguajes de programación 1er cuatrimestre 2007 Metateoría de subtipado Eliminación de reglas (S-Ref, S-Trans, T-Sub) Algoritmos de tipado/subtipado Tipado minimal Join & Meet Tipado mínimo Sintaxis T ::= Top tope |T→T funciones | {li : Ti, i ∈ 1..n} registros No agregamos nada más por ahora Reglas de subtipado S <: S (S-Refl) S <: U U <: T (S-Trans) S <: T S <: Top (S-Top) Reglas de tipado A<:A’ B <: B’ A’ → B <: A → B’ (S-Arrow) {li, i ∈ 1..n} ⊆ {kj, j ∈ 1..m} kj = li ⇒ Sj <: Ti (S-Rcd) {kj : Sj, j ∈ 1..m} <: {li : Ti, i ∈ 1..n} Regla S-Rcd Lema S<:T es derivable con S-RcdDepth, S-RcdWidth, S-RcdPerm ⇔ es derivable sólo con S-Rcd Dem. Inducción en la derivación Eliminación de S-Ref Por qué es superflua S-Ref Derivación dirigida por sintaxis Lema S<:T es derivable ⇔ es derivable sin usar S-Ref Dem. (⇒) Inducción en la derivación Eliminación de S-Trans Por qué es superflua S-Trans Derivación dirigida por sintaxis Lema S<:T es derivable ⇔ es derivable sin usar S-Trans (ni S-Ref) Dem. (⇒) Inducción en la derivación, usando el lema anterior Agregado cultural Suponer que agregamos el tipo base Bool (u otro) . ¿Cómo se modifica lo anterior? Solución Necesaria S-Ref para Bool <: Bool O bien especificar los pares que cumplan Subtipado algorítmico (S-Top) S <: Top A<:A’ B <: B’ A’ → B <: A → B’ (S-Arrow) {li, i ∈ 1..n} ⊆ {kj, j ∈ 1..m} kj = li ⇒ Sj <: Ti (S-Rcd) {kj : Sj, j ∈ 1..m} <: {li : Ti, i ∈ 1..n} Notación: |→ → S <: T Reformulación Proposición (correctitud y completitud) S <: T ⇔ |→ S <: T Dem. Inducción en la derivación, usando los dos lemas anteriores Algoritmo de subtipado subtype(S,T) = if T = Top then true else if S = S1 → S2 and T = T1 → T2 then subtype(T1,S1) and subtype(S2,T2) else if S = {kj : Sj, j ∈ 1..m} and T = {li : Ti, i ∈ 1..n} then {li, i ∈ 1..n} ⊆ {kj, j ∈ 1..m} and ∀i ∃j kj=li and subtype(Sj,Ti) else false Correctitud y completitud del algoritmo Proposición Si |→ S <: T, el algoritmo anterior devuelve true. Si no, el algoritmo anterior devuelve false. Además, el algoritmo anterior siempre termina. Tipado algorítmico Se busca el tipo mínimo Se calculará bottom up Γ | t : S S <: T Γ | t : T (T-Sub) No es dirigida por sintaxis, siempre podría aplicarse Puede posponerse la T-Sub Reglas de tipado algorítmico (1) x:T ∈ Γ (TA-Var) Γ |→ x:T Γ |→ t1 : T → T’ Γ |→ t2 : S |→ S <: T (TA-App) Γ |→ t1 t2 : T’ Γ , x : T |→ t : T’ (TA-Abs) Γ |→ λ x:T. t : T → T’ Typechecking: interpretar premisa 1 de TA-App como Γ |→ t1: A y chequear que A tenga la forma T → T’ Reglas de tipado algorítmico (2) ∀i Γ |→ ti : Ti (TA-Rcd) Γ |→ {li=ti, j ∈ 1..n} : {li : Ti, i ∈ 1..n} ∀i Γ |→ t : {li : Ti, i ∈ 1..n} (TA-Proj) Γ |→ t . lj : Tj Propiedad Teorema (correctitud) Γ |→ t : T ⇒ Γ | t : T Dem. Inducción en la derivación (derecho viejo) Propiedad de tipado mínimo Teorema (sub completitud o tipado mínimo) Γ | t : T ⇒ Γ |→ t : S para algún S <: T Dem. Inducción en la derivación Y por la correctitud, claramente el tipo S es mínimo Join & Meet: motivación Regla clásica Γ | b : Bool Γ | t2 : T Γ | t3 : T Γ | if b then t2 else t3 : T Pero qué tipo debería tener la expresión if true then {x=1,y=2} else {x=3,z=4} Acotación Podemos usar un tipo que acote a ambos {x:Int,y:Int} y {x:Int,z:Int} A priori hay varias posibilidades: {x:Int} {x:Float} {x:Top} {} Top ¿cuál elegimos? El encuentro … Join de S y T S ∨ T es un mínimo tipo A tal que S<:A , T<:A Meet de S y T S ∧ T es un máximo tipo A tal que A<:S , A<:T Vista en conjunto S∨T S T S∧T Equivalencia Definición: para tipos A y B A = B ⇔ A <: B <: A “A equivalente a B” En otras palabras, son deducibles ambas relaciones. La relación = resulta una relación de equivalencia. Primera junta Existencia de join siempre ¿Existencia de meet? no siempre Existencia de bounded meet siempre ¿Unicidad de join y meet? no siempre Unicidad módulo equivalencia siempre Condicional re acondicionado Regla nueva Γ | b : Bool Γ | t2 : T2 Γ | t3 : T3 Γ | if b then t2 else t3 : (T2 ∨ T3) El del ejemplo anterior será: | if true then {x=1,y=2} else {x=3,z=4} : {x:Int} Ejercicio mínimo Encontrar el tipo mínimo de if true then { x:2 , y:3 } else { x:4 , y:5 } if false then { x:2 , y:3 } else { x:1 } if true then { x:2 } else { y:3 } if false the false else { } if true the false else λx:Int . x Propiedades (ejercicio) Comprobar las siguientes equivalencias para cualesquiera tipos A, B, C. En la parte (3) asumir que existen los joins (∧) indicados A∨A=A,A∧A=A A∨B=B∨A A <: B ⇒ A ∨ B = B , A ∧ B = A A ∨ (B ∨ C) = (A ∨ B) ∨ C , A ∧ (B ∧ C) = (A ∧ B) ∧ C Caso de repaso Dar una regla de tipado para la expresión case t of { v1 → r1, …, vn → rn } Pista: pueden utilizarse joins según sea necesario Super temas - Conclusión Relaciones de base entre tipos Coercion semantics Mención de otros formalismos Concurrencia y canales λ<= Opus λζ Fun λ& F<= π-cálculo Pict Subtipado con tipos recursivos Continuará