Lenguajes funcionales: λ-cálculo

Documentos relacionados
Lambda cálculo no tipado

Cálculo Lambda Lenguajes Aplicativos puros Un Lenguaje Aplicativo con referencias y asignación Lenguajes y Compiladores

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Lambda-Cálculo. Mauro Jaskelioff 6/9/2011

Cálculo Lambda - primera parte. Paradigmas de Lenguajes de Programación. Primer cuatrimestre

Introducción al Lambda Cálculo (C)

Tema 4. Funciones de orden superior

Tecnología de la Programación

Tipos en Haskell. Cecilia Manzino

Contenido del curso Fundamentos de Lenguajes de Programación

Lenguajes de Programación Programación funcional

Definiciones de computabilidad OTROS MODELOS COMPUTACIONALES. Computabilidad-Turing. Tesis de Church-Turing

UNIDAD IV Programación Funcional. Lic. Jesús Germán Andrés PAUTSCH - FCEQyN - UNaM

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

Semántica: principales usos. Semántica: principales enfoques. Semántica Operacional. Sintaxis abstracta de un lenguaje (sujeto) Semántica Operacional

Paradigma Funcional Caso de estudio: ML. Lenguajes de Programación 2018

Tema 4. Funciones de orden superior

LAMBDA-CÁLCULO NO TIPADO

LENGUAJES Y COMPILADORES

Facultad de Ciencias de la Computación. Cálculo Lambda Reducción β Transformación:Gelfond-Lifchitz. Dr. Fernando Zacarías Flores

Listas y Recursión. Taller de Álgebra I. Primer Cuatrimestre de 2015

Programación funcional

Lenguajes de programación LÓGICA COMPUTACIONAL LENGUAJES DE PROGRAMACIÓN. Sintaxis y semántica formales. Lenguaje IMP

Programación Internet con Lenguajes Declarativos Multiparadigma. PARTE I: Fundamentos

Lenguajes de programación ANÁLISIS LÓGICO LENGUAJES DE PROGRAMACIÓN. Sintaxis y semántica formales. Lenguaje IMP

Análisis lógico Cálculo de proposiciones

Cálculo Lambda - primera parte. Paradigmas de Lenguajes de Programación. Segundo cuatrimestre

Curso de Doctorado: Lenguajes Integrados Multiparadigma

Paradigma Funcional Caso de estudio: ML. Lenguajes de Programación 2017

Programación Funcional

CÁLCULO LAMBDA. Motivación: notación para no necesitar nombrar funciones. Por ejemplo, x + y puede ser: f(x) = x + y g(y) = x + y h(x, y) = x + y

Informática Haskell Matemáticas Curso Pepe Gallardo Universidad de Málaga. Temario

PARADIGMAS DE PROGRAMACIÓN CALCULO LAMBDA CALCULO LAMBDA

Sintaxis LÓGICA COMPUTACIONAL CÁLCULO DE PROPOSICIONES. Funciones boolenas. Semántica

CAPÍTULO IV: 4.1 Introducción a la. Programación Funcional

Tema 1: Programación Funcional

Introducción a Haskell. El lenguaje Haskell

Grado en Ciencias Ambientales. Matemáticas. Curso 11/12

Entendiendo expresiones lambda en C# con Mono

Introducción a la Lógica y la Computación

Fundamentos de la especificación formal

Guía 1: Funciones, precedencia y tipado

Aplicación de la Inducción Matemática Programación Funcional. Julio Ariel Hurtado Alegría Departamento de Sistemas Universidad del Cauca

Nociones Básicas de Sémantica: Semántica Denotacional

Inferencia de Tipos Breves apuntes de la clase

Introducción a OCaml. October 19, 2015

Laboratorio Análisis Lógico Práctica 1

Informática de 1 o de Matemáticas. Ejercicios de Introducción a Haskell. Ejercicio 1 Consideremos la siguiente definición:

Programación II Sesión 2: Especificación de problemas

Análisis semántico: Comprobación de tipos

