Taller de Lenguajes de Programación I (CI-3661)

Cronograma

El cronograma más reciente es como sigue:

Haskell (Cinco o seis sesiones)

  • Introducción a Haskell

    • Ambiente de programación (GHCi)
    • ¿Cómo escribir funciones?
    • Recursión.
    • Tipos escalares básicos, Maybe e Either.
    • Tuplas como valor único compuesto.
    • Clases de Tipos — Num, Show, Eq, Ord, Enum y Read sobre tipos simples.

    • Ejercicios 31 a 34, y 40.

  • Sistema de Tipos Haskell

    • Listas.
    • Recursión explícita sobre listas.
    • map y fold sobre listas.
    • Listas por Comprensión.
  • Programación Genérica

    • Tipos Abstractos de Datos (Arboles y «Registros»).
    • Notación de registros.
    • Clase de Tipos Functor.
    • Tipos Maybe, Either y lista como Functor.
  • Programación Genérica

    • Tipos Abstractos de Datos (Arboles y «Registros»).
    • Clase de Tipos Foldable.
    • Tipo lista como Foldable.
  • Interacción con el mundo exterior.

    • Acciones impuras en el Monad IO.
    • Combinadores monádicos básicos (>>, >>= y return).
    • Notación do.
  • Evaluación perezosa.

    • Laziness para evaluación parcial.
    • Recursión mutua.
    • Streams.

Ruby (Dos o Tres sesiones)

  • Introducción a Ruby

    • Ambiente de programación (irb y shebangs).
    • Clases, objetos, métodos.
    • Reflexión e introspección.
    • Algoritmo de resolución de métodos para despacho dinámico.
  • Orientación a Objetos no-jerárquica

    • Protocolo de Meta-Objetos
    • Capacidad vía despacho doble (o múltiple).
    • Interfaces vs. mixins vs. roles.

Prolog (Tres o Cuatro sesiones)

  • Introducción a Prolog

    • Ambiente de programación.
    • Resolución, unificación y backtracking.
    • Estrategia procedural vs. declarativa.
    • Estrategia «generate-test».
  • Prolog Aplicado.

    • Control del backtracking.
    • Búsqueda generalizada (BFS o DFS genérico).
    • Aplicación a problemas de transición.
    • Manipulación de la base de datos.
  • Prolog de Orden Superior.

    • Manipulación simbólica.
    • Meta-programación.
    • Predicados genéricos meta-programados.
  • Prolog para Lingüística.

    • Definite Clause Grammars.
    • Reconocedores para lenguajes ambigüos.
    • Operadores como conectores.

Herramientas de Programación

Usaremos los lenguajes de programación Haskell, Ruby y Prolog, para desarrollar las soluciones a los proyectos propuestos en clase.

Haskell

Debe trabajarse con GHC 7.6 o 7.8, el entorno interactivo del Glasgow Haskell Compiler.

Para instalarlo:

  • En Debian GNU/Linux 8 (Jessie) y en Ubuntu reciente, pueden instalar todo lo necesario haciendo

    aptitude install haskell-platform
    

    Otras distribuciones Linux podrían tener un paquete razonable — consulte la documentación de la distribución.

  • Para MacOSX o Windows, visiten la página de descargas

  • Bajo ninguna circunstancia usen GHC 8.0, Hugs ni NHC.

Todos los archivos que formen parte de su proyecto deben estar completa y correctamente documentados (los errores ortográficos son inaceptables y serán penalizados) utilizando la herramienta de documentación Haddock, de ese modo no tendrá que entregar un informe impreso (¡salvemos a los árboles!) y la documentación acompañará a sus programas.

En el caso de Haddock, completa y correctamente documentado quiere decir:

  • Descripción del módulo identificando propósito, materia, grupo y entrega.

  • Descripción de todos los nombres exportados por el módulo.

  • Descripción funcional (qué hace) de cada función exportada, incluyendo la descripción semántica (qué representa) cada argumento y el valor resultante de la función.

  • Para funciones complejas, es conveniente que agregue una descripción operativa (cómo lo hace) como un comentario interno en el código fuente.

