Unidad V · Proyecto Disponible

Proyecto: un mismo problema en tres paradigmas

Interprete un problema como relaciones, resuélvalo en Prolog, en Python orientado a objetos y en Haskell, verifique las tres versiones y redacte el estudio comparativo.

Objetivo de aprendizaje

Al concluir el proyecto, el estudiante será capaz de:

  1. Interpretar un problema como relaciones (individuos, hechos, reglas y preguntas) con el método de seis pasos del tema 5.0.
  2. Resolver el mismo problema con tres paradigmas: orientado a objetos (Python), funcional (Haskell) y lógico (Prolog).
  3. Verificar las tres soluciones con pruebas, incluidos los casos límite, y comprobar que dan los mismos resultados.
  4. Explicar quién controla la búsqueda en cada paradigma, dónde vive el estado y cómo se razona sobre la corrección.
  5. Comparar los tres paradigmas con evidencia y argumentar cuándo elegiría cada uno.

El producto que se entrega

Tres programas (Python orientado a objetos, Haskell con sus pruebas y Prolog con sus pruebas), un informe (de cuatro a seis páginas) con el estudio comparativo y la evidencia registrada en esta página: el resultado de los tres verificadores, la tabla comparativa y la autoevaluación. Todo se exporta en un solo archivo desde el espacio de trabajo de la sección 8.


1. Planteamiento inicial

Al comenzar el curso se presentó una pregunta: ¿cómo se elige el paradigma adecuado para un problema? Después de estudiar tres paradigmas, el proyecto sirve para responderla con un ejemplo propio.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.


2. Elija un problema

Elija uno de los tres problemas (su docente puede asignarlos). Los tres tienen datos fijos y pruebas de referencia, de modo que las tres versiones puedan compararse con los mismos resultados. Cada problema tiene también casos límite que obligan a tomar decisiones de diseño que deberá argumentar en el informe.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Nota: las respuestas de referencia de Prolog se comparan como conjuntos: no importa el orden ni las repeticiones. Esto es deliberado. Una consulta como «hermano(luis, H)» puede devolver a la misma persona dos veces (una por cada progenitor en común) y eso no es un error de su programa, pero sí algo que debe explicar en el informe.


3. Interprete el problema (método de seis pasos)

Aplique el método del tema 5.0 al problema elegido antes de escribir cualquier código. Registre sus productos en la libreta.

Paso Producto que debe registrar
1. Individuos y relaciones Lista de individuos, relaciones dadas y relaciones por definir, con la frase que dice cómo se lee cada una
2. Hechos Los datos del enunciado como hechos
3. Reglas Cada relación deducida escrita como «X si Y y Z» en lenguaje natural
4. Preguntas Las consultas de la tabla de referencia, más al menos dos propias (una en sentido inverso y una que deba fallar)

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.


4. La versión lógica en Prolog

Comience por Prolog: es el paradigma nuevo y, si el análisis relacional es correcto, las otras dos versiones son una traducción del mismo conocimiento.

Requisito Qué debe contener la versión lógica
1. Hechos Al menos tres hechos (los datos)
2. Reglas Al menos dos reglas (las relaciones deducidas)
3. Recursión Al menos una relación recursiva con caso base y caso recursivo
4. Terminación Sin recursión por la izquierda (la meta recursiva no es la primera ni repite el primer argumento)
5. Pruebas Al menos tres pruebas, todas se cumplen y al menos una espera false
6. Retroceso Al menos una prueba con varias respuestas
7. Documentación Al menos tres comentarios que expliquen cada relación
8. Higiene Sin variables aisladas (singleton) en las cláusulas

Las pruebas se escriben una por línea: consulta => respuesta. Varias respuestas se separan con ;. Por ejemplo: alcanzable(cancun, tijuana) => false.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Para seguir la búsqueda de una consulta de su programa paso a paso, use la corrida siguiente. Observe el árbol: ¿sale exactamente como lo dibujó en el análisis?

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Importante: el verificador comprueba la estructura y las respuestas, pero no puede juzgar si sus reglas son la mejor descripción del problema ni si su explicación es correcta. Eso lo valoran el informe y su docente.


5. La versión orientada a objetos en Python

Escriba ahora la misma solución como una clase (Unidad III). La clase guarda los datos en su estado interno y ofrece métodos para hacer las mismas preguntas. A diferencia de Prolog, aquí la persona que programa decide el orden en que se exploran los datos y construye a mano las listas de respuestas.

Requisito Qué debe contener la versión orientada a objetos
1. Clase Una clase con constructor y al menos dos métodos más
2. Estado Un atributo interno (con guion bajo) que guarde los datos del problema
3. Recorrido Un método que recorra los datos con un ciclo o con recursión
4. Documentación Al menos tres comentarios que expliquen la responsabilidad de la clase y de cada método
5. Pruebas Se ejecuta sin errores y muestra al menos cuatro salidas (casos de prueba, incluidos los límite)

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.


6. La versión funcional en Haskell

Escriba, por último, la solución como un conjunto de funciones sobre una lista de datos (Unidad IV). Debe cumplir: firma de tipo en cada definición; al menos tres funciones; al menos una función por casos con patrones; al menos una función recursiva con caso base; el uso de funciones de orden superior; y al menos tres pruebas que se cumplan.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.


7. Comparación de resultados y estudio comparativo

Las tres versiones deben coincidir

Compruebe que las tres versiones dan los mismos resultados para las consultas de la tabla de referencia. Si una difiere, esa diferencia es un hallazgo: puede indicar un error o una diferencia genuina entre paradigmas (por ejemplo, respuestas repetidas en Prolog). Registre cada discrepancia y su explicación.