Introducción a la programación funcional

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

Semántica Denotacional

1. Corrección de un programa TEMA 2: ESPECIFICACIÓN Y CORRECCIÓN DE ALGORITMOS. 1. Corrección de un programa. 1. Corrección de un programa

Programación Funcional

Introducción a la programación. Cecilia Manzino

Guía 2: Listas, recursión e inducción

Lambda Cálculo Tipado (1/3)

Verificación de programas. Algoritmos y Estructuras de Datos I. Semánticas formales: Primer cuatrimestre de 2016

Introducción al lambda cálculo

Isabelle como un lenguaje funcional

Tema 3. Patrones y Definiciones de Funciones

Teoría de Modelos Finitos: Motivación

El λ cálculo (sin tipos y con tipos)

I Programación funcional básica con Haskell 98 1

Tema 4: Definición de funciones

Tema 4: Definición de funciones

Guía 2: Funciones, listas, recursión e inducción

Mecanismo de Reducción

Expresiones Regulares

Se pueden agrupar las reglas que tienen la misma parte izquierda:

Tema 3. Patrones y Definiciones de Funciones

GUÍA BÁSICA DE SCHEME v.4

Introducción a Haskell. Cecilia Manzino

Bases Formales de la Computación

Programación Funcional Lisp-DrScheme Primera Parte. Dr. Oldemar Rodríguez Rojas Escuela de Informática Universidad de Nacional

Tipos de datos algebraicos

Programación Declarativa Haskell Informática Sistemas Curso Pepe Gallardo Universidad de Málaga. Tema 8. Listas

Introducción a la Lógica y la Computación

Tema II: Introducción al Lenguaje Funcional

Capítulo 2: Asistentes de Pruebas para Programadores 3. Cálculo de Construcciones

Construcción Formal de Programas en Teoría de Tipos. Introducción a Coq

Tema 2: Introducción a Haskell

La lógica de segundo orden: Sintaxis

PROGRAMACIÓN LÓGICA. David Felipe Rico Hernandez Gabriel Esteban Bejarano Delgado

Inteligencia Artificial

SISTEMAS INFORMÁTICOS PROGRAMACION I - Contenidos Analíticos Ing. Alejandro Guzmán M. TEMA 2. Diseño de Algoritmos

Generación de Código Intermedio

Práctica 1 Lambda Cálculo Tipado

Paradigmas de lenguajes de programación. Introducción a la programación imperativa. Lenguaje C. Programación imperativa

Tema 3: Características de la programación funcional. Sesión 5: El paradigma funcional (1)

12 OTRO MUNDO ES POSIBLE: AL

Repaso de Lógica de Primer Orden

Sintaxis LÓGICA COMPUTACIONAL CÁLCULO DE PROPOSICIONES. Funciones boolenas. Semántica

Lógica Proposicional. Significado de una Fórmula Proposicional

Teorema de incompletitud de Gödel

El lenguaje While. Yolanda Ortega Mallén. Dpto. de Sistemas Informáticos y Computación Universidad Complutense de Madrid

Funciones Segunda parte

Lógica de proposiciones (5)

Transcripción:

Lenguajes funcionales: λ-cálculo λ-cálculo (Church 1933) Cálculo para el estudio formal del comportamiento de las funciones Sintaxis: λ expresiones Reglas de reducción de λ expresiones Método matemático simple y consistente Es un Modelo Computacional: todas las funciones computables son expresables en el λ-cálculo λ-cálculo y programación funcional Los lenguajes funcionales modernos (Haskell, Miranda) son enriquecimientos (no triviales) del λ-cálculo con tipos. Características provenientes del λ-cálculo: Funciones como ciudadanos de primera clase Funciones de orden superior (currificación) Funciones anónimas (λ-notación) Semántica operacional Evaluación de expresiones (funcionales) por reducción FLP 2009/10 - Marisa Navarro 93 FLP 2009/10 - Marisa Navarro 94 Características provenientes del λ-cálculo con tipos: Tipado fuerte Inferencia de tipos Polimorfismo Implementación: El λ-cálculo puede usarse como lenguaje intermedio en el proceso de implementación de un lenguaje funcional: Haskell - - - - - - - traducción a código intermedio λ-cálculo - - - - - - - implementación código El lenguaje del λ-cálculo (sin tipos) Sintaxis: <expresión> ::= <variable> x, y,.., f, g.. <constante> 0,1, true, +,... λ<variable>.<expresión> <expresión> <expresión> Convenios sintácticos: λ-abstracción aplicación aplicación más prioritaria que λ-abstracción Ej: λx. x y significa λx.(x y) y no (λx. x) y aplicación asociativa a izquierdas Ej: x y z significa (x y) z y no x (y z) FLP 2009/10 - Marisa Navarro 95 FLP 2009/10 - Marisa Navarro 96

Funciones predefinidas: Hemos definido el λ-cálculo con constantes: números y operaciones aritméticas, booleanos y conectivos lógicos, operaciones sobre listas (cons, head, tail),... razonable a efectos prácticos, PERO podríamos haber definido el λ-cálculo puro (sin <constante>) ya que cada constante se puede definir mediante una λ-abstracción. Ej: Currificación: true λx. λy. x Consideramos la λ-abstracción con un único argumento Ej: λx 1,x 2,...,x n. e λx 1. λx 2.... x n. e Ejemplos de λ-expresiones 1. λx. + x 1 la función de x que suma a x el número 1 2. λx. λy. + x y función suma (curry) 3. λx. true función de x que devuelve true 4. λf. λx. f(f x) función doble 5. (λx. λy. + x y) 1 aplicación parcial de suma a 1 6. (λx. λy. + x y) 1 3 aplicación de suma a 1 y 3 7. (λy. + 1 y) 8. (λf. λx. f(f x)) (λy. + 1 y) 9. (λf. λx. f(f x)) (λy. + 1 y) 6 Qué expresiones son las tres últimas? Cómo se escriben todas ellas en Haskell? FLP 2009/10 - Marisa Navarro 97 FLP 2009/10 - Marisa Navarro 98 Aplicación: aspecto computacional de las funciones función argum. 678 } (λ x. e) e e [e / x] parámetro cuerpo se reduce a resultado formal El resultado de aplicar una λ-abstracción a un argumento es una instancia del cuerpo obtenida al sustituir las apariciones (libres) del parámetro formal por el argumento. Necesitamos definir formalmente la operación de sustitución Ejemplos: (λx. x 2) 6 6 2 3 (λx. λy. x y) 6 2 (λy. 6 y) 2 6 2 3 (λf. λx. f x) (λy. y 2) 6 (λx. (λy. y 2) x) 6 (λy. y 2) 6 6 2 3 Ejercicio: Reducir la λ-expresión (λx. (λx. +( x 1)) x 3) 9 FLP 2009/10 - Marisa Navarro 99 FLP 2009/10 - Marisa Navarro 100

