इसे समझने के लिए अंतर पर विचार एक छोटे से उदाहरण:
listing(p).
p(1,3,5).
p(2,4,1).
p(3,5,2).
p(4,3,1).
p(5,2,4).
निम्नलिखित लक्ष्यों की कोशिश करो। (उत्तर प्रदर्शित करता है स्थान बचाने के लिए संशोधित किया गया है।)
?- 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
विधेय bagof
और setof
उपज लक्ष्य में नि: शुल्क चर के अलग-अलग बाइंडिंग के लिए संग्रह। setof
डुप्लीकेट के बिना संग्रह का एक क्रमबद्ध संस्करण उत्पन्न करता है। बाध्यकारी चर से बचें, अस्तित्वत्मक मात्रात्मक अभिव्यक्ति का उपयोग करें। उदाहरण के लिए लक्ष्य bagof(Z,X^Y^p(X,Y,Z),Bag)
के लिए पूछता है "Z
की वहां मौजूद ऐसी है कि एक X
का थैला और वहाँ एक Y
ऐसी है कि p(X,Y,Z)
मौजूद है"। findall
bagof
जैसे सभी निःशुल्क चर स्वचालित रूप से अस्तित्व में प्रमाणित किए गए कार्य करता है। इसके अलावा findall
एक खाली सूची []
देता है कोई लक्ष्य संतुष्टि नहीं है, जबकि bagof
विफल रहता है।
इस संबंधित है ?: http://stackoverflow.com/questions/1445490/expand-a-query-into-a-list-in-prolog –
धन्यवाद, कि मदद करता है! – Asterisk