Qué ocurre si los datos tienen un ciclo

Agregue un vuelo (o una relación) que cierre un ciclo en sus datos y repita las pruebas. En las tres versiones, una recursión sin lista de visitados puede no terminar. Compruebe cómo se manifiesta en cada una: un RecursionError en Python, un límite de pasos en la corrida de Haskell y una búsqueda interrumpida en Prolog. Explique cómo lo resolvería (por ejemplo, con una lista de elementos ya visitados).

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Diagnóstico comparado

Complete la tabla con lo que cree que ocurre en cada versión y compare con la referencia.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Importante: las respuestas son una referencia didáctica basada en el problema de las rutas. En otros problemas, algunos aspectos pueden variar; justifíquelo en el informe si es el caso.

El repositorio de programas

El programa de la unidad de aprendizaje pide como evidencia un repositorio de programas con la descripción del problema que solucionan y el algoritmo implementado. Cada uno de sus tres programas debe acompañarse de una ficha como esta (puede copiarla a su informe):

Campo Contenido
Programa Nombre del archivo y lenguaje
Problema Descripción en dos o tres oraciones, con sus datos
Paradigma Orientado a objetos, funcional o lógico
Algoritmo Cómo resuelve el problema, en palabras (por ejemplo, «recorre los vuelos con recursión y acumula las rutas» o «define alcanzable con un caso base y un caso recursivo; el motor busca por retroceso»)
Entradas y salidas Qué datos recibe y qué resultados produce
Pruebas Los casos de prueba y su resultado, incluidos los límite
Ventajas y desventajas Qué resultó fácil y qué resultó difícil en este paradigma para este problema

Planeación y redacción del informe

El informe no es un resumen de lo que se hizo, sino un argumento: explica qué se decidió, por qué y cómo se comprobó. Algunas pautas:

  • Use el método. Organice el análisis según los seis pasos y haga visible la trazabilidad de cada pregunta del problema a una regla, una función y un método.
  • Lea las reglas en voz alta. Muestre la lectura declarativa de cada regla de Prolog y compare con la lectura procedimental.
  • Justifique los casos límite. Cada decisión debe estar explícita, probada y explicada.
  • Compare con evidencia. Cite inferencias, pasos de reducción o diferencias observadas en las corridas.
  • Nombre los compromisos. Cada paradigma favorece algo y cuesta algo.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Importante: lo que registra en esta página solo vive en su navegador. Si cambia de equipo o borra los datos de navegación, lo perderá. Exporte el archivo con frecuencia y conserve una copia.

Autoevaluación

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Contraste con el planteamiento inicial

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.


8. Libreta y lista de verificación para la entrega

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Antes de entregar, compruebe que:

  • Eligió un problema y escribió su interpretación relacional (individuos, relaciones, hechos, reglas y preguntas) y la decisión sobre cada caso límite.
  • Su versión en Prolog cumple los ocho requisitos del verificador y sus pruebas se cumplen.
  • Su versión orientada a objetos cumple los cinco requisitos del verificador y está comentada.
  • Su versión en Haskell cumple los requisitos y sus pruebas se cumplen.
  • Comprobó que las tres versiones dan los mismos resultados y registró cada discrepancia con su explicación.
  • Probó qué ocurre con datos que tienen un ciclo y explicó cómo lo resolvería.
  • Completó la tabla comparativa y revisó las explicaciones de las diferencias.
  • Escribió la ficha de cada uno de sus tres programas (repositorio).
  • Las siete secciones del informe tienen contenido y evidencias.
  • Hizo la autoevaluación y atendió los criterios más bajos.
  • Exportó el informe y conservó una copia del archivo y de sus programas.
  • Puede explicar con sus propias palabras cada decisión de su trabajo.

9. Preguntas de reflexión

  1. ¿Qué parte de la solución tuvo que pensar de nuevo al pasar de la clase de Python a las reglas de Prolog, y cuál se tradujo casi directamente?
  2. ¿Qué ganó al poder hacer una consulta «al revés» en Prolog? ¿Hay una pregunta de su problema que sea imposible o muy difícil de hacer en las otras dos versiones?
  3. ¿Qué le pareció más riesgoso en cada versión (estado compartido, evaluación perezosa, recursión por la izquierda)? ¿Cómo lo detectó?
  4. Si el problema tuviera un millón de datos, ¿qué cambiaría en cada versión? Considere el tiempo, la memoria y el control sobre el orden de la búsqueda.
  5. Su empresa le pide un sistema de reglas de negocio que cambie cada mes. ¿Qué paradigma elegiría y por qué? Justifique con los compromisos que identificó.

10. Lecturas recomendadas

  • Gabbrielli, M., & Martini, S. (2010). Programming languages: principles and paradigms. Springer. (Referencia del programa de la unidad de aprendizaje.)
  • Sterling, L., & Shapiro, E. (1994). The art of Prolog (2nd ed.). MIT Press. (Disponible en la bóveda: 08-Referencias.)
  • Van Roy, P., & Haridi, S. (2004). Concepts, techniques, and models of computer programming. MIT Press. (Una comparación de paradigmas como modelos de computación.)
  • Kowalski, R. (1979). Algorithm = logic + control. Communications of the ACM, 22(7), 424–436.
  • Sebesta, R. (2015). Concepts of programming languages (11th ed.), capítulos sobre los paradigmas orientado a objetos, funcional y lógico. Pearson.