La meta-programació és una tècnica avançada en Prolog que permet als programes manipular altres programes com a dades. Això inclou la capacitat de generar, transformar i executar codi de manera dinàmica. En Prolog, aquesta capacitat és especialment poderosa gràcies a la seva naturalesa declarativa i la seva capacitat d'unificació.
Conceptes Clau
- Meta-predicats: Predicats que operen sobre altres predicats.
call/1: Un predicat que permet executar un altre predicat passat com a argument.=..(univ): Un operador que descompon un terme en una llista, on el primer element és el functor i la resta són els arguments.- Generació de codi: Crear nous predicats o modificar els existents durant l'execució del programa.
Meta-predicats
Els meta-predicats són predicats que prenen altres predicats com a arguments. Aquests són útils per a la manipulació dinàmica de codi.
call/1
El predicat call/1 és el més bàsic dels meta-predicats. Permet executar un predicat passat com a argument.
% Exemple bàsic de call/1 es_membre(X, Llista) :- member(X, Llista). % Ús de call/1 ?- call(es_membre, 3, [1, 2, 3, 4]). true.
=.. (univ)
L'operador =.. descompon un terme en una llista on el primer element és el functor i la resta són els arguments. També pot fer el procés invers, construint un terme a partir d'una llista.
% Descomposició d'un terme ?- Term =.. [functor, arg1, arg2]. Term = functor(arg1, arg2). % Construcció d'un terme ?- [functor, arg1, arg2] =.. Term. Term = functor(arg1, arg2).
Generació de Codi
La generació de codi permet crear nous predicats o modificar els existents durant l'execució del programa. Això es pot fer utilitzant predicats com assert/1 i retract/1.
assert/1 i retract/1
Aquests predicats permeten afegir i eliminar fets i regles de la base de coneixement dinàmicament.
% Afegir un nou fet ?- assert(fact(nou_fet)). true. % Consultar el nou fet ?- fact(nou_fet). true. % Eliminar el fet ?- retract(fact(nou_fet)). true. % Comprovar que el fet ha estat eliminat ?- fact(nou_fet). false.
Exemple Pràctic
A continuació, es presenta un exemple pràctic que combina diversos conceptes de meta-programació. Crearem un predicat que genera un predicat per calcular el factorial d'un nombre.
% Generar un predicat per calcular el factorial
generar_factorial :-
assert((factorial(0, 1) :- !)),
assert((factorial(N, F) :-
N > 0,
N1 is N - 1,
factorial(N1, F1),
F is N * F1)).
% Utilitzar el predicat generat
?- generar_factorial.
true.
?- factorial(5, F).
F = 120.Exercicis Pràctics
- Exercici 1: Escriu un predicat
es_membre/2que utilitzicall/1per comprovar si un element és membre d'una llista. - Exercici 2: Utilitza l'operador
=..per descompondre el termepersona(nom, edat)en una llista i després reconstrueix el terme a partir de la llista. - Exercici 3: Escriu un predicat que generi dinàmicament un predicat per calcular la suma dels primers N nombres naturals.
Solucions
- Solució Exercici 1:
- Solució Exercici 2:
% Descomposició ?- Term = persona(nom, edat), Term =.. Llista. Term = persona(nom, edat), Llista = [persona, nom, edat]. % Construcció ?- Llista = [persona, nom, edat], Llista =.. Term. Llista = [persona, nom, edat], Term = persona(nom, edat).
- Solució Exercici 3:
generar_suma :-
assert((suma(0, 0) :- !)),
assert((suma(N, S) :-
N > 0,
N1 is N - 1,
suma(N1, S1),
S is N + S1)).
?- generar_suma.
true.
?- suma(5, S).
S = 15.Conclusió
La meta-programació en Prolog és una eina poderosa que permet als programes manipular altres programes com a dades. Hem vist com utilitzar meta-predicats com call/1 i l'operador =.., així com la generació de codi dinàmicament amb assert/1 i retract/1. Aquests conceptes són fonamentals per a la creació de programes flexibles i dinàmics en Prolog.
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
