2009-09-23 4 views
13

मैं विधेय P1 कि महत्व देता है इस तरह एक के बाद एक रिटर्न है:प्रोलॉग में किसी लक्ष्य के लिए मैं सभी समाधान कैसे ढूंढूं?

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

मैं भी एक और विधेय कहा जाता P2 है:

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

RETURN के मूल्यों के सभी कैसे पता लगाने और उन्हें नियत कर सकता LIST पर?

+0

इस संबंधित है ?: http://stackoverflow.com/questions/1445490/expand-a-query-into-a-list-in-prolog –

+0

धन्यवाद, कि मदद करता है! – Asterisk

उत्तर

16

उपयोग findall यह पूरा करने के:

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

यह bagof function mentioned in the question ऐन्डर्स Lindahl से जुड़े से संबंधित है। वहाँ दो कार्य (और एक तीसरे समारोह setof) के बीच के रिश्ते पर एक अच्छा विवरण है here:

इसे समझने के लिए अंतर पर विचार एक छोटे से उदाहरण:

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) मौजूद है"। findallbagof जैसे सभी निःशुल्क चर स्वचालित रूप से अस्तित्व में प्रमाणित किए गए कार्य करता है। इसके अलावा findall एक खाली सूची [] देता है कोई लक्ष्य संतुष्टि नहीं है, जबकि bagof विफल रहता है।