2015-11-24 9 views
5

मान लें मैं दो मनमाना सूचियों कि एक 3-जगह विधेय के पहले दो आइटम का प्रतिनिधित्व करते हैं:Prolog शुरुआती: रिवर्स सूची केवल एक बार

[anna,berta,charlotte],[charles,bob,andy] 

मैं एक तीसरी सूची में हर आइटम (तीसरी आइटम का मिलान करना चाहते 3-प्लेस अनुमानित) निम्नानुसार है:

[[anna,andy],[berta,bob],[charlotte,charles]] 

मूल रूप से आइटम अनुक्रमिक रूप से विपरीत फैशन में मेल खाते हैं। एक अनुक्रमिक तरीके से आइटम से मेल करने के लिए, मैं निम्नलिखित कोड तैयार किया है:

match([],[],[]). 
match([A|At],[C|Ct],[[A,C]|Dt]):-match(At,Ct,Dt). 

लेकिन यह मुझे देना होगा निम्नलिखित:

match([anna,berta,charlotte],[charles,bob,andy],X). 
X=[[anna,charles],[berta,bob],[charlotte,andy]] 

तो मैं किसी भी तरह दूसरी सूची उल्टा करने के लिए की जरूरत है। अब तक, मैंने कोड को निम्नानुसार बदल दिया है:

match([],[],[]). 
match([A|At],[C|Ct],[[A,B]|Dt]):-reverse([C|Ct],[B|Bt]),match(At,Bt,Dt). 

लेकिन यह लगातार प्रत्येक पास के साथ दूसरी सूची को उलट देगा।

match([anna,berta,charlotte],[charles,bob,andy],X). 
X=[[anna,andy],[berta,charles],[charlotte,bob]] 

प्रश्न:: मैं कैसे दूसरी सूची केवल एक बार रिवर्स ऐसा वास्तविक परिणाम वांछित लोगों से मेल खाते हैं, इस प्रकार परिणाम देखने के लिए चाहते हैं? या मेरा दृष्टिकोण मौलिक रूप से त्रुटिपूर्ण है? मैं प्रोलॉग के लिए नया हूं और वर्तमान में इस पर चिंतित हूं। किसी भी सहायता की सराहना की जाएगी।

उत्तर

2

है कि आप की आवश्यकता होती है समस्याओं को सुलझाने के लिए केवल एक बार एक नियम लागू करने के लिए करने के लिए चाल एक सहायक नियम जो पहले और/या पुनरावर्ती नियम लागू होने के बाद अतिरिक्त कदम प्रदर्शन का निर्माण करना है:

match(A, B, R) :- reverse(B, RevB), match_impl(A, RevB, R). 

match_impl([], [], []). 
match_impl([A|At], [C|Ct], [[A,C]|Dt]) :- match_impl(At, Ct, Dt). 

match_impl/3 अपने match/3 नियम है "शीर्ष" match/3 नियम के साथ विरोधाभासी से बचने के लिए नाम बदलकर एक सहायक कदम शामिल है।

3

वही करें जो आप कहते हैं: एक बार सूची को उलट दें, और फिर उल्टा सूची का उपयोग करें।

lists_pairs(Ps1, Ps2, Pairs) :- 
    reverse(Ps2, RPs2), 
    pairs_keys_values(Pairs, Ps1, RPs2). 

आप किसी भी सभ्य Prolog पुस्तकालय में reverse/2 और pairs_keys_values/3 के स्रोत कोड की जाँच को देखने के लिए कि यह कैसे परिभाषित किया गया है सकते हैं।

नमूना क्वेरी और जवाब:

?- lists_pairs([anna,berta,charlotte], [charles,bob,andy], Ps). 
Ps = [anna-andy, berta-bob, charlotte-charles]. 

मैं एक व्यायाम के रूप गैर समझदार "जोड़ी सूची के रूप में" प्रतिनिधित्व करने के लिए इस तरह के जोड़े परिवर्तित छोड़ दें।

+0

रों (एक्स) स्वच्छ डेटा प्रतिनिधित्व। – repeat

2

यह @mat's answer पर एक छोटा सा फॉलोअप है।

कुछ मामलों में समापन में सहायता के लिए तुम इतनी तरह एक निरर्थक same_length_as/3 लक्ष्य जोड़ सकते हैं:

 
lists_pairs(Ps1, Ps2, Pairs) :- 
    same_length_as(Ps1, Ps2, Pairs), 
    reverse(Ps2, RPs2), 
    pairs_keys_values(Pairs, Ps1, RPs2). 

सहायक विधेय same_length_as/3 इस तरह परिभाषित किया जा सकता है: एक प्रयोग करने के लिए

same_length_as([],[],[]). 
same_length_as([_|As],[_|Bs],[_|Cs]) :- 
    same_length_as(As,Bs,Cs). 
+1

'मैपलिस्ट (\ _^_^_^सच, Ps1, Ps2, जोड़े) ' – false

संबंधित मुद्दे