Curso avanzado de Prolog

En este cap�tulo abordamos algunos predicados standard que resultan muy �tiles y son ampliamente utilizados.

NOTA: Si bien estos predicados son ISO-standard, puede ser necesario importar alguna biblioteca antes de utilizarlos. Consulte la documentaci�n de su entorno de desarrollo.

.�El predicado map/3

Permite aplicar un predicado de "mapeo" a una lista de datos. Dicho predicado debe admitir el siguiente modo de uso:

  • MapPred(+Dato,-DatoMapeado).

Debe tratarse, por tanto, de un predicado que transforma (mapea) un dato en otro.La funci�n de map/3 es la siguiente: para cada dato existente en una lista dada, se pasa como primer argumento a MapPred. El resultado de MapPred, es decir, el segundo argumento, se almacena en una lista resultado. El modo de uso es el siguiente:

  • map(+ListaInicial, +MapPred, -ListaResultado).

A continuaci�n, un ejemplo:

 %Predicado de mapeo: 
 %Dado un numero le suma una unidad
 
 mapeo(Dato, DatoMapeado) :-
    DatoMapeado is Dato + 1.

 %% Ejecucion en el top-level:

 ?- map([6,9,12],mapeo,L).

 L = [7,10,13] ? 

 yes
 ?- 
 

.�La familia de predicados "findall"

Se trata de un conjunto de predicados cuya finalidad es almacenar en una lista todas las soluciones de un predicado dado, entendiendo como tales, las ligaduras que se producen en una o varias variables libres que se indican expl�citamente. Los predicados que componen la familia son:

findall/3 Genera una lista con todas las soluciones del predicado dado seg�n el orden en que se van sucediendo. findall/3 nunca falla, si no hay soluciones genera una lista vac�a. Naturalmente, el propio findall/3 solamente tiene una soluci�n.
bagof/3 Similar a findall/3, genera una lista con todas las soluciones del predicado dado. La diferencia estriba en que :
  • bagof/3 falla cuando no hay soluciones.
  • bagof/3 tiene una soluci�n por cada variable libre que no haya sido indicada como parte de la soluci�n.
setof/3 Similar a bagof/3. La �nica diferencia es que setof/3 elimina las soluciones duplicadas que pudieran existir.

Para explicar los argumentos vamos a tomar findall/3 como ejemplo, pero lo mismo se aplica a toda la familia de predicados. El modo de uso es el siguiente:

  • findall(+Termino_o_variable, +Objetivo, -ListaResultado).

El segundo argumento es el predicado del cual queremos obtener soluciones, para ello, debe contener una o m�s variables libres. Por otra parte, dicho objetivo debe tener un n�mero finito de soluciones. De otra forma, se entrar�a en un bucle infinito al ejecutar alguno de los predicados de la familia.

El primer argumento es un t�rmino cualquiera que contiene las variables libres que nos interesan de la soluci�n. Es posible que no nos interesen todas. Si solamente nos interesa una, lo indicamos directamente. Es obvio que las variables que aparecen en este primer argumento han de ser un subconjunto de las que aparecen en el segundo argumento.

Estos son ejemplos de uso erroneo de findall/3:

  • findall( X, predicado(Y), Resultado).
  • findall( X, predicado(Y,Z), Resultado).
  • findall( solucion(X,Y), predicado(Y,Z), Resultado).

Por el contrario, estos son ejemplos de usos correctos de findall/3:

  • findall( X, predicado(X), Resultado).
  • findall( X, predicado(X,Y), Resultado).
  • findall( solucion(X,Y), predicado(X,Y), Resultado).

Para ilustrar el uso de estos predicados utilizaremos el siguiente predicado:

 p(1,2).
 p(4,3).
 p(6,3).
 p(6,5).
 

Empezamos con findall/3. Construimos una lista con las soluciones del segundo argumento de p/2. Observe como las soluciones del primer argumento de p/2 se ignoran, adem�s, se obtienen todas las soluciones, incluidas las repetidas.

?- findall( Y, p(X,Y), Resultado).

Resultado = [2,3,3,5] ? 

yes
?- 
 

Ahora obtenemos las soluciones considerando como tal ambos argumentos de p/2.

?- findall( sol(X,Y), p(X,Y), Resultado).

Resultado = [sol(1,2),sol(4,3),sol(6,3),sol(6,5)] ? 

yes
?- 
 

El funcionamiento de bagof/3 difiere de findall/3 en que el primero puede tener varias soluciones. bagof/3 tiene una solucion por cada valor de las variables libres que no hayan sido incluidas como parte de la soluci�n. En el siguiente ejemplo, el primer argumento de p/2 no se incluye en la soluci�n, observe como se suceden las soluciones de bagof/3.

?- bagof( Y, p(X,Y), Resultado).

Resultado = [2],
X = 1 ? ;

Resultado = [3],
X = 4 ? ;

Resultado = [3,5],
X = 6 ? ;

no
?- 
 

� 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