2011-03-03 15 views
8

मैं पहली बार प्रोलॉग की कोशिश कर रहा हूं और सूचियों का उपयोग करके थोड़ा कठिनाई कर रहा हूं।प्रोलॉग - कैसे जांचें कि किसी सूची में कुछ तत्व शामिल हैं या नहीं?

कहें कि मेरे पास तत्वों की एक सूची है। मुझे लगता है कि सूची निम्नलिखित तत्व जाँच करना चाहते हैं:

के सभी: A1, A2, A3, A4, A5

में से एक: बी 1, बी 2, बी 3, बी 4

के दो: सी 1 , सी 2, सी 3, सी 4, सी 5, सी 6

उदाहरण के लिए, [ए 1, ए 2, बी 2, सी 1, ए 3, ए 4, सी 4, ए 5] आवश्यकताओं को पूरा करता है और [ए 2, ए 1, सी 1, बी 1, ए 3, ए 4 ] नहीं करता।

कोई सूची लिखने के बारे में मुझे कैसे मिलेगा जो एक सूची को पूरा करता है यदि कोई सूची आवश्यकताओं को पूरा करती है और अन्यथा गलत नहीं है? इसी तरह, कुछ ऐसी चीज लिखने के बारे में जो आवश्यकताओं को पूरा करने के लिए आवश्यक सूची से गुम मूल्यों को वापस लाता है?

उत्तर

18

आपने बहुत सारे प्रश्न पूछे! मुझे आपको कुछ भविष्यवाणियों के साथ शुरू करने दें जो आपकी अधिकांश आवश्यकताओं को हल करते हैं।

subset([ ],_). 
subset([H|T],List) :- 
    member(H,List), 
    subset(T,List). 

यह सरल प्रत्यावर्तन में प्रत्येक प्रविष्टि सत्यापित करने के लिए परिचित सदस्य/2 विधेय का उपयोग करता है:

पहले की जाँच है कि एक सूची के सभी प्रविष्टियों अन्य सूची में भी हैं के मामले से निपटने जाने सबसेट/2 के पहले तर्क द्वारा निर्दिष्ट सूची दूसरे तर्क द्वारा निर्दिष्ट सूची में भी है। [सादगी के लिए मैंने माना है कि इन सूची की प्रविष्टियां अलग हैं। यदि हम पहली सूची की प्रविष्टि के कई उदाहरणों को सत्यापित करना चाहते हैं तो एक और विस्तृत संस्करण की आवश्यकता होगी, कम से कम दूसरी सूची में कई उदाहरणों से मेल खाते हैं।]

ठीक है, चेक के बारे में कैसे (कम से कम) पहली सूची में से एक दूसरी सूची में भी है? जाहिर है यह उपरोक्त की तुलना में एक अलग predicate है। की बजाय पहली सूची में सभी आइटम, लक्ष्य मौजूद है दूसरी सूची से संबंधित पहली सूची में कोई भी आइटम मौजूद है।

intersects([H|_],List) :- 
    member(H,List), 
    !. 
intersects([_|T],List) :- 
    intersects(T,List). 

यह प्रत्यावर्तन विफल रहता है अगर यह पहला तर्क के लिए एक खाली सूची तक पहुँच जाता है, लेकिन पहली सूची का सदस्य पाया जाता है कि दूसरी सूची के अंतर्गत आता है कि इससे पहले कि किसी भी बिंदु पर यदि सफल होता है। [यह भविष्यवाणी ठीक काम करेगी भले ही किसी आइटम के कई उदाहरण किसी भी सूची में हों। हालांकि हमें तर्क को परिष्कृत करने की आवश्यकता होगी यदि हम की जांच करना चाहते हैं तो पहले सूची की एक ही सूची दूसरी सूची से संबंधित है, और यह चिंता करने में असफल होगा कि क्या एकाधिक उदाहरण एक के सटीक गिनती के अनुरूप हैं या काउंटर हैं।]

क्या होगा यदि हम इस चेक को सामान्य बनाना चाहते हैं, तो सत्यापित करने के लिए (कम से कम) पहली सूची के एन आइटम दूसरे में हैं? जिसके परिणामस्वरूप विधेय एक तिहाई तर्क की आवश्यकता होगी:

intersectsAtLeast(_,_,N) :- N <= 0, !. 
intersectsAtLeast([H|T],L,N) :- 
    member(H,L), 
    !, 
    M is N-1, 
    intersectsAtLeast(T,L,M). 
intersectsAtLeast([_|T],L,N) :- 
    intersectsAtLeast(T,L,N). 

यह प्रत्यावर्तन सूची के माध्यम से काम करता है, एक के बाद हर बार पहली सूची पर किसी आइटम पता चला है साथ ही दूसरी सूची में होने के लिए तीसरा तर्क decrementing, और सफल एक बार गिनती 0 (या कम) तक कम हो जाती है। [सूचियों को फिर से दोहराए जाने पर कोड को फिर से अधिक काम की आवश्यकता है।]

अंत में आप कुछ लिखने के बारे में पूछते हैं जो "गुम मूल्यों को वापस लौटाता है" आवश्यकताओं को पूरा करने की आवश्यकता है। यह दोनों सूचियों पर एक या एक से अधिक वस्तुओं की जांच के मामले में अच्छी तरह से परिभाषित नहीं है, क्योंकि "अनुपलब्ध मान" कई संभावित वस्तुओं में से एक हो सकता है। विशेष मामले में जहां हमने दूसरी सूची के लिए पहली सूची में सभी वस्तुओं के लिए पूछा, "अनुपलब्ध मान" निर्धारित किए जा सकते हैं (यदि कोई हो)।

missingValues([ ],_,[ ]). 
missingValues([H|T],L,K) :- 
    member(H,L), 
    !, 
    missingValues(T,L,K). 
missingValues([H|T],L,[H|K]) :- 
    missingValues(T,L,K). 

यहाँ उत्पादन के लिए प्रत्यावर्तन "चाल" इनपुट पहली सूची से आइटम "लापता आइटम" तीसरी सूची यदि और केवल यदि वे दूसरी सूची में दिखाई नहीं देते।

आपके प्रश्नों के बारे में एक अंतिम नोट नोटेशन चिंताएं। प्रोलॉग वैरिएबल में ऐसे पहचानकर्ता हैं जो पूंजी पत्र या अंडरस्कोर से शुरू होते हैं, इसलिए सूची में आइटम के रूप में ए 1, ए 2 इत्यादि का उपयोग परेशानी के लिए आगे बढ़ रहा है अगर उन्हें "अज्ञात" के रूप में माना जाता है (जैसा कि मैंने आपको लगता है) अलग परमाणु (स्थिरांक)। लोअरकेस अक्षरों पर स्विच करने से यह हल हो जाएगा।

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