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.
- 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.
- 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']}")
- 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.
- 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.
Curs de Programació en Prolog
Mòdul 1: Introducció a Prolog
- Què és Prolog?
- Instal·lant Prolog
- Primers Passos en Prolog
- Sintaxi i Estructura Bàsiques
- Fets, Regles i Consultes
Mòdul 2: Programació Bàsica en Prolog
Mòdul 3: Estructures de Dades en Prolog
Mòdul 4: Programació Avançada en Prolog
- Unificació Avançada
- Tall i Negació
- Meta-Programació
- Gramàtiques de Claus Definides (DCGs)
- Programació Lògica amb Restriccions
Mòdul 5: Prolog en la Pràctica
- Entrada/Sortida de Fitxers
- Depuració de Programes Prolog
- Biblioteques Prolog
- Interfície amb Altres Llenguatges
- Construint una Aplicació Prolog