Sustitución: el problema de la captura del nombre 1. sólo se sustituyen apariciones libres de y: (λy. y(u(λy. u y))) (λx. x a) y(u(λy. u y)) [λx. x a / y] (λx. x a) (u(λy. u y)) 2. captura de nombre: e e Variables libres en λ-expresiones Lib(e) = conjunto de variables libres (al menos 1 aparición) en e Lib(x) = {x} (x var) Lib(c) = {} (c cte) Lib(λx. e) = Lib(e) \ {x} (\ diferencia de conjs.) Lib(e 1 e 2 ) = Lib(e 1 ) Lib(e 2 ) 678 678 ( λy. λa. a y ) (λx. x a) (λa. a y) [λx. x a / y] λa. a (λx. x a) Ejemplo: Lib( (λx. λy. y x) ((λz. z x) x) ) = {x} Problema: a libre en e ha quedado capturada por λa de e Solución: aplicar α-conversión (λa. a y λb. b y) de forma que (λa. a y) [λx. x a / y] (λb. b y) [λx. x a / y] λb. b (λx. x a) FLP 2009/10 - Marisa Navarro 101 apar. ligadas apar. libres En (λa. a y) [λx. x a / y] la captura de nombre se dio porque a Lib(λx. x a) y además y Lib(a y) FLP 2009/10 - Marisa Navarro 102 La operación de Sustitución e [e / y] = sustitución de (todas las apariciones libres) de y por e en e x [e /y] = x, si x y y [e /y] = e c [e /y] = c (c cte) (e 1 e 2 ) [e /y] = (e 1 [e /y])(e 2 [e /y]) (λx. e) [e /y] = λx. e si x = y = λx. (e [e /y]) si x y (x Lib(e ) y Lib(e)) = (λz. (e [z/x])) [e /y] si x y x Lib(e ) y Lib(e) aplicada α-reducción: (λx. e) λz. (e [z/x]) con var nueva z (renombramos x por z) Reglas de reducción de expresiones β-reducción: (λx. e) e e [e / x] e β e e β e β-redex (con α-reducción si necesario) sii e se obtiene reduciendo una subexpresión de e que es un β-redex sii existen e 1, e 2,..., e n-1 (n>0) tales que e 1 β e 2 β... β e n-1 β e δ-reducción: reducción para las constantes predefinidas (+,, if-then-else, head, tail,...) Ejs.: 5 4 δ 1 5 ( 6 2) δ 5 3 δ 2 if true then e else e δ e tail(cons e e ) δ e FLP 2009/10 - Marisa Navarro 103 FLP 2009/10 - Marisa Navarro 104

Forma normal de una λ-expresión La forma normal de una expresión e es otra expresión e tal que e e (con siendo β ó δ ) y e no tiene ningún β-redex ó δ-redex. es decir, e es el resultado final del cómputo de e No toda expresión tiene forma normal: hay computaciones que no terminan (λx. x x) (λx. x x) La forma normal (si existe) es única (módulo α-conversión): todos los cómputos de e que terminan obtienen el mismo resultado (λx. f x) ((λy. g y) a) f ((λy. g y) a) f(g a) (λx. f x) ((λy. g y) a) (λx. f x) (g a) f(g a) Ordenes (o estrategias) de reducción Orden Aplicativo leftmost innermost redex Trata de reducir los argumentos antes de aplicar la función Evaluación impaciente Puede no encontrar la forma normal de una expresión: (λx. z) ((λx. x x) (λx. x x)) (λx. z) ((λx. x x) (λx. x x)) Orden Normal leftmost outermost redex Trata de reducir la función sin reducir los argumentos Evaluación perezosa (O.N + no repeticiones) Siempre obtiene la forma normal de una expresión (si existe) (λx. z) ((λx. x x) (λx. x x)) z FLP 2009/10 - Marisa Navarro 105 FLP 2009/10 - Marisa Navarro 106 SEMANTICA OPERACIONAL del λ-cálculo Da significado a las λ-expresiones en base a cómo se opera con ellas Un programa funcional (por ejemplo en Haskell) junto con la expresión a evaluar (algoritmo + input) puede ser representado por (o traducido a) una λ-expresión e Computación: consiste en reducir e hasta su forma normal La semántica operacional se basa en dos conceptos: Reglas de reducción: β-reducción (con α-reducción implícita en la sustitución) y δ-reducción Orden de reducción: orden normal ( En la evaluación perezosa de Haskell reducción de grafos ) FLP 2009/10 - Marisa Navarro 107 SEMANTICA DENOTACIONAL del λ-cálculo Dominios sintácticos: Ψ: Pro programas E: Exp λ-expresiones V: Var variables C: Cte constantes predefinidas Reglas de producción abstractas: Ψ ::= E E ::= V C E 1 E 2 λv.e Dominios semánticos: d : D D = dominio de valores (incluye funciones : D D) σ : S = Var D valoración de variables FLP 2009/10 - Marisa Navarro 108

