En aquest tema, aprendrem a construir una aplicació completa en Prolog. Aquest procés inclou la definició de fets i regles, la creació d'una interfície d'usuari bàsica, la gestió de fitxers per a l'entrada i sortida de dades, i la depuració del programa. A més, veurem com integrar Prolog amb altres llenguatges de programació per crear aplicacions més robustes i versàtils.

  1. Definició del Problema

Abans de començar a programar, és essencial definir clarament el problema que volem resoldre. Per a aquest exemple, construirem una aplicació de gestió de biblioteques que permetrà als usuaris afegir, eliminar i cercar llibres.

Requisits de l'Aplicació

  • Afegir nous llibres a la biblioteca.
  • Eliminar llibres existents.
  • Cercar llibres per títol o autor.
  • Guardar i carregar la informació dels llibres des d'un fitxer.

  1. Estructura del Programa

Fets i Regles

Comencem definint els fets i regles que representaran els llibres i les operacions que podem realitzar sobre ells.

% Fets
% llibre(Títol, Autor, Any).
llibre('El Quixot', 'Miguel de Cervantes', 1605).
llibre('Cien años de soledad', 'Gabriel Garcia Marquez', 1967).

% Regles
afegir_llibre(Títol, Autor, Any) :-
    assertz(llibre(Títol, Autor, Any)).

eliminar_llibre(Títol) :-
    retract(llibre(Títol, _, _)).

cercar_llibre_per_titol(Títol) :-
    llibre(Títol, Autor, Any),
    format('Títol: ~w, Autor: ~w, Any: ~w~n', [Títol, Autor, Any]).

cercar_llibre_per_autor(Autor) :-
    llibre(Títol, Autor, Any),
    format('Títol: ~w, Autor: ~w, Any: ~w~n', [Títol, Autor, Any]).

Interfície d'Usuari Bàsica

Crearem una interfície d'usuari bàsica que permeti als usuaris interactuar amb l'aplicació a través de la línia de comandes.

menu :-
    writeln('1. Afegir llibre'),
    writeln('2. Eliminar llibre'),
    writeln('3. Cercar llibre per títol'),
    writeln('4. Cercar llibre per autor'),
    writeln('5. Sortir'),
    read(Opció),
    executar_opció(Opció).

executar_opció(1) :-
    writeln('Introdueix el títol:'),
    read(Títol),
    writeln('Introdueix l\'autor:'),
    read(Autor),
    writeln('Introdueix l\'any:'),
    read(Any),
    afegir_llibre(Títol, Autor, Any),
    writeln('Llibre afegit!'),
    menu.

executar_opció(2) :-
    writeln('Introdueix el títol del llibre a eliminar:'),
    read(Títol),
    eliminar_llibre(Títol),
    writeln('Llibre eliminat!'),
    menu.

executar_opció(3) :-
    writeln('Introdueix el títol del llibre a cercar:'),
    read(Títol),
    cercar_llibre_per_titol(Títol),
    menu.

executar_opció(4) :-
    writeln('Introdueix l\'autor del llibre a cercar:'),
    read(Autor),
    cercar_llibre_per_autor(Autor),
    menu.

executar_opció(5) :-
    writeln('Sortint...').

executar_opció(_) :-
    writeln('Opció no vàlida, torna a intentar-ho.'),
    menu.

Gestió de Fitxers

Per guardar i carregar la informació dels llibres, utilitzarem operacions d'entrada/sortida de fitxers.

guardar_biblioteca(NomFitxer) :-
    open(NomFitxer, write, Stream),
    forall(llibre(Títol, Autor, Any),
           format(Stream, 'llibre(~q, ~q, ~q).~n', [Títol, Autor, Any])),
    close(Stream).

carregar_biblioteca(NomFitxer) :-
    open(NomFitxer, read, Stream),
    repeat,
    read(Stream, Term),
    ( Term == end_of_file -> true ; assertz(Term), fail ),
    close(Stream).

Integració amb Altres Llenguatges

Per integrar Prolog amb altres llenguatges, podem utilitzar biblioteques com JPL (Java-Prolog Library) per a Java o PySwip per a Python. Aquí teniu un exemple bàsic d'integració amb Python utilitzant PySwip.

Exemple en Python

from pyswip import Prolog

prolog = Prolog()
prolog.consult("biblioteca.pl")

# Afegir un llibre
prolog.assertz("llibre('1984', 'George Orwell', 1949)")

# Cercar llibres per autor
for result in prolog.query("llibre(Títol, 'George Orwell', Any)"):
    print(f"Títol: {result['Títol']}, Any: {result['Any']}")

  1. Depuració del Programa

La depuració és una part crucial del desenvolupament de qualsevol aplicació. Prolog ofereix eines com el traçador (trace/0) per ajudar a identificar i corregir errors.

Exemple d'ús del traçador

% Activar el traçador
trace.

% Executar una consulta per veure el traç
cercar_llibre_per_titol('1984').

% Desactivar el traçador
notrace.

  1. Conclusió

En aquest tema, hem après a construir una aplicació completa en Prolog, des de la definició dels fets i regles fins a la creació d'una interfície d'usuari bàsica, la gestió de fitxers i la integració amb altres llenguatges de programació. També hem vist com utilitzar les eines de depuració de Prolog per identificar i corregir errors. Amb aquests coneixements, esteu preparats per desenvolupar aplicacions més complexes i robustes en Prolog.

Exercici Pràctic

Exercici: Amplieu l'aplicació de gestió de biblioteques per permetre la cerca de llibres per any de publicació i la modificació de la informació d'un llibre existent.

Solució:

% Afegir una nova regla per cercar llibres per any
cercar_llibre_per_any(Any) :-
    llibre(Títol, Autor, Any),
    format('Títol: ~w, Autor: ~w, Any: ~w~n', [Títol, Autor, Any]).

% Afegir una nova regla per modificar la informació d'un llibre
modificar_llibre(TítolAntic, TítolNou, AutorNou, AnyNou) :-
    retract(llibre(TítolAntic, _, _)),
    assertz(llibre(TítolNou, AutorNou, AnyNou)).

% Actualitzar la interfície d'usuari per incloure les noves opcions
menu :-
    writeln('1. Afegir llibre'),
    writeln('2. Eliminar llibre'),
    writeln('3. Cercar llibre per títol'),
    writeln('4. Cercar llibre per autor'),
    writeln('5. Cercar llibre per any'),
    writeln('6. Modificar llibre'),
    writeln('7. Sortir'),
    read(Opció),
    executar_opció(Opció).

executar_opció(5) :-
    writeln('Introdueix l\'any del llibre a cercar:'),
    read(Any),
    cercar_llibre_per_any(Any),
    menu.

executar_opció(6) :-
    writeln('Introdueix el títol del llibre a modificar:'),
    read(TítolAntic),
    writeln('Introdueix el nou títol:'),
    read(TítolNou),
    writeln('Introdueix el nou autor:'),
    read(AutorNou),
    writeln('Introdueix el nou any:'),
    read(AnyNou),
    modificar_llibre(TítolAntic, TítolNou, AutorNou, AnyNou),
    writeln('Llibre modificat!'),
    menu.

Amb aquesta ampliació, l'aplicació de gestió de biblioteques és encara més completa i funcional.

© Copyright 2024. Tots els drets reservats