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/2
que utilitzicall/1
per 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