Title: EL ?-C
1EL ?-CÁLCULO CON TIPOS
- Inmaculada Berrocal Rincón
- Pablo Camacho Aires
- Adrián Muñoz Alba
2CONTENIDOS
- 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
3INTRODUCCIÓ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.
4LOS 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.
5LOS 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.
6LOS SISTEMAS DE TIPOS DE CHURCH Y DE CURRY
- El sistema de tipos de Curry viene descrito por
el siguiente axioma y reglas de inferencia
7PROPIEDADES
- 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.
8PROPIEDADES
- 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.
9LEMA 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 ?.
10UNICIDAD 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.
11INFERENCIA 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
12INFERENCIA DE TIPOSUN 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 ? ? ?
13INFERENCIA DE TIPOSUN 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 ? ? ?.
14INFERENCIA DE TIPOSVARIOS 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 ? ? ? ? ?
15INFERENCIA DE TIPOSVARIOS 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 ? ? (? ? ?)? ?
16INFERENCIA DE TIPOSVARIOS 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 (? ? ?)? ? ? ?
17INFERENCIA DE TIPOSVARIOS 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 ? ?
? ? ? ?
18INFERENCIA DE TIPOSVARIOS 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 - (.) (? ? ?)? (? ? ?)? ? ? ?
19INFERENCIA DE TIPOSVARIOS 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 ? ? (? ? ?)? ?
20INFERENCIA 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
21INFERENCIA 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
22INFERENCIA 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 T?T
- F ?ux. u x.
- Regla I
- u a, x ß u x ? F a ? ß ? ?
- Regla II
- a ß ? ? sustituyendo a en F nos
queda - F (ß ? ?) ? ß ? ?
- f ß ? ?
23INFERENCIA 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 a, x ß m (m x) ? F a ? ß ?
? - Regla II
- m a, x ß m x d a d ? ?
- Regla II
- a ß ? d
- Igualdad de tipos
- d ? ? ß ? d y por lo tanto ? ß d
-
- F (d ? d) ? d ? d m d ? d
sabemos que F T ? T y m T
24INFERENCIA DE TIPOS EN PRESENCIA DE RECURSIÓN
- Ejemplo Encontrar el tipo más general de la
ecuación - m x m (m x)
- b) m x m (m x)
- Regla I
- x ß m (m x) ? m ß ? ?
- Regla II
- x ß m x d x ß m d ? ?
- Regla II
- x ß m ß ? d x ß m d ? ?
- Podemos suponer que la función aparece como una
variable en el contexto. Suponiendo esta
propiedad si podemos aplicar la unicidad de tipos
ß?d d?? - ? ß d y por tanto m d ? d
25INFERENCIA DE TIPOS EN PRESENCIA DE PATRONES
- f (y ys) E
- Aplicamos la Regla I, suponiendo que yys es
una variable - ?, () y ys a E d ? f a? d
- Como las variables y, ys son libres, deben
aparecer en el contexto - ?, y ß, ys ?, () y ys a E d ?
f a? d - ?, y ß, ys ? () y ys a
- ?, y ß, ys ?, () y ys a () ß ?
? ? a - Como sabemos que () a ? a ? a,
podemos - concluir que ? ß a
- ?, y ß, ys ß E d ? f ß
? d -
- Aplicaremos la regla I con la diferencia de que
debemos asignar tipos a las variables de los
patrones.
26INFERENCIA 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
27INFERENCIA DE TIPOS EN PRESENCIA DE PATRONES
- Ejemplo
- foldr f z z
- foldr f z (xxs) f x (foldr f z xs)
- ? foldr f z (xxs) f x (foldr f z xs)
- Aplicamos la Regla I
- f a, z ß, x ?, xs ? f x (foldr
f z xs) d - ? foldr f z xs d
- el tipo de f es a ? ? d ? d
- foldr (? ? d ? d) ? ß ? ? ? d
- ? foldr f z z
- foldr t ? ? ? ? ? ?
- Unificamos con la solución de la ecuación
anterior ß ? d y ? ?, - foldr (? ? d ? d) ? d ? ? ? d
28REGLAS ELEMENTALES PARA INFERENCIAS DE TIPOS
- Regla de aplicación
- Regla de igualdad de tipos
f x t (a) Regla de aplicación ? ( x
?) ( f ? ? t)
e t e s (i) Igualdad de tipos t s
29REGLAS 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 a, f ß, f (f y) ? omega a ?
ß ? ? - f (f y) ?
- (a) Regla de aplicación
- d ( fy d ) ( f d ? ?)
- ( f ß) ( f d ? ?)
- (i) Igualdad de tipos
- ß (d ? ?)
- f y d
- (a) Regla de aplicación
- a ( y a ) ( f a ? d)
- ( f d ? ?) ( f a ? d)
- (i) Igualdad de tipos
- (d ? ?) (a ? d)
-
- ( d ? ?) (a ? d)
- (i) Igualdad de tipos
- (d ?) (a d)
-
- omega ? ? (? ? ?) ? ?
30REGLAS 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 a, x ß, g ?, g f (f x g) d
cosa a ? ß ? ? ? d - g f (f x g) d
- (a) Regla de aplicación
- t ( f x g t ) ( g f t ? d)
- f x g t
- (a) Regla de aplicación
- ? (g ? ) ( f x ? ? t )
- f x ? ? t
- (a) Regla de aplicación
- ß (x ß ) ( f ß ? (? ? t ))
- Observemos que a (ß ? (? ? t )) y que ? (a
? (t ? d)), el tipo de cosa no es correcto.
( f a) ( f ß ? (? ? t )) (i)
Igualdad de tipos a (ß ? (? ? t )) g f t
? d (a) Regla de aplicación a (f a )
( g a ? (t ? d) ) (g ?) ( g a
? (t ? d) ) (i) Igualdad de tipos ? (a
? (t ? d))
31BIBLIOGRAFÍ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