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

  1. Meta-predicats: Predicats que operen sobre altres predicats.
  2. call/1: Un predicat que permet executar un altre predicat passat com a argument.
  3. =.. (univ): Un operador que descompon un terme en una llista, on el primer element és el functor i la resta són els arguments.
  4. 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

  1. Exercici 1: Escriu un predicat es_membre/2 que utilitzi call/1 per comprovar si un element és membre d'una llista.
  2. Exercici 2: Utilitza l'operador =.. per descompondre el terme persona(nom, edat) en una llista i després reconstrueix el terme a partir de la llista.
  3. Exercici 3: Escriu un predicat que generi dinàmicament un predicat per calcular la suma dels primers N nombres naturals.

Solucions

  1. Solució Exercici 1:
es_membre(X, Llista) :- call(member, X, Llista).

?- es_membre(3, [1, 2, 3, 4]).
true.
  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).
  1. 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.

© Copyright 2024. Tots els drets reservats