Categorías destacadas
programacion php    
Artículo
13
¡votar!

 Curso avanzado de Prolog


Predicados standard de orden superior

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.

Publicado por:
manuel delgado
Recomendar
a un amigo
Compartir
en redes
 
Comentarios
Walther Degreiff dice:

SUPER!

22/05/2010, a las 17:04:14
 
BBDD
Entornos de desarrollo
Entretenimiento
Herramientas
Internet
Lenguajes de script
Lenguajes imperativos
Lenguajes orientados a objeto
Otros lenguajes
Plataformas
Teoría
Varios
Copyright © 1998-2011 Programación en Castellano. Todos los derechos reservados
Datos legales | Politica de privacidad | Contacte con nosotros | Publicidad

Diseño web y desarrollo web. Un proyecto de los hermanos Carrero.

Red internet:
Juegos gratis | Servidores dedicados
Más internet: Password | Directorio de weblogs | Favicon