EL λ-CÁLCULO CON TIPOS Inmaculada Berrocal Rincón Pablo Camacho Aires Adrián Muñoz Alba.

Download Report

Transcript EL λ-CÁLCULO CON TIPOS Inmaculada Berrocal Rincón Pablo Camacho Aires Adrián Muñoz Alba.

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
o

Inferencia de tipos
o
o
o



Propiedades del Sistema de tipos à la Curry
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
1
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.
2
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.
3
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.
4
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:
5
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
sustitución de tipos en expresiones o contextos.

por
6
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.
7
LEMA DE GENERACIÓN
a)
Si Г├ x :, entonces x : 
b)
Si Г├ f a :, entonces existe un tipo  tal que
Г├ f :    ^ Г├ a :.
c)
Si Г├ x.b : , entonces existen dos tipos  y 
tales que  ≡    , y además Г,x : ├ b : .
Г.
8
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.
9
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.
(1) Гa├ a : a
(2) Si Г├ a :  entonces existe una sustitución
*≡ 1,… n := 1,…n tal que Гa*  Г y  ≡ a
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.
10
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 ::   
11
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   .
12
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 ::     
13
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 ::   (  ) 
14
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 :: (  )   
15
INFERENCIA DE TIPOS:
VARIOS ARGUMENTOS
A través del ejemplo anterior, obtenemos la siguiente regla:
REGLA II: En el sistema λ-cálculo à la Curry, se cumple la propiedad
Г,f :: ├ f E ::   .Г,f :: ├ E ::  ^ ≡   
Si E es una variable es necesario que aparezca en el contexto:
REGLA II’: En el sistema λ-cálculo à la Curry, se cumple la propiedad
Г,x :: ,f :: ├ f x ::    ≡   
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.
16
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:
├ (.) :: (  ) (  )   
17
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 ::   (  ) 
18
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 :
19
INFERENCIA DE TIPOS
(VAR. PREDEFINIDAS)

Dos ejemplos de inferencia:
f x = x ++ x
1
2
4
3
5
dos f = f . f
1
4
3
2
5
20
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=YF
F = λux. u x
f :: T y F:: TT
F = λux. u x.
Regla I
u :: α, x :: β ├ u x :: γ
├ F :: α  β  γ
Regla II’
α≡βγ
sustituyendo α en F nos queda:
F :: (β  γ)  β  γ
f :: β  γ
21
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=YF
sabemos que F :: T  T y m :: T
F m x = m (m x)

Regla I
m :: α, x :: β ├ m (m x) :: γ
├ F ::: α  β  γ
Regla II
m :: α, x :: β ├ m x :: δ
α≡δγ
Regla II’
α≡βδ
Igualdad de tipos
δ  γ ≡ β  δ y por lo tanto γ ≡ β ≡ δ
F:: (δ  δ)  δ  δ
m :: δ  δ
22
INFERENCIA DE TIPOS EN
PRESENCIA DE RECURSIÓN
Ejemplo:
b)
Encontrar el tipo más general de la ecuación
m x = m (m x)
m x = m (m x)
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 :: δ  δ
23
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
24
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
25
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 :: (γ  δ  δ)  δ  [γ]  δ
26
REGLAS ELEMENTALES PARA
INFERENCIAS DE TIPOS

Regla de aplicación:
f x :: τ
(a) ├ Regla de aplicación
γ | ( x :: γ) ^ ( f :: γ  τ)

Regla de igualdad de tipos
e :: τ ^ e:: σ
(i) ├ Igualdad de tipos
τ≡σ
27
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 :: β) ^ ( f :: δ  γ)
(i) ├ Igualdad de tipos
β ≡ (δ  γ)
( δ  γ) = (α  δ)
(i) ├ Igualdad de tipos
(δ ≡ γ) ^ (α ≡ δ)
f y :: δ
(a) ├ Regla de aplicación
α | ( y :: α ) ^ ( f :: α  δ)
omega :: γ  (γ  γ)  γ
28
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 :: α) ^ ( f :: β  (γ  τ ))
(i) ├ Igualdad de tipos
α ≡ (β  (γ  τ ))
(a) ├
g f :: τ  δ
Regla de aplicación
α | (f :: α ) ^ ( g :: α  (τ  δ) )
f x :: γ  τ
(g :: γ) ^ ( g :: α  (τ  δ) )
(a) ├ Regla de aplicación
(i) ├ Igualdad de tipos
β | (x :: β ) ^ ( f :: β  (γ  τ ))
γ ≡ (α  (τ  δ))
Observemos que α ≡ (β  (γ  τ )) y que γ ≡ (α  (τ  δ)), el tipo de
cosa no es correcto.
29
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
30