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.
se relaciona esto ?: http://stackoverflow.com/questions/1445490/expand-a-query-into-a-list-in-prolog –
gracias, que ayude! – Asterisk