jueves, 16 de octubre de 2025

Html y Prolog

 Aquí tienes un ejemplo realista y práctico: un pequeño servidor web de recomendaciones de películas que utiliza una base de conocimientos en Prolog.

Imagina que tienes una base de datos de películas y quieres que los usuarios puedan encontrar una película introduciendo un género y una calificación mínima. Prolog es perfecto para este tipo de consultas lógicas. library(http) nos permite poner esto en la web.


El Escenario Realista

Crearemos un servidor web local que:

  1. Define un conocimiento base sobre películas (título, género, calificación).

  2. Inicia un servidor web en un puerto específico (ej. 8000).

  3. Escucha peticiones en una ruta, por ejemplo /recomendacion.

  4. Recibe parámetros de la URL, como genero y calificacion_minima.

  5. Consulta la base de conocimientos de Prolog para encontrar películas que coincidan.

  6. Devuelve una página HTML dinámica con los resultados al usuario.


El Código Completo

Copia y pega este código en un archivo llamado servidor_peliculas.pl.

Prolog
% Cargar las bibliotecas necesarias para el servidor HTTP y el manejo de HTML
:- use_module(library(http/thread_httpd)).
:- use_module(library(http/http_dispatch)).
:- use_module(library(http/http_parameters)).
:- use_module(library(http/html_write)).

% --- 1. Base de Conocimientos ---
% Hechos: pelicula(Título, Género, Calificación)
pelicula('The Matrix', scifi, 8.7).
pelicula('Inception', scifi, 8.8).
pelicula('The Godfather', crimen, 9.2).
pelicula('Pulp Fiction', crimen, 8.9).
pelicula('Forrest Gump', drama, 8.8).
pelicula('The Dark Knight', accion, 9.0).
pelicula('Interstellar', scifi, 8.6).
pelicula('Parasite', drama, 8.5).

% --- 2. Lógica de Búsqueda ---
% Regla: encontrar_peliculas(Genero, CalificacionMin, Peliculas)
% Encuentra todas las películas que cumplen con el género y la calificación mínima.
encontrar_peliculas(Genero, CalificacionMin, Peliculas) :-
    findall(
        pelicula(Titulo, Genero, Calificacion),
        (pelicula(Titulo, Genero, Calificacion), Calificacion >= CalificacionMin),
        Peliculas
    ).

% --- 3. Manejador de la Petición HTTP ---
% Este predicado se ejecuta cuando alguien visita /recomendacion
manejador_recomendacion(Request) :-
    % Obtener los parámetros de la URL (ej. ?genero=scifi&calificacion=8.7)
    http_parameters(Request,
                    [ genero(Genero, [default('scifi')]),
                      calificacion(CalificacionStr, [default('8.0')])
                    ]),
    % Convertir la calificación de texto a número
    atom_number(CalificacionStr, CalificacionMin),

    % Ejecutar la lógica de búsqueda
    encontrar_peliculas(Genero, CalificacionMin, Resultados),

    % Generar y enviar la respuesta HTML
    reply_html_page(
        title('Recomendador de Películas'),
        [ h1('Recomendador de Películas en Prolog'),
          h2('Resultados de tu búsqueda:'),
          p(['Buscando películas de género: ', b(Genero), ' con calificación mínima de: ', b(CalificacionMin)]),
          \generar_tabla_resultados(Resultados) % Llama a un predicado para crear la tabla
        ]).

% Predicado auxiliar para generar la tabla HTML con los resultados
generar_tabla_resultados([]) --> !, % Si no hay resultados
    html(p(b('No se encontraron películas con esos criterios.'))).
generar_tabla_resultados(Peliculas) --> % Si hay resultados
    html(table([border(1)],
               [ tr([th('Título'), th('Género'), th('Calificación')])
               | \filas_peliculas(Peliculas) % Generar las filas de la tabla
               ])).

% Genera una fila <tr> por cada película en la lista
filas_peliculas([]) --> [].
filas_peliculas([pelicula(Titulo, Genero, Calificacion)|Resto]) -->
    html(tr([td(Titulo), td(Genero), td(Calificacion)])),
    filas_peliculas(Resto).

% --- 4. Configuración y Arranque del Servidor ---
% Definir las rutas (handlers)
:- http_handler('/recomendacion', manejador_recomendacion, []).

% Predicado para iniciar el servidor
servidor(Puerto) :-
    http_server(http_dispatch, [port(Puerto)]).

% Para iniciar, ejecuta: ?- servidor(8000).

¿Cómo Funciona?

Paso 1: Ejecutar el Servidor

  1. Abre SWI-Prolog.

  2. Carga el archivo: ?- [servidor_peliculas].

  3. Inicia el servidor en el puerto 8000: ?- servidor(8000).

Verás un mensaje en la consola indicando que el servidor está corriendo, algo como: % HTTP server running on port 8000

Paso 2: Usar la Aplicación

Abre tu navegador web y ve a la siguiente URL:

http://localhost:8000/recomendacion?genero=scifi&calificacion=8.7

El servidor Prolog recibirá esta petición, ejecutará la lógica y te devolverá una página HTML con este resultado:

Recomendador de Películas en Prolog

Resultados de tu búsqueda:

Buscando películas de género: scifi con calificación mínima de: 8.7

TítuloGéneroCalificación
The Matrixscifi8.7
Inceptionscifi8.8

Si cambias la URL, por ejemplo a ?genero=crimen&calificacion=9.0, obtendrás resultados diferentes, demostrando que la página es totalmente dinámica y controlada por la lógica de Prolog.


Explicación del Código

  • library(http/...): Son las librerías que nos dan todas las herramientas para crear el servidor, manejar las peticiones (Request) y generar respuestas en HTML.

  • pelicula(...): Son nuestros "hechos" en la base de conocimientos. La base de todo.

  • encontrar_peliculas(...): Esta es la lógica principal. Utiliza findall/3 para recopilar en una lista todas las soluciones que cumplen con las condiciones, actuando como un motor de búsqueda.

  • manejador_recomendacion(Request): Es el "controlador". Se activa cuando se visita /recomendacion.

    • http_parameters/2: Extrae los valores de la URL de forma segura (con valores por defecto si no se proporcionan).

    • reply_html_page/2: Es una forma muy cómoda de construir una página HTML. El segundo argumento es una lista de elementos HTML que se renderizan automáticamente.

  • servidor(Puerto): Es el predicado que inicia todo el proceso, creando un servidor que escucha peticiones y las redirige al manejador correcto (http_dispatch).

Este ejemplo muestra perfectamente la separación de responsabilidades: la base de conocimientos (hechos), el motor de inferencia (reglas) y la capa de presentación (el servidor web) trabajan juntos, cada uno haciendo lo que mejor sabe hacer.

Xpce, de Prolog

XPCE es una biblioteca de herramientas (toolkit) para crear Interfaces Gráficas de Usuario (GUI) directamente desde SWI-Prolog. Es un sistema de programación orientado a objetos que está profundamente integrado con el motor lógico de Prolog.

Esto significa que con XPCE puedes construir aplicaciones de escritorio completas, con ventanas, botones, menús, lienzos para dibujar y otros elementos interactivos, todo controlado por la lógica de tu programa en Prolog.

¿Qué se puede hacer con XPCE?

Aquí tienes un desglose de sus capacidades y usos principales, desde lo más simple a lo más complejo:

1. Crear Interfaces Gráficas para tus Programas

En lugar de interactuar con tu programa Prolog solo a través de la consola o terminal, puedes crear una ventana amigable para el usuario. Esto incluye:

  • Ventanas y Diálogos: Crear ventanas principales, cuadros de diálogo para pedir datos (prompt), mostrar mensajes (alert) o confirmaciones.

  • Controles y Widgets: Añadir elementos interactivos como:

    • Botones (button) que ejecutan predicados de Prolog al ser pulsados.

    • Campos de texto (text_item) para que el usuario ingrese datos.

    • Menús (menu_bar, popup_menu) para organizar acciones.

    • Listas (list_browser) para mostrar conjuntos de datos.

    • Sliders, checkboxes, radio buttons, etc.

