2009-09-23 17 views
13

tengo P1 predicado que devuelve valores uno tras otro como esto:¿Cómo encuentro todas las soluciones a un objetivo en Prolog?

-? P1(ARGUMENTS, RETURN). 
-? RETURN = 1; 
-? RETURN = 2; 
-? RETURN = 3; 
-? fail. 

También tengo otro predicado llamado P2:

P2(ARGUMENTS, LIST) :- P1(ARGUMENTS, RETURN),... % SOMEHOW HERE I NEED TO INSERT ALL VALUES OF RETURN TO LIST. 

? ¿Cómo encontrar todos los valores de RETURN y asignarlas a LIST?

+0

se relaciona esto ?: http://stackoverflow.com/questions/1445490/expand-a-query-into-a-list-in-prolog –

+0

gracias, que ayude! – Asterisk

Respuesta

16

Uso findall para lograr esto:

P2(ARGUMENTS, LIST) :- findall(X, P1(ARGUMENTS, X), LIST). 

Esto se relaciona con la bagof function mentioned in the question vinculado a por Anders Lindahl. Hay una buena explicación sobre la relación entre las dos funciones (y una tercera función setof) here:

para ilustrar las diferencias consideran un pequeño ejemplo:

listing(p). 

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

pruebe las siguientes metas. (La respuesta pantallas han sido modificados para ahorrar espacio .)

?- bagof(Z,p(X,Y,Z),Bag). 
Z = _G182 X = 1 Y = 3 Bag = [5] ; 
Z = _G182 X = 2 Y = 4 Bag = [1] ; 
Z = _G182 X = 3 Y = 5 Bag = [2] ; 
Z = _G182 X = 4 Y = 3 Bag = [1] ; 
Z = _G182 X = 5 Y = 2 Bag = [4] ; 
No 

?- findall(Z,p(X,Y,Z),Bag). 
Z = _G182 X = _G180 Y = _G181 Bag = [5, 1, 2, 1, 4] ; 
No 

?- bagof(Z,X^Y^p(X,Y,Z),Bag). 
Z = _G182 X = _G180 Y = _G181 Bag = [5, 1, 2, 1, 4] ; 
No 

?- setof(Z,X^Y^p(X,Y,Z),Bag). 
Z = _G182 X = _G180 Y = _G181 Bag = [1, 2, 4, 5] ; 
No 

Los predicados bagof y setof rendimiento colecciones para fijaciones individuales de las variables libres en el objetivo. setof produce una versión ordenada de la colección sin duplicados. Para evitar variables de enlace, use una expresión de cuantificador existencial . Por ejemplo, el objetivo bagof(Z,X^Y^p(X,Y,Z),Bag) pide "la bolsa de Z 's tal que existe un X y existe una Y tal que p(X,Y,Z)". findall actúa como bagof con todas las variables libres automáticamente existencialmente cuantificadas. Además findall devuelve una lista vacía [] hay hay satisfacción meta, mientras que bagof falla.

Cuestiones relacionadas