La documentación de Haddock abunda en detalles acerca de las marcas a utilizar para lograr estos resultados.

La evaluación de sus proyectos tomará en cuenta el uso correcto del estilo funcional, el aprovechamiento de las librerías del lenguaje (no reimplantar cosas que existen), y la eficiencia algorítmica. No basta «que funcione»; tiene que ser eficiente.

Ruby

En el caso de Ruby debe trabajarse con ruby (1.9 o 2.1) y su librería estándar.

Para instalarlo:

  • En Debian GNU/Linux 8 (Jessie) y en Ubuntu reciente, pueden instalar todo lo necesario haciendo

    aptitude install ruby
    

    Otras distribuciones Linux podrían tener un paquete razonable — consulte la documentación de la distribución.

  • Para MacOSX o Windows, visiten la página de descargas

Todos los archivos que formen parte de su proyecto deben estar completa y correctamente construidos siguiendo las mejores prácticas para RDoc

La evaluación de sus proyectos tomará en cuenta el uso correcto del estilo orientado a objetos, en particular las técnicas particulares que se mostrarán en clase, siempre aprovechando las clases estándar del lenguaje (no reimplantar cosas que existen), y con atención a la eficiencia algorítmica. No basta «que funcione»: tiene que estar implantado usando la técnica particular solicitada y además tiene que ser eficiente.

Prolog

En el caso de Prolog debe trabajarse con GNU Prolog (1.3 o 1.4), el entorno interactivo y compilador.

Para instalarlo:

  • En Debian GNU/Linux 8 (Jessie) y en Ubuntu reciente, pueden instalar todo lo necesario haciendo

    aptitude install gprolog gprolog-doc
    

    Otras distribuciones Linux podrían tener un paquete razonable — consulte la documentación de la distribución.

  • Para MacOSX o Windows, visiten la página de descargas

Todos los archivos que formen parte de su proyecto deben estar completa y correctamente documentados siguiendo las [mejores prácticas y reglas de estilo] (https://contraintes.inria.fr/~soliman/prolog_guidelines.html) para el lenguaje.

La evaluación de los proyectos se efectuará utilizando GNU/Prolog. Si Ud. utiliza cualquier otra implantación del lenguaje (SWI-Prolog, por mencionar alguno), asegúrese de no usar ninguna de las extensiones específicas de SWI-Prolog (en particular, está prohibido usar el predicado «implicación» (->/2)).

La evaluación de sus proyectos tomará en cuenta el uso correcto del estilo lógico, el aprovechamiento de los predicados estándar del lenguaje (no reimplantar cosas que existen), y la eficiencia algorítmica. No basta «que funcione»; tiene que ser eficiente.

Equipos y Proyectos

Los equipos son de dos (2) personas. Para la tercera semana debo haber recibido de ustedes un mensaje de correo con la constitución de los equipos; caso contrario los asignaré al azar.

Copiar el proyecto de otro compañero será sancionado con el aplazamiento del proyecto, y el desenlace de la materia dependerá de la opinión del Profesor que coordine la asignatura. Independientemente de eso recibirán una amonestación en la Coordinación de la carrera que puede llevar a la expulsión de la Universidad.

Si encuentran en biblioteca, hemeroteca o Internet un artículo, fragmento o aplicación que resuelva total o parcialmente sus proyectos, es válido utilizarlo siempre y cuando cumpla con dos condiciones simultáneamente:

  • Cite completa y correctamente el origen del trabajo (dónde lo encontró y quién lo escribió originalmente).

  • Prepárese a explicarlo completamente en revisión personal.

Resolver problemas apoyándose en soluciones de otros es perfectamente válido, siempre y cuando se tenga el coraje académico de reconocerlo.

Evaluación

La evaluación consiste en varios proyectos para explorar los tres estilos de programación, y exámenes cortos presenciales. En general, la distribución de la evaluación es:

  • Proyecto Haskell (Semana 06) 35%
  • Quiz Haskell (Semana 07) 15%
  • Proyecto Ruby (Semana 09) 15%
  • Proyecto Prolog (Semana 12) 25%
  • Quiz Prolog (Semana 12) 15%

Consulte la página correspondiente al trimestre en curso para saber las fechas en que serán entregados los proyectos, presentados los exámenes y las calificaciones.

Los exámenes cortos tienen duración de una (1) hora, y siempre serán aplicados a la última hora del bloque de clases.

Bibliografía

Todos los lenguajes empleados incluyen documentación de referencia suficiente, que está disponible tanto en línea, como en su computador como parte del proceso de instalación.

Sin embargo, algunas personas prefieren tutoriales o libros con los cuales reforzar los conocimientos adquiridos en clase.

Haskell

Tutoriales introductorios.

Libros

  • El WikiBook de Haskell es una referencia interesante tanto para comenzar como para avanzar con el lenguaje y sus fundamentos teóricos.

  • «Haskell: The Craft of Functional Programming» (Thompson), publicado por Addison-Wesley, es el libro de texto usualmente recomendado para la materia.

  • «Introduction to Functional Programming» (Bird) es un libro de apoyo útil para este curso, aunque algunos elementos del Haskell moderno difieran.

  • «The Haskell School of Expression» (Hudak) es un libro muy interesante que complementa este curso, con una aproximación muy diferente a la enseñanza de la programación funcional, enfocándose en multimedios (gráficos, juegos, música).

  • «Real World Haskell» no es para este curso, sino para una continuación.

Si Ud. se pregunta «¿Cómo le entro a esto?», le recomiendo leer con atención «Problem Solving in Haskell»

Prolog

Tutoriales

  • El WikiBook de Prolog es una referencia interesante tanto para comenzar como para avanzar con el lenguaje y sus fundamentos teóricos.

  • prolog :- tutorial hace un recorrido por el lenguaje atacando problemas específicos. No es un tutorial «paso a paso» sino orientado a la resolución de problemas.

Libros

  • «Programming in Prolog» (Clocksin & Mellish), publicado por Springer-Verlag es el libro «clásico».

¿Cómo practico?

La única manera de dominar el tópico es practicando desde el primer día. Sin práctica, es muy difícil lograr tareas y exámenes convincentes de un día para otro. Procure intentar los experimentos hechos en clase, y modificar los programas ejemplo en búsqueda de ideas originales.

Para el cronograma actual, se recomienda:

  • Introducción a Haskell
    • Instalar Haskell en su máquina.
    • Escribir las funciones descritas en clase, de nuevo.
    • Ejercicios 31 a 34, y 40 de los 99.
    • Investigue las funciones de Data.Maybe y Data.Either para tratar de que las funciones descritas en clase queden más cortas eliminando el «pattern-matching».

Material de Apoyo de Clases

Siendo este un curso práctico, todas las clases transcurren escribiendo programas y explorando lo que ocurre al aplicarles pequeñas transformaciones. Eso tiene como consecuencia, por un lado, que no haya un juego de láminas para seguir el curso, y por otro lado, que en cada clase suele haber una dosis importante de improvisación y adecuación: es posible que en clase se improvise un programa, modificaciones a programas existentes, o derivaciones surgidas de preguntas o sugerencias espotáneas.

Aquí puede encontrar una colección de los programas que usualmente muestro en clases (ni todos, ni siempre), agrupados según el lenguaje. Es perfectamente posible que en clase no muestre ninguno de estos programas, o muestre otros programas que no van a estar disponibles. Vaya a clase y tome notas.

Ediciones Anteriores