Curso avanzado de Prolog

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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO