310 likes | 559 Views
EL λ-CÁLCULO CON TIPOS. Inmaculada Berrocal Rincón Pablo Camacho Aires Adrián Muñoz Alba. CONTENIDOS. Introducción Los Sistemas de tipos de Church y de Curry Propiedades del Sistema de tipos à la Curry Inferencia de tipos Un argumento Varios argumentos Otras variables predefinidas
E N D
EL λ-CÁLCULO CON TIPOS Inmaculada Berrocal Rincón Pablo Camacho Aires Adrián Muñoz Alba
CONTENIDOS • Introducción • Los Sistemas de tipos de Church y de Curry • Propiedades del Sistema de tipos à la Curry • Inferencia de tipos • Un argumento • Varios argumentos • Otras variables predefinidas • Inferencia de tipos en presencia de recursión • Inferencia de tipos en presencia de patrones • Reglas elementales para inferencia de tipos
INTRODUCCIÓN El λ-cálculo fue ideado por Church (1932-1933) como parte de una teoría general de funciones y lógica. El sistema se volvió inconsistente, como lo demostraron Kleene y Rosser (1936). El subsistema que trata con funciones llegó a ser un modelo factible para modelos computables. Esto es lo que se conoce hoy como el λ-cálculo. Kleene y Rosser demostraron que todas las funciones recursivas se podían representar en λ-cálculo. Por otra parte, Turing demostró que las funciones computables por una máquina de Turing pueden ser representadas en el λ-cálculo. La representación de funciones computables como λ-términos dió lugar a lo que se llama Programación Funcional. El λ-cálculo siempre ha sido tratado como una teoría libremente tipificada.
LOS SISTEMAS DE TIPOS DE CHURCH Y DE CURRY El uso de tipos para modelar la lógica se remonta al trabajo de Bertrand Russell en el año 1908 (Mathematical logic as based on a theory of types). En 1940, Alonzo Church desarrolló una teoría simple de tipos. Un poco antes fue Haskell Curry quien desarrolló una teoría de tipos para la lógica combinatoria en 1934. Henk P. Barendregt, en su artículo Lamba Calculi with Types, distingue esencialmente dos estilos para la descripción de los sistemas de tipos, denominados sistemas de tipos à la Church y sistemas de tipos à la Curry. Los primeros se suelen llamar sistemas explícitos, mientras que los segundos se conocen como implícitos, y en estos los términos a tipificar son esencialmente los del λ-cálculo.
LOS SISTEMAS DE TIPOS DE CHURCH Y DE CURRY En el sistema de tipos à la Curry, los términos puede tener un conjunto de tipos posibles que puede estar vacío, tener uno o varios elementos. En el sistema de tipos à la Church, cada término tiene un tipo que es único. En los sistemas à la Curry falla la propiedad de unicidad de tipos.
LOS SISTEMAS DE TIPOS DE CHURCH Y DE CURRY El sistema de tipos de Curry viene descrito por el siguiente axioma y reglas de inferencia:
PROPIEDADES • Conservación del tipo: la evaluación de un término no modifica el tipo de dicho término. • Todo término tipificable es fuertemente normalizante: si un término es tipificable, tiene una forma normal. • Sustitución: podemos considerar tipos resultantes por sustitución de tipos en expresiones o contextos.
PROPIEDADES • Problemas fundamentales en los sistemas de tipos en general • Comprobación de tipos • Tipificación • Habitabilidad La demostración de la decibilidad de los dos primeros problemas surge de la demostración que Curry y Hindley realizaron sobre la tipificabilidad de un término. El tercer problema no es decidible en el lambda cálculo polimórfico.
LEMA DE GENERACIÓN • Si Г├ x :, entonces x : Г. • Si Г├ f a :, entonces existe un tipo tal que Г├ f : ^ Г├ a :. • Si Г├ x.b : , entonces existen dos tipos y tales que ≡ , y además Г,x : ├ b : .
UNICIDAD DE TIPO DE VARIABLES (UniVar) Г├ x :1 Г├ x :2 1 ≡ 2 Demostración. Si tenemos las derivaciones de la parte izquierda de la implicación anterior, aplicando al apartado (a) del lema anterior tendremos que x :1 Г ^ x :2 Г Pero en un mismo contexto no puede aparecer variables repetidas. Es necesario que 1 ≡ 2.
INFERENCIA DE TIPOS En el sistema de tipos à la Curry, los problemas fundamentales de comprobación de tipos (type checking), tipificación (typability) y habitabilidad (inhabitation) son decidibles. Malecki descubrió que el problema de la tipificación se puede reducir al problema de la comprobación de tipos. Hindley y Milner dan para el λ-cálculo à la Curry una función pp recursiva tal que para cada término a tipificable, pp(a) es un par principal de a que además falla si el término no es tipificable. • Гa├ a : a • Si Г├ a : entonces existe una sustitución • *≡ 1,… n := 1,…n tal que Гa* Г y ≡ a
INFERENCIA DE TIPOS:UN ARGUMENTO Para una expresión E y una función en C f = x.E que sea tipificable, existirá un tipo y un contexto Г que se le podrá asignar a nuestra función de la forma (en Haskell se utilizan los dos puntos :: para indicar la asignación de tipos) Г├ x.E :: Г├ f :: que se le podrá aplicar el apartado (c) del lema de generación, obteniendo Г,x :: ├ E :: ≡ REGLA I: Asignamos tipo al argumento y al resultado de la función de forma que para cierto contexto tendremos Г,x :: ├ E :: Г├ f ::
INFERENCIA DE TIPOS:UN ARGUMENTO • Ejemplo: Tenemos la ecuación f x = x. Por la aplicación de la REGLA I tenemos Г,x ::├ x :: Г├ f :: Pero como las variables tienen tipos únicos en el mismo contexto, entonces tenemos que ≡ . El menor contexto, que sería el contexto principal, que cumpla lo anterior es Г ≡ . El tipo principal sería , aunque podría haber otros como por ejemplo .
INFERENCIA DE TIPOS:VARIOS ARGUMENTOS Para una expresión E y una función en C f = x.(y.E) que sea tipificable, aplicando la REGLA I existirá un contexto y dos tipos de forma que: Г,x :: ├ y.E :: Г ├ f :: Aplicando el apartado (c) del lema de generación, existirán otros dos tipos y de forma que Г,x :: ,y :: ├ E :: ≡ REGLA I: Asignamos tipos a los argumentos y al resultado de la función de forma que para cierto contexto tendremos Г,x :: ,y :: ├ E :: Г ├ f ::
INFERENCIA DE TIPOS:VARIOS ARGUMENTOS • Ejemplo: Tenemos la ecuación f x y = y x. Asignando la REGLA I tenemos Г,x :: ,y :: ├ y x :: Г ├ f :: Aplicando el apartado (b) del lema de generación tenemos que Г,x :: ,y :: ├ y :: ’ Г,x :: ,y :: ├ x :: ’ Si aplicamos la unicidad de tipos para variables debe tenerse ≡ ’ y = . Para obtener un par principal, podríamos tomar como contexto el vacío porque no hay más variables. La derivación se obtendría con el siguiente par principal: ├ f :: ( )
INFERENCIA DE TIPOS:VARIOS ARGUMENTOS • Ejercicio 17.30: Infiere el tipo de la ecuación f x y = x y. Asignando la REGLA I tenemos Г,x :: ,y :: ├ x y :: Г ├ f :: Aplicando el apartado (b) del lema de generación tenemos que Г,x :: ,y :: ├ x :: ’ Г,x :: ,y :: ├ y :: ’ Si aplicamos la unicidad de tipos para variables debe tenerse ≡ ’ y = . Para obtener un par principal, podríamos tomar como contexto el vacío porque no hay más variables. La derivación se obtendría con el siguiente par principal: ├ f :: ( )
INFERENCIA DE TIPOS:VARIOS ARGUMENTOS A través del ejemplo anterior, obtenemos la siguiente regla: Si E es una variable es necesario que aparezca en el contexto: Esta regla es un caso particular interesante, y junto a la REGLA I y a la REGLA II son suficientes para inferir el tipo en muchos casos. REGLA II: En el sistema λ-cálculo à la Curry, se cumple la propiedad Г,f :: ├ f E :: .Г,f :: ├ E :: ^ ≡ REGLA II’: En el sistema λ-cálculo à la Curry, se cumple la propiedad Г,x :: ,f :: ├ f x :: ≡
INFERENCIA DE TIPOS:VARIOS ARGUMENTOS • Ejemplo: Vamos a inferir el tipo principal del operador de ecuación (.) f g x = f(g x), que nos da la composición de dos funciones. Asignando tipos a los argumentos y utilizando el resultado que nos da la REGLA I, tenemos Г,f :: ,g :: ,x :: ├ f(g x) :: Г├ f :: Aplicamos ahora la REGLA II, y para cierto tipo tendremos Г,f :: ,g :: ,x :: ├ g x :: ≡ Y aplicando ahora la REGLA II’, tenemos ≡ . Como no aparecen más variables, se puede tomar Г = , y tendríamos como un par principal: ├ (.) :: ( ) ( )
INFERENCIA DE TIPOS:VARIOS ARGUMENTOS • Ejemplo: Consideremos la ecuación f x y = y(y x). Asignando la REGLA I, y teniendo en cuenta que sólo hay dos variables, podremos coger como contexto el vacío, y tendremos x :: ,y :: ├ y(y x) :: ├ f :: Si aplicamos ahora la REGLA II, tendremos un tipo tal que x :: ,y :: ├ y x :: ≡ Y aplicando ahora la REGLA II’, tendremos ≡ , que junto a ≡ nos da que todas las variables de tipo sean iguales, exceptuando , y tendremos el par: ├ f :: ( )
INFERENCIA DE TIPOS (VAR. PREDEFINIDAS) El proceso de compilación recoge toda la información necesaria para el proceso de inferencia de todas las ecuaciones del programa. Si se tiene una variable no definida y un contexto vacío, se produce el error. Ej: sea la función f x = h x :
INFERENCIA DE TIPOS (VAR. PREDEFINIDAS) • Dos ejemplos de inferencia: f x = x ++ x dos f = f . f 1 2 3 4 5 1 3 2 4 5
INFERENCIA DE TIPOS EN PRESENCIA DE RECURSIÓN • Uso del combinador Y (puntos fijos) • Sabemos que el tipo de Y es Y : (T T) T • Supongamos la siguiente ecuación en λ-cálculo: f = Y F F = λux. u x f :: T y F:: TT • F = λux. u x. Regla I u :: α, x :: β ├ u x :: γ ├ F :: α β γ Regla II’ α ≡ β γ sustituyendo α en F nos queda: F :: (β γ) β γ f :: β γ
INFERENCIA DE TIPOS EN PRESENCIA DE RECURSIÓN • Ejemplo: Encontrar el tipo más general de la ecuación m x = m (m x) a) m = Y F F m x = m (m x) Regla I m :: α, x :: β ├ m (m x) :: γ ├ F ::: α β γ Regla II m :: α, x :: β ├ mx :: δ α ≡ δ γ Regla II’ α ≡ β δ Igualdad de tipos δ γ ≡ β δ y por lo tanto γ ≡ β ≡ δ F:: (δ δ) δ δ m :: δ δ sabemos que F :: T T y m :: T
INFERENCIA DE TIPOS EN PRESENCIA DE RECURSIÓN • Ejemplo: Encontrar el tipo más general de la ecuación m x = m (m x) b) mx = m (mx) Regla I x :: β├ m (m x) :: γ ├ m ::: β γ Regla II x :: β├ m x :: δ x :: β ├ m ::: δ γ Regla II’ x :: β├ m :: β δ x :: β ├ m ::: δ γ Podemos suponer que la función aparece como una variable en el contexto. Suponiendo esta propiedad si podemos aplicar la unicidad de tipos βδ ≡ δγ γ ≡ β ≡ δ y por tanto m :: δ δ
INFERENCIA DE TIPOS EN PRESENCIA DE PATRONES f (y : ys) = E Aplicamos la Regla I, suponiendo que y:ys es una variable ∆, (:) y ys :: α ├ E :: δ ∆ ├ f :: α δ Como las variables y, ys son libres, deben aparecer en el contexto Г, y :: β, ys :: γ, (:) y ys :: α ├ E :: δ Г ├ f :: α δ Г, y :: β, ys :: γ ├ (:) y ys :: α Г, y :: β, ys :: γ, (:) y ys :: α ├ (:) :: β γ α Como sabemos que ├ (:) :: a [a] [a], podemos concluir que γ ≡ [β] ≡ α Г, y :: β, ys :: [β] ├ E :: δ Г ├ f :: [β] δ Aplicaremos la regla I con la diferencia de que debemos asignar tipos a las variables de los patrones.
INFERENCIA DE TIPOS EN PRESENCIA DE PATRONES Ejemplo: data A a = Vacio | N (A a) a (A a) izdo (N i x d) = i Aplico la Regla I i :: A a, x :: a, d :: A a ├ i :: β ├ izdo :: Aa β Por la unicidad de tipos A a ≡ β izdo :: Aa Aa
INFERENCIA DE TIPOS EN PRESENCIA DE PATRONES Ejemplo: foldr f z [] = z foldr f z (x:xs) = f x (foldr f z xs) foldr f z (x:xs) = f x (foldr f z xs) Aplicamos la Regla I f :: α, z :: β, x :: γ, xs :: [γ] ├ f x (foldr f z xs) :: δ ∆ ├ foldr f z xs :: δ el tipo de f es α ≡ γ δ δ ├ foldr :: (γ δ δ) β [γ] δ foldr f z [] = z ├ foldr :: τ ρ [ϖ] ρ Unificamos con la solución de la ecuación anterior β ≡ρ≡ δ y ϖ ≡ γ, ├ foldr :: (γ δ δ) δ [γ] δ
REGLAS ELEMENTALES PARA INFERENCIAS DE TIPOS • Regla de aplicación: • Regla de igualdad de tipos f x :: τ (a) ├ Regla de aplicación γ | ( x :: γ) ^ ( f :: γ τ) e :: τ ^ e:: σ (i) ├ Igualdad de tipos τ ≡ σ
REGLAS ELEMENTALES PARA INFERENCIA DE TIPOS Ejemplo: omega y = λ f f (f y) omega y f = f (f y) Asignamos tipos diferentes a los argumentos y al cuerpo y :: α, f :: β, f (f y) :: γ omega :: α β γ f (f y) :: γ (a) ├ Regla de aplicación δ | ( fy :: δ ) ^ ( f :: δ γ) ( f :: β) ^ ( f :: δ γ) (i) ├ Igualdad de tipos β ≡ (δ γ) f y :: δ (a) ├ Regla de aplicación α | ( y :: α ) ^ ( f :: α δ) ( f :: δ γ) ^ ( f :: α δ) (i) ├ Igualdad de tipos (δ γ) ≡ (α δ) ( δ γ) = (α δ) (i) ├ Igualdad de tipos (δ ≡ γ) ^ (α ≡ δ) omega :: γ (γ γ) γ
REGLAS ELEMENTALES PARA INFERENCIA DE TIPOS Ejemplo: cosa f x = λg g f (f x g) cosa f x g = g f (f x g) Asignamos tipos a los argumentos y al cuerpo de la función f :: α, x :: β, g :: γ, g f (f x g) :: δ cosa :: α β γ δ g f (f x g) :: δ (a) ├ Regla de aplicación τ | ( f x g :: τ ) ^ ( g f :: τ δ) f x g :: τ (a) ├ Regla de aplicación γ | (g :: γ ) ^ ( f x :: γ τ ) f x :: γ τ (a) ├ Regla de aplicación β | (x :: β ) ^ ( f :: β (γ τ )) Observemos que α ≡ (β (γ τ )) y que γ ≡ (α (τ δ)), el tipo de cosa no es correcto. ( f :: α) ^ ( f :: β (γ τ )) (i) ├ Igualdad de tipos α ≡ (β (γ τ )) g f :: τ δ (a) ├ Regla de aplicación α | (f :: α ) ^ ( g :: α (τ δ) ) (g :: γ) ^ ( g :: α (τ δ) ) (i) ├ Igualdad de tipos γ ≡ (α (τ δ))
BIBLIOGRAFÍA • RAZONANDO CON HASKELL: Un curso sobre programación funcional - Blas C. Ruiz Jimenez, Francisco Gutiérrez López, Pablo Guerrero García, José E. Gallardo Ruíz - Universidad de Málaga - 2004 • LAMBDA CALCULI WITH TYPES - Henk P. Barendregt - Catholic University Nijmegen - 1991