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
