En este cap�tulo vamos a explicar c�mo se puede convertir datos en c�digo y despu�s ejecutarlo. Pero previamente mostraremos algunos predicados standard auxiliares para este prop�sito, aunque tienen tambi�n otros usos.
�Manipulaci�n de t�rminos
El predicado functor/3 es uno de los m�s �tiles entre la biblioteca standard Prolog. Este predicado permite extraer el functor y la aridad de un t�rmino cualquiera. Pero, al ser reversible, tambi�n permite construir nuevos t�rminos a partir del functor y la aridad deseada. Los modos de uso son:
- functor(+Termino,-Functor,-Aridad).
- functor(-Termino,+Functor,+Aridad).
El siguiente ejemplo muestra como se extrae functor y aridad:
?- functor(termino(arg(1),arg(2)),Functor,Aridad). Aridad = 2, Functor = termino ? yes
Ahora veremos como crear un nuevo t�rmino. Sus argumentos siempre ser�n nuevas variables libres:
?- functor(NuevoTermino,prueba,4). NuevoTermino = prueba(_,_,_,_) ? yes ?-
�Manipulaci�n de argumentos con "arg"
Ahora que podemos construir t�rminos, ser�a deseable poder asignarles argumentos. Uno de los predicados que permiten esto es arg/3. Para ello se indica el n�mero de �ndice del argumento deseado, empezando a numerar por el 1 de izquierda a derecha. El modo de uso es:
- arg(+Indice,+Termino,-Argumento).
El primer uso de este predicado es extraer un argumento concreto de un t�rmino:
?- arg(2,termino(a,b,c,d),ARG). ARG = b ? yes ?-
Si el t�rmino tiene variables libres como argumento, se les puede asignar valor mediante arg/3. Pero el resultado es el mismo que una simple unificaci�n mediante =/2. Esto se observa en el siguiente ejemplo:
?- Termino = p(X,b), arg(1,Termino,zzz). Termino = p(zzz,b), X = zzz ? yes ?- Termino = p(X,b), Termino = p(zzz,_). Termino = p(zzz,b), X = zzz ? yes ?-
El predicado arg/3 solamente es �til cuando se conoce a priori el n�mero de argumentos del t�rmino manipulado, pero en combinaci�n con functor/3 resulta muy eficaz.
�Manipulaci�n de argumentos con "univ"
En ocasiones resulta mucho m�s �til convertir los argumentos de un t�rmino en una lista y viceversa. Esta es la funci�n de "univ", nombre que recibe el operador infijo =../2. Sus modos de uso son:
- +Termino =.. -Lista
- -Termino =.. +Lista
La lista contiene siempre el functor del t�rmino en la primera posici�n, y los argumentos en el resto de la lista. El siguiente ejemplo desglosa los elementos de un t�rmino:
?- p(a,b,c(i)) =.. X. X = [p,a,b,c(i)] ? yes ?-
Y el siguiente ejemplo construye un nuevo t�rmino a partir de la lista de sus componentes...
?- Termino =.. [functor,arg1,arg2,arg3]. Termino = functor(arg1,arg2,arg3) ? yes ?-
�Llamadas de orden superior
Lo interesante ahora es convertir un t�rmino en un objetivo Prolog a ejecutar. Esto se consigue con el predicado call/1. Naturalmente, el t�rmino debe corresponder con alg�n predicado existente, de otra forma, se genera una excepci�n. Por ejemplo:
% Un predicado
mipred(X) :-
display(X),
nl.
% Llamada de orden superior
ejemplo :-
X = mipred(5),
call(X).
Naturalmente, este ejemplo carece de utilidad puesto que se puede ejecutar la llamada a mipred/1 directamente. Pero resulta muy util en combinaci�n con los predicados anteriormente descritos. Por ejemplo:
sujeto(12).
sujeto(13).
sujeto(78).
aplicar(Predicado) :-
sujeto(X),
LLamada =.. [Predicado,X],
call(LLamada),
fail.
aplicar(_).
ejemplo :-
aplicar(display).
El resultado es el siguiente:
?- ejemplo. 12 13 78 yes ?-
Los predicados de este tipo, que reciben un argumento y lo convierten a un objetivo ejecutable (sin saber lo que se ejecuta) se denominan metapredicados. Dicho argumento se denomina metaargumento.Un ejemplo de metapredicado es la propia negaci�n por fallo, que se implementa de esta manera:
not(Objetivo) :-
call(Objetivo),
!,
fail.
not(_).
� Copyright 2002
Angel Fern�ndez Pineda.