2011-12-18 13 views
6

की सूची के बीच क्या अंतर है, यदि मेरे पास दो सूचियां, एल 1 और एल 2 है, तो मैं निम्नलिखित को पूरा करने की कोशिश कर रहा था, मैं चाहता था कि परिणाम (आर) होना एल 1 से एल 2 का "घटाव"।किसी भी सूची ([_]) और कुछ भी (_)

उदाहरण:

L1 = [1,2,3] 
L2 = [2,3,4,5] 

R = [1] 

मैं यह पूरा करने में सक्षम था, लेकिन मैं नहीं बता सकता कि _ और [_] के बीच अंतर है।

अगर मैं ऐसा करते हैं:

diferencia([],_,[]). 
diferencia([X|Tail],L2,R):- 
    member(X,L2), 
    diferencia(Tail,L2,R). 
diferencia([X|Tail],L2,[X|R]):- 
    not(member(X,L2)), 
    diferencia(Tail,L2,R). 

यह काम करता है, अगर मैं ऐसा करते हैं, यह मुझे देता है झूठी:

diferencia([],[_],[]). 
diferencia([X|Tail],L2,R):- 
    member(X,L2), 
    diferencia(Tail,L2,R). 
diferencia([X|Tail],L2,[X|R]):- 
    not(member(X,L2)), 
    diferencia(Tail,L2,R). 

मैं कुछ भी [_] युक्त के बाद से एल 2 हमेशा होगा काम करना चाहिए एक सूची ग्रहण करेंगे एक सूची बनें

उत्तर

8

दरअसल, _ केवल एक चर और एक चर से मेल खाता है। यहां, आप इसे 2, 3, 4, 5 (चार चर) से मेल खाना चाहते हैं। यह नहीं कर सकता यह केवल [2, 3, 4, 5] (सूची) से मेल खा सकता है। आप [_|_] लिखने के लिए होगा ताकि सिर और पूंछ मिलान किया जाता है ([2|[3, 4, 5]])

_ की संख्या अपनी सूची में आइटम की सही संख्या में किया जा रहा है, ताकि हर एक तत्व ठीक से एक अनाम के साथ मिलान किया जाता है के साथ

या [_, _, _, _, _, _, ...] चर।

याद रखने की मूल बात यह है कि _ केवल एक सामान्य चर है। यदि आपको इसे याद रखने में परेशानी है, तो _Head या _Accumulator जैसे स्पष्ट नाम, ताकि आप यह समझ सकें कि जब आप अपना कोड लिखते हैं तो वास्तव में एक चर है, केवल आपको इसकी परवाह नहीं है (_ से शुरू होने वाला चर कम से कम swi-pl में सिंगलटन वैरिएबल चेतावनी उत्पन्न नहीं करते हैं, इसलिए वे बेहतर समग्र स्पष्टता के लिए _ के बजाय उपयोग करने योग्य हैं)।

संपादित करें: यह कहने का एक और तरीका यह है कि आपके शीर्षक में, आपको लगता है कि _ कुछ भी है। लेकिन कुछ भी कुछ नहीं हो सकता है, और कुछ भी चीजें हो सकती हैं। _ केवल एक चीज हो सकती है। यही कारण है कि यह काम नहीं करता है:]

+0

चर बुलाया 'से मेल नहीं खाएगी _' वास्तव में एक सामान्य चर नहीं है। यदि आपके पास '_' नामक दो चर हैं, तो वे एकजुट नहीं होंगे, वे दो अलग-अलग चर हैं। – svick

+0

सामान्य चर का उपयोग यहां यह इंगित करने के लिए किया गया था कि अनाम चर वे चीजें नहीं कर सकते हैं नियमित रूप से परिवर्तनीय मिलान पैटर्न की बात करते समय नहीं कर सकते हैं। तथ्य यह है कि दो अनाम चर आवश्यक रूप से एकजुट नहीं होते हैं, ऊपर दिए गए उदाहरणों में वैसे भी दिखाए गए थे। वैसे भी स्पष्टीकरण के लिए धन्यवाद! – m09

4

_ है कुछ भी ... foo, [1,2], बार (42, foo [2,3,7]) आदि
[_] एक सूची है कि वास्तव में है एक तत्व है कि आपके उदाहरण में कुछ

हो सकता है अगर एल 2 एक से अधिक तत्व है (या खाली सूची है) तो इसके साथ [_]