Funciones semánticas: M: Pro D E: Exp (S D) Ecuaciones semánticas: M [Ψ ] = E [ Ψ ] σ 0 siendo σ 0 : Var D V a E [ V ] σ = σ [ V ] E [ C ] σ = C E [E 1 E 2 ] σ = (E [E 1 ] σ ) (E [E 2 ] σ ) (aplicación de una función D a un argumento D) E [λv.e ] σ = f E : D D definida como f E (d) = E [ E ] (σ [d/v]), para todo d D Ejercicio Dar el significado denotacional del siguiente programa funcional: Solución: Ψ = (λx.λy. x) (λu. 3) (λz. z) Sea σ 0 : V a (valoración inicial) M [ Ψ ] = E [ Ψ ] σ 0 = (E [(λx.λy. x) (λu. 3)] σ 0 ) (E [ λz. z ] σ 0 ) = ((E [ λx.λy. x ] σ 0 ) (E [ λu. 3 ] σ 0 )) (E [ λz. z ] σ 0 ) = (*) Ahora veamos cada parte: E [ λz. z ] σ 0 = ident : D D siendo ident (d) = E [ z ] (σ 0 [d/z]) = (σ 0 [d/z]) [ z ] = d FLP 2009/10 - Marisa Navarro 109 FLP 2009/10 - Marisa Navarro 110 E [ λu. 3 ] σ 0 = tres : D D siendo tres (d) = E [ 3 ] (σ 0 [d/u]) = 3 E [ λx. λy. x ] σ 0 = prim : D D siendo prim (d) = E [ λy. x ] (σ 0 [d/x]) Entonces: (*) = (prim tres) ident = (E [ λy. x ] (σ 0 [tres/x])) ident = (**) Ahora bien: E [ λy. x ] (σ 0 [tres/x]) = f : D D siendo f (d) = E [ x ] ((σ 0 [tres/x])[d/y]) = ((σ 0 [tres/x])[d/y]) [ x ] = tres Entonces: (**) = f ident = tres y M [ Ψ ] = tres siendo tres(d) = 3 FLP 2009/10 - Marisa Navarro 111 PODER EXPRESIVO del λ-cálculo El λ-cálculo permite expresar todas las funciones computables. Valores booleanos y condicional: true = λx.λy.x false = λx.λy.y if b then e else e = b e e Los números naturales (numerales de Church): 0 = λf.λx.x n = λf.λx.f(f(...(f x)...)) -- con n f s suc = λx.λy.λz.y(x y z) Similarmente, se pueden dar λ-expresiones para las tuplas y sus proyecciones, las listas y sus operaciones, etc. Ejercicio: Demostrar que if true then e else e β e y que suc k β k+1 FLP 2009/10 - Marisa Navarro 112

La recursión y el operador Y La recursión se expresa mediante el operador de punto fijo Y. Para toda λ-expresión e existe otra e tal que e e = β e (teorema del punto fijo), siendo = β la relación de equivalencia generada por β El operador (o combinador) de punto fijo Y = λf.(λx.f (x x))(λx.f (x x)) expresable en el λ-cálculo, obtiene el menor punto fijo de cualquier λ-expresión e, es decir: e (Y e) = β Y e El significado de una función recursiva f es el menor punto fijo de un funcional F, y por tanto se expresa como Y F FLP 2009/10 - Marisa Navarro 113 Ejemplo: Definición de la función recursiva factorial Cómo expresar la función factorial mediante una λ-expresión Fact? Deberá verificar la ecuación: Fact = β λx. if x = 0 then 1 else x Fact (x-1) o equivalentemente: Fact = β (λf.λx. if x = 0 then 1 else x f (x-1)) Fact es decir, Fact es el (menor) punto fijo del funcional F: λf.λx. if x = 0 then 1 else x f (x-1) Por tanto puede expresarse como Y F: Fact = Y (λf.λx. if x = 0 then 1 else x f (x-1)) FLP 2009/10 - Marisa Navarro 114