Esta asignatura se imparte en el tercer curso de la titulación, lo que permite asumir que los alumnos que la vayan a cursar, ya tendrán el suficiente entrenamiento en otras disciplinas afines que les habrán aportado conocimientos, capacidades y niveles de abstracción suficientes para asimilar convenientemente los contenidos que se imparten en la misma.
En lo que respecta a conocimientos previos, se espera una formación media en:
- Formalismos Matemáticos. Aquí se pone especial énfasis en los conocimientos referentes a lógica matemática y, en menor medida, álgebra, ya que suponen la base formal de los lenguajes lógicos y funcionales que se estudian clásicamente dentro del paradigma declarativo.
- Lenguajes y Técnicas de Programación. El alumno debe estar suficientemente familiarizado con algunos lenguajes de programación de estilo imperativo u orientado objeto, así como con técnicas de programación básicas, que en general no tengan por qué ser totalmente dependientes de un lenguaje de programación concreto para su implementación final. Esto permitirá contrastar de forma más satisfactoria el nuevo paradigma declarativo con otros estilos de programación, resaltando el amplio repertorio de recursos expresivos que aportan a la hora de codificar la solución a un problema minimizando el tamaño de las aplicaciones.
- Algorítmica y Estructuras de Datos. En relación con el apartado anterior, se espera que el alumno conozca las estructuras de datos y los esquemas algorítmicos básicos a la hora de representar y manipular la información de forma conveniente, para que posteriormente pueda simplificar tanto las tareas de implementación y mantenimiento, como el cálculo de coste computacional haciendo uso de tecnología declarativa.
- Teoría de Autómatas y Computación. Puesto que la programación declarativa viene aportando lenguajes de programación con altos niveles de abstracción y sólida cimentación matemática, se espera que el alumno conozca y sepa aplicar los fundamentos de la teoría de lenguajes formales, especificaciones algebraicas y métodos formales de la ingeniería del software.
Más específicamente el alumno debería:
- Ser capaz de trabajar dentro de un marco matemático y formal, y conocer la especificación de la sintaxis de un lenguaje de programación.
- Poseer cierta capacidad de abstracción que le permita fijarse en las ideas y conceptos claves
por encima de los detalles y la notación utilizada.
- Ser capaz de describir e interpretar de forma precisa algoritmos expresados en forma de pseudocódigo, pero también de diseñar algoritmos eficientes para resolver un problema dado y hacer uso de las mejores herramientas que les aporte un cierto lenguaje de programación elegido para su implementación final.
Justificación en el Plan de Estudios, Relación con otras asignaturas y con la profesión
En los inicios de la era de la programación, dos son los grandes esquemas computacionales que emergen desde un mundo que todavía es más matemático que informático. Ambos marcos, aún cuando mantienen ciertas correspondencias y equivalencias desde una visión muy abstracta, repercuten posteriormente de forma muy distinta en los estilos de programación modernos. Si bien el lambda-cálculo de Church y Kleene de alguna manera inicia la trayectoria declarativa, por su parte la Máquina de Turing se erige como fuente de inspiración para la tradición imperativa. Este último caso se implanta físicamente de forma muy rápida sobre la arquitectura de Von Newman (que en esencia sigue vigente en el diseño de los computadores actuales), aprovechando las claras sinergias existentes entre el modelo lógico y el físico.
Esta evolución es en buena parte responsable de que el impacto de la programación declarativa sea a día de hoy mucho menor que el estilo imperativo a varios niveles, incluido el académico, aún cuando buena parte de los recursos expresivos de los lenguajes que se estudian en las carreras de informática tienen precedentes con fuerte sabor declarativo (recursión, tipos, etc.). De esta manera, para evitar que el desconocimiento de esta perspectiva de programación pueda sesgar el nivel de formación que requieren unos estudios superiores en informática, la asignatura de programación declarativa puede resultar fundamental especialmente para los alumnos que opten por la intensificación de computación.
El estudio de los lenguajes lógicos (como Prolog) y funcionales (Haskell), supone una salida práctica a buena parte de los conocimientos teóricos que el alumno adquiere en las asignaturas de Lógica y Álgebra, impartidas desde el Departamento de Matemáticas. A su vez, como herramientas de programación, complementan la percepción del concepto de programación que el alumno adquiere en otras asignaturas donde raramente se introducen conceptos que vayan más allá del mundo imperativo y orientado a objetos, obviando recursos expresivos tan potentes como la re-evaluación, pereza, reversibilidad, orden superior, etc. Todos estos enriquecimientos (que en un futuro más o menos cercano podrían ser transferidos a otros lenguajes más populares, como ya ha ocurrido con la recursión y los sistemas de tipos) redundan en una enorme simplificación del código, tanto en su concepción como en su tamaño, al estar más cercano al intelecto humano, lo que a su vez revierte en mejores condiciones para el mantenimiento, análisis y optimización de las aplicaciones software.
Los programas declarativos pueden verse como versiones directamente ejecutables de las especificaciones algebraicas que se estudian en asignaturas de estructuras de datos, y también como prototipos de aplicaciones informáticas que se abordan en las primeras fases de sus ciclos de vida, aspectos que se abordan en asignaturas de ingeniería del software. Además, gracias a su alto nivel de abstracción y su capacidad para explorar sistemáticamente y de forma natural grandes espacios de búsqueda, estos lenguajes vienen aplicándose satisfactoriamente en el mundo de la inteligencia artificial, sistemas basados en reglas, ingeniería del conocimiento, bases de datos (deductivas), teoría de juegos, sistemas inteligentes, procesamiento de lenguajes, etc… a los que más recientemente se están incorporando nuevos campos como el soft-computing y la web semántica. Todo este abanico de posibilidades conecta la asignatura de programación declarativa con buena parte de las que componen los dos últimos años del grado, al tiempo que amplía la visión de los futuros titulados para ejercer su profesión.
Temario/Contenidos 2010-11
Tema 1. Estilos de programación. Programación declarativa.
Tema 2. Programación lógica.
1. Introducción. Sintaxis y terminología. 2. Cláusulas. Cláusulas de Horn. 3. Programación con cláusulas de Horn. 4. Sustitución y Unificación. 5. Resolución. SLD-Resolución. 6. Lógica y control. SLD-árboles.
Tema 3. El lenguaje Prolog.
1. Elementos sintácticos. 2. Términos como estructuras de datos. 3. Listas. 4. Igualdad y negación. 5. Seguimiento de un programa. 6. El corte y sus usos. 7. Predicados predefinidos. 8. Definición de operadores.
Tema 4. Técnicas avanzadas de programación en Prolog.
1. Parámetros acumuladores. 2. Simulación de variables imperativas. 3. Generar y comprobar. 4. Búsqueda en grafos. 5. Reglas gramaticales (DCG´s).
Tema 5. Programación funcional.
1. Estilo aplicativo. 2. Programación funcional con tipos. Haskell. 3. Declaración de datos y tipos de datos. 4. Declaración de funciones. Reglas de reescritura. Patrones. 5. Definiciones locales. 6. Apéndice: Cadenas (strings). Errores.
Tema 6. Programación funcional avanzada.
1. Funciones de orden superior. 2. Funciones estrictas y no estrictas. Evaluación voraz y evaluación perezosa. 3. Manejo de estructuras infinitas. 4. Formas especiales con listas. Secuencias aritméticas. Comprehesión de listas.
Tema 7. Programación simbólica.
1. S-expresiones. 2. Introducción a LISP. 3. Interpretación de S-expresiones. 4. Manejo de listas. 5. Funciones y variables. 6. Igualdad. Aritmética. Condicionales. Expresiones cualificadas. 7. Orden superior. 8. Aplicaciones.
Bibliografia 2010-11
Título
Autor
Editorial
Año
From Logic Programming to Prolog
Apt, K.
Prentice Hall
1997
Introducción a la Programación Funcional en Haskell. (2ª ed)
Bird, R.; Walder, P.
Prentice-Hall
2000
PROLOG: Programming for Artificial Intelligence
Bratko, I.
Addison Wesley
1990
Programación en Prolog
Clocksin, W.F.; Mellis, C.S.
Gustavo Gili
1987
From Logic to Logic Programming
Doets, K.
The MIT Press, Cambidge
1994
Prolog by example. How to learn, teach and use it
Coelho,H.; Cotta,J.C.
Springer-Verlag
1988
Functional programming
Field, A.J.; Harrison, P.G.
Addison Wesley
1988
Essentials of Logic Programming
Hogger, C.
Oxford University Press
1990
A gentle inttroduction to Haskell (versiones 94 y 98)
Hudak, P.; Peterson, J.; Fasel, J.H
http:// haskell.org
1999
Programación Lógica. Teoría y Práctica
Julián, P.; Alpuente, M.
Pearson-Prentice Hall
2007
Trem Rewriting Systems. En Handbook of Logic in Computer Science, Vol. I
Klop, J.
Oxford Univ. Press
1992
Lógica, programación e inteligencia artificial
Kowalski, R.
Diaz de Santos
1988
Computation as Logic
Lalement, R.
Prentice Hall
1993
Foundations of logic programming
Lloyd, J.W.
Springer-Verlag
1987
Elements of Functional Programming
Reade, C.
Addison Wesley
1993
Symbolic computing with Lisp and Prolog
Robert, A.M.; Rex, L.P.
John Wiley & sons
1988
Razonando con Haskell. Una introducción a la Programación Funcional