Ejemplo de uso: Un sistema experto sobre diagnóstico de enfermedades donde el usuario hace clic en síntomas en lugar de escribirlos.

2. Visualización de Datos y Conocimiento

Prolog es excelente para representar estructuras de datos complejas como árboles, grafos y redes. XPCE es ideal para visualizar estas estructuras.

  • Dibujo 2D: Puedes crear un lienzo (picture) y dibujar figuras geométricas (líneas, rectángulos, círculos, polígonos).

  • Grafos y Árboles: Puedes programar la visualización de un árbol de búsqueda, un grafo de dependencias o un árbol genealógico, donde cada nodo puede ser un objeto interactivo.

Ejemplo de uso: El propio depurador gráfico de SWI-Prolog (gtrace.) está hecho con XPCE. Te muestra el árbol de llamadas y el flujo de ejecución de tu programa de forma visual, lo cual es increíblemente útil.

3. Desarrollo de Herramientas y Entornos Interactivos

Debido a su profunda integración, XPCE es perfecto para crear herramientas de desarrollo o software educativo.

  • Editores de código: El editor de código integrado en SWI-Prolog, PceEmacs, está construido enteramente con XPCE.

  • Software educativo: Crear programas para enseñar lógica, matemáticas o cualquier materia donde la interacción y la visualización sean clave. Por ejemplo, un programa para resolver y visualizar puzzles lógicos como el Sudoku o las Torres de Hanoi.

  • Prototipado rápido: Si tienes una idea para una aplicación basada en lógica, puedes usar XPCE para crear rápidamente un prototipo funcional con una interfaz gráfica sin tener que salir del entorno de Prolog.

4. Programación Orientada a Objetos en Prolog

Aunque Prolog es un lenguaje de programación lógica, XPCE introduce un modelo de objetos completo.

  • Clases y Objetos: Puedes definir clases con atributos (variables de instancia) y métodos.

  • Manejo de eventos: El modelo es inherentemente orientado a eventos. Puedes hacer que los objetos reaccionen a acciones del usuario (clics, movimiento del ratón, teclas presionadas).

  • Delegación: Utiliza un mecanismo de envío de mensajes similar a Smalltalk u Objective-C.

Ventajas y Desventajas

  • Ventajas:

    • Integración perfecta: La comunicación entre tu lógica Prolog y la interfaz es directa y natural. No necesitas APIs externas ni complicados puentes entre lenguajes.

    • Viene incluido: No necesitas instalar nada extra, ya es parte de SWI-Prolog.

    • Multiplataforma: Funciona en Windows, macOS y Linux.

    • Potente para herramientas: Es ideal para visualizar estructuras de datos complejas que son el punto fuerte de Prolog.

  • Desventajas:

    • Estética anticuada: La apariencia de los componentes de XPCE no es moderna. Se ve como una aplicación de los años 90 o 2000. No es la mejor opción si buscas una interfaz pulida y moderna.

    • Curva de aprendizaje: Requiere aprender su modelo de programación orientado a objetos, que es un poco diferente al de lenguajes como Java o Python.

    • Alternativas modernas: Hoy en día, es muy común que la lógica de Prolog se ejecute en un servidor y la interfaz de usuario sea una aplicación web (HTML/CSS/JavaScript) que se comunica con el servidor a través de una API. SWI-Prolog tiene excelentes bibliotecas para crear servidores web (library(http)).

Conclusión

XPCE es una herramienta extremadamente poderosa si quieres construir aplicaciones de escritorio, herramientas de visualización o software educativo donde la lógica de Prolog es el núcleo central. Es la forma más rápida y directa de darle una cara gráfica a tu programa Prolog.

Si, por otro lado, tu objetivo es crear una aplicación con una interfaz de usuario moderna y atractiva, probablemente sea mejor opción usar SWI-Prolog como un motor de backend y construir la interfaz con tecnologías web.