MC Mireya Tovar Vidal FCC- BUAP Cubículo 5 [email protected] Horario de atención: martes 11:00-12:00
Fundamentos de Lenguajes de
Programación
Contenido del curso
Cálculo lambda sin tipos
Cálculo lambda con tipos
PFC
Lenguaje de programación funcional
Bibliografía
Lambda Calculi with types
Henk Barendregt.
Handbook of Logic in Computer Science, Volume II.
Oxford University Press.
Foundations for Programming Languages,
J. C. Mitchell,
MIT Press, 1996
Evaluación
3 exámenes parciales 60%
Tareas y ejercicios 20%
Introducción
Un lenguaje de programación es un medio para comunicarse con una computadora que proporciona las facilidades necesarias para la programación
Imperativos Orientados a objetos Funcional Lógicos
Definición de un lenguaje
SintaxisDescripción del conjunto de secuencias de símbolos considerados como programas válidos.
Teoría de lenguajes formales bien desarrolladas (Chomsky)
Notación BNF Sistema de tipos
Propósito: prevenir errores en tiempo de ejecución
Análisis de tipos en tiempo de compilación
Análisis de tipos en tiempo de ejecución Semántica
Descripción del significado de instrucciones y expresiones
Formal: axiomática, operacional o denotacional.
Introducción
En 1936 se introdujeron dos modelos computacionales:
Alan Turing inventó la máquina de Turing y la noción de función computable en sus máquinas.
Alonzo Church inventó un sistema formal llamado Cálculo-λ
y la noción de función computable en su sistema.
Los lenguajes imperativos como Pascal, C, etc., así como el lenguaje ensamblador están basados en la máquina de Turing.
Los lenguajes funcionales como ML, Miranda, Haskell etc., están basados en el cálculo-λ.
Programación funcional
Proporcionan muchos recursos expresivos ausentes en otros LP: 1.Funciones como ‘ciudadanos de 1ª clase’
2.Sistema de tipos
3.Ausencia de efectos laterales, sin variables globales 4.Evaluación perezosa
Los programas funcionales son pequeños y fáciles de mantener
Los programas funcionales permiten utilizar técnicas de razonamiento formal
La capacidad computacional de los lenguajes funcionales es equivalente a la de la máquina de Turing
Calculo lambda
Objetivo
Introducir el cálculo-λy mostrar como este sistema captura todas
las funciones computables.
Sintaxis
Un término ese define como:
e ::= x (identificador) | e0e1 (aplicación) | λx. e (abstracción) En una abstracción: x es el argumento ees el cuerpo de la función
Ejemplo
Función identidad:λ
x. x
El nombre después de λes el identificador del argumento de esta función.
La expresión después del punto es el “cuerpo” de la definición.
Término válido, correspondiente en Java public int id(int x){return x;}
Término válido, correspondiente en C: int id(int x){return x;}
Asociaciones
Si M, N son las expresiones
M ≡
λ
x.x N ≡yRespectivamente entonces
MN = (λx.x) y Y no
λx. ( x y )
LMN Se asocia hacía la izquierda ((LM)N)
λx. λy. M Se asocia hacia la derecha (λx. (λy. M))
λx. λy. xyz Una aplicación tiene precedencia sobre una abstracción
Ejercicios
Decidir si son términos bien formados y asociar
λ
x.
λ
y. xy
λ
z.z
λ
x.
λ
y.
λ
z.xzyz
λ
x.
λ
y.
λ
z.xz(yz)
λ
x.
λ
y.
λ
z.x(zy)z
Más reglas
Para simplificar la notación los siguientes términos se tomarán como equivalentes:
λ
x
1.(
λ
x
2.(…(
λ
x
n.M)…)) es lo mismo que
λ
x
1x
2…x
n.M
Simplificar:λ
x.
λ
y. xy
λ
z.z
λ
x.
λ
y.
λ
z.xzyz
λ
x.
λ
y.
λ
z.xz(yz)
λ
x.
λ
y.
λ
z.x(zy)z
Expresiones y funciones
Expresiones x + y x + 2*y + z Funciones λx. (x+y) λz. (x + 2*y + z) Aplicación (λx. (x+y)) 3 = 3 + y (λz. (x + 2*y + z)) 5 = x + 2*y + 5 Parsing: λx. f (f x) = λx.(f (f (x)) )Alcance
En calculo-λtodos los nombres son locales a las definiciones
λx.t : El alcance de xes el término t
Una ocurrencia de la variable xse dice que esta acotada cuando está ocurre en el cuerpo tde una abstracción λx.t
(
λ
x. y x)(
λ
y. x y)
acotada acotada libreVariables libres y acotadas
En la función λx.x se dice que x esta “acotada” si sus ocurrencias en el cuerpo de la definición es precedida por λx. Si no es precedida por un λse llama “variable libre”.
(
λ
x. y x)(
λ
y. x y)
libreVariables
El conjunto de variables libres se define de manera inductiva como:
FV(x)={x}
FV(λx.M)= FV(M) -{x}
FV(M1M2)=F V(M1)
∪
FV(M 2)El conjunto de variables acotadas se define de manera inductiva como: BV(x)= ϕ BV(λx.M)=BV(M)
∪
{x} BV(M1M2)= B V(M1)∪
BV(M 2)Ejemplos
FV(λx. x (λy.x y z)) = {z} FV(λx. ((λy. y+2) x) + y ) = {y} BV(λx. x (λy.x y z)) = {x, y} BV(λx. ((λy. y+2) x) + y ) = {x, y}Términos cerrados
Un término M se llama cerradosi FV(M)= ϕ. En caso
contrario el término se conoce como abierto.
Note que los conjuntos de variables acotadas y libres no son necesariamente disjuntas; por ejemplo:
Subtérminos
Subtérmino de un término
Un subtérmino de un término- es alguna parte del término que esta bien formada de acuerdo a la gramática. El conjunto de subtérminos se puede define de manera inductiva como:
Sub:: T →P( T)
Sub(x)={x}
Sub(λx.M)=Sub(M) ∪{(λx.M)} Sub(M1M2)=Sub(M1)∪ Sub(M
2) ∪{M1M2}
Ejercicios
Calcular el conjunto de variables libres, acotadas y subtérminos de las siguientes expresiones λ