Programación Declarativa Curso 2004-2005 Ingeniería Técnica en Informática de Gestión Departamento de Lenguajes y Ciencias de la Computación Universidad de Málaga Programación Declarativa 1 Profesorado 9Programación Lógica y Funcional Juan M. Molina Bravo http://www.lcc.uma.es/~jmmb Despacho: 3.2.47 Tutorías: Martes de 16:30 a 18:30 Miércoles de 10:45 a 12:45 Programación Declarativa 2 Horario Lunes Miércoles 12:45 a 14:45 12:45 a 14:45 Con sesiones de laboratorio por determinar dedicadas a clases prácticas en las que se avanza temario Programación Declarativa 3 Temario (Programación Funcional) • • • • • Principios de la programación funcional El lenguaje funcional Haskell Programación funcional con estructuras Programación funcional de orden superior Corrección de programas funcionales Programación Declarativa 4 Software (Programación Funcional) 9winhugs entorno de programación en Haskell para Windows http://www.haskell.org/hugs/ Programación Declarativa 5 Bibliografía I (Programación Funcional) “Razonando con Haskell. Un curso sobre programación funcional” B.C. Ruiz, F. Gutiérrez, P. Guerrero y J.E. Gallardo Ed. Thomson , 2004. “Introducción a la programación funcional con Haskell” (2ed) R. Bird Ed. Prentice-Hall, 1999. “The Craft of Functional Programming” S. Thompson Ed. Addison-Wesley, 1999. Programación Declarativa 6 Bibliografía II (Programación Funcional) Tutoriales y bibliografía disponible en internet http://www.haskell.org/bookshelf/#tutorials Programación Declarativa 7 Temario (Programación Lógica) 1. 2. 3. 4. 5. Principios de la programación lógica El lenguaje lógico Prolog Predicados extralógicos Programación lógica con estructuras Control en Prolog Programación Declarativa 8 Software (Programación Lógica) 9SWI-Prolog entorno de programación Prolog http://www.swi-prolog.org 9SLD-Draw representación de árboles SLD http://www.lcc.uma.es/~pacog/apuntes/pd Programación Declarativa 9 Bibliografía I (programación lógica) “The Art of Prolog” (2ed) Leon Sterling y Ehud Shapiro MIT Press, 1994 “Prolog Programming for Artificial Intelligence” (3ed) Ivan Bratko Addison-Wesley, 2000 “Clause and Effect” William F. Clocksin Springer-Verlag, 1997 “Programación en Prolog” (2ed) William F. Clocksin y Chris S. Mellish Gustavo Gili, 1993 Programación Declarativa 10 Bibliografía II (programación lógica) Libros gratuitos disponibles en internet: “Prolog Programming: A First Course” Paul Brna http://cbl.leeds.ac.uk/~paul/prologbook/ “Logic, Programming and Prolog” (2ed) Ulf Nilsson y Jan Maluszynski http://www.ida.liu.se/~ulfni/lpp/ Programación Declarativa 11 Programación Declarativa Antecedentes y evolución Programación Declarativa 12 Programación Declarativa (p.d.) La p.d. se caracteriza porque 9 los programas describen relaciones entre objetos/valores; pueden ser relaciones funcionales o relaciones más generales, y 9 dejan que el ejecutor del lenguaje (intérprete o compilador) trate de satisfacerlas aplicando un algoritmo fijo de cómputo. Estudiaremos dos estilos de p. d.: 9 Programación Funcional (en Haskell) “Cómputo = Reducción de expresiones” 9 Programación Lógica (en Prolog) “Cómputo = Resolución de enunciados” Programación Declarativa 13 Antecedentes históricos Gottlob Frege (1848-1925), creador del cálculo de predicados Gottlob Frege Programación Declarativa 14 Antecedentes históricos (1928) David Hilbert 9 D. Hilbert y W. Ackermann plantean el entscheidungsproblem, o problema de decisión, relativo a la existencia de algún procedimiento mecánico, sistemático, o algoritmo general, para decidir la validez de un enunciado en la lógica de predicados de primer orden. Wilhelm Ackermann Programación Declarativa 15 Antecedentes históricos de la p. f. (1936) Alonzo Church 9 A. Church desarrolla el cálculo lambda, teoría matemática de funciones recursivas. 9 “Calculabilidad efectiva” = expresable como función recursiva en dicho cálculo. 9 No existe algoritmo (def. mediante fun. rec.) que decida si dos expresiones cualesquiera del cálculo lambda son equivalentes o no. Programación Declarativa 16 Antecedentes históricos (1936) Alan Turing 9A. Turing introduce la noción de máquina de Turing. 9 Una computación es efectiva si la puede llevar a cabo una máquina de Turing. 9 No existe algoritmo para decidir si una máquina de Turing se detendrá o no (1936). Church y Turing demuestran que sus formalismos describen el mismo conjunto de funciones calculables. Programación Declarativa 17 Antecedentes históricos de la p. f. : los 60 John McCarthy 9(J. McCarthy, 1960) Aparición del primer lenguaje funcional (impuro): LISP . Vinculación dinámica, sin orden superior, con características imperativas 9 (P. Landin, década de los 60) Cálculo lambda como metalenguaje para expresar el significado de los lenguajes imperativos. Primer lenguaje funcional puro: ISWIM (If you See What I Mean), con las principales notaciones de la P.F. Programación Declarativa 18 Antecedentes históricos de la p. f. : de los 70 en adelante 9(R. Milner, 1978) Primer lenguaje funcional moderno con inferencia de tipos, tipos polimórficos, tipos abstractos y tratamiento de excepciones: ML (Meta Language). Utiliza evaluación precipitada. Robin Milner 9 (D. Turner, década de los 80) Desarrollo de los primeros lenguajes perezosos: Miranda. 9 (Finales de la década de los 80) Aparece la primera definición de Haskell desarrollada por un grupo de investigadores. 9 1999: Aparece la versión estable Haskell98. Programación Declarativa 19 Lenguajes funcionales actuales: Derivados/Implementaciones de ML Standard ML of New Jersey http://www.smlnj.org The Caml language http://caml.inria.fr/ sml.net http://www.cl.cam.ac.uk/Research/TSG/SMLNET/ http://www.it-c.dk/research/mlkit/ Programación Declarativa 20 Lenguajes funcionales actuales: Implementaciones de Haskell http://www.haskell.org/ http://www.haskell.org/hugs/ http://www.haskell.org/ghc/ Gofer Programación Declarativa 21 Otros lenguajes funcionales actuales http://www.cs.kun.nl/~clean/ Ericsson Computer Science Laboratory http://www.erlang.org/ http://www.schemers.com Programación Declarativa 22 Antecedentes históricos de la P.L. (I) 9 Años 30: el cálculo de predicados se desarrolla y evoluciona hacia una forma de computación con el descubrimiento de algoritmos que capturan el proceso de deducción de forma sistemática, 9 La lógica de predicados se adopta como lenguaje declarativo de especificación en computación. 9 Se considera la lógica de cláusulas de Horn. 9 Prawitz (1960) introduce la noción de unificación en la demostración automática de teoremas. 9 J. Alan Robinson (1965) concreta la noción de unificación con el descubrimiento del principio de resolución. 9 Luckham y Loveland introducen la resolución lineal. Programación Declarativa 23 Antecedentes históricos de la P.L. (II) 9 Robert Kowalski (1973): La lógica de cláusulas de Horn, con la resolución lineal, admite una interpretación procedimental como un lenguaje de programación. 9A. Colmerauer y Roussel (1973) crean, en la universidad de Marsella, el primer intérprete del lenguaje Prolog siguiendo las ideas de Kowalski. 9 David H.D. Warren (1977), en la universidad de Alain Colmerauer Edimburgo, contruye el primer compilador de Prolog para DEC-10. 9 David H.D. Warren (1983) crea la máquina de Warren para simplificar la compilación de Prolog. Programación Declarativa 24 Antecedentes históricos de la P.L. (III) 9 Finales 80 –Primeros 90: Proyecto de la Quinta Generación Concurrencia 9 Estándar ISO Prolog (1995) 9 Actualmente: Compiladores optimizadores Analizadores de código Programación con restricciones Orientación a objetos Programación Web Programación Declarativa 25 Lenguajes de programación lógica (I): http://www.sics.se/quintus/ http://www.sics.se/isl/sicstuswww/site/index.html SWI-Prolog demo_xpce.pl http://www.swi-prolog.org/ Programación Declarativa 26 Lenguajes de programación lógica (II): http://www.icparc.ic.ac.uk/eclipse/ http://www.mozart-oz.org/ Programación Declarativa 27 Lenguajes de programación lógico-funcional: Mercury http://www.cs.mu.oz.au/research/mercury/ http://www.informatik.uni-kiel.de/~pakcs/ Programación Declarativa 28