टुपल कंस्ट्रक्टर और कंस जोड़े के रूप में अंकगणितीय ऑपरेटरों का उपयोग करें
यदि आपको दो या दो से अधिक मूल्यों वाले एकल संरचना को पास करने की आवश्यकता है, तो उपयोग करने के लिए सबसे स्पष्ट चीज एक सूची है, उदाहरण के लिए [A,B]
। यह वास्तव में क्रिया है, हालांकि।
एक विकल्प है। प्रोलॉग मान बहुत अधिक मनमाने ढंग से नेस्टेड संरचना को संग्रहीत कर सकते हैं, जिसका मूल्यांकन नहीं किया जाता है। यहाँ एक उदाहरण दिखाया गया है कि यह कैसे काम करता है:
| ?- member(member(A,B),C).
C = [member(A,B)|_] ? ;
C = [_,member(A,B)|_] ? ;
(etc.)
member(A,B)
इस स्थिति में सिर्फ एक नामांकित टपल है, और बाहर member
(जो एक फ़ंक्शन कॉल है) इसे इस तरह से मान रहा है।
हालांकि नामांकित ट्यूल गैर-गोल्फ प्रोलॉग प्रोग्रामिंग में काफी उपयोगी हैं, वे सूची दृष्टिकोण की तुलना में अधिक क्रियाशील लग सकते हैं। हालाँकि, हम टुप्ल कंस्ट्रक्टर के नाम पर बहुत अधिक मनमाने पात्रों का उपयोग कर सकते हैं (यह मानते हुए कि वे ठीक से उद्धृत हैं); कुछ प्यारा member
या एक जैसे चरित्र के बजाय a
, हम ऐसा कुछ कर सकते हैं:
| ?- A = '-'('/'(1,2), '/'(3,4)).
A = 1/2-3/4
यहाँ, हमारे टपल निर्माता हैं '-'
और '/'
। और यह नोट करना दिलचस्प है कि सुंदर-प्रिंटर ने उनके साथ क्या किया; यह tuples के लिए infix संकेतन का उपयोग कर रहा है । यह वास्तव में बहुत कठिन है, और एक ही तरीका है कि तुलनीय अंकगणितीय ऑपरेशन होगा। (यह भी बताता है कि अंकगणित का उपयोग क्यों is
नहीं किया जाता है =
; टपल के साथ A = 1+2
एकीकृत होगा , इसलिए अलग-अलग वाक्यविन्यास को वास्तव में बिना अंकगणित अंकगणितीय अभिव्यक्ति का मूल्यांकन करने की आवश्यकता होती है।) क्योंकि एक ट्यूलल कंस्ट्रक्टर को कुछ कहा जाना है , आप एक ऐसे चरित्र का उपयोग कर सकते हैं जिसमें एक शब्द है। सिंटैक्स (और बोनस के रूप में, औरA
'+'(1,2)
-
/
गैर-गोल्फ कोड में कुछ सबसे आम विकल्प भी हैं, जब वे कुछ सार्थक के बजाय एक त्वरित फेंकने वाला टपल निर्माण चाहते हैं, उसी तरह से जो i
अक्सर लूप चर के रूप में उपयोग किया जाता है, इसलिए वे आपके उपयोग में पूरी तरह से उचित हैं इनपुट और आउटपुट यदि आप किसी कारणवश वहां ट्यूपल चाहते हैं)।
'-'
और '/'
ट्यूलल कंस्ट्रक्टर के लिए अच्छे विकल्प हैं क्योंकि उनके पास अच्छी तरह से व्यवहार और उपयोगी पूर्वता है, जिससे आप ट्यूलल लिटरल को ट्रेसली लिख सकते हैं। हालाँकि, ध्यान दें कि कार्यक्रम के अंदर मध्यवर्ती मान उत्पन्न होने पर आपको पूर्वता के बारे में चिंता करने की आवश्यकता नहीं है। प्रोलॉग टुपल्स को स्रोत कोड के बजाय एक पेड़ के रूप में संग्रहीत करता है, और सुंदर-प्रिंटर इसे अस्पष्ट रूप से आउटपुट कर सकते हैं:
| ?- A = '-'('-'(1,2), '-'(3,4)).
A = 1-2-(3-4)
क्योंकि टुपल सिंटैक्स इतना f(A,B)
अधिक है ( f(A-B)
आप की तुलना में छोटा नहीं है ), आप बिना किसी लागत के कई प्रेडिक्टेट तर्कों को प्रतिस्थापित कर सकते हैं, जिसका अर्थ है कि यदि किसी विधेय को किसी अन्य डेडिकेटेट को इसके दो या अधिक दलीलों को पारित करने की आवश्यकता है, तो आप उन्हें अक्सर बना सकते हैं। एक टुपल और बस टपल को पास करें (हालांकि इसके लिए विधेय के अलावा सभी कॉलों को बदलने की आवश्यकता होगी, टपल कंस्ट्रक्टरों और कॉमाओं के उचित मिश्रण का उपयोग करने के लिए।
इस सिंटैक्स का एक और फायदा यह है कि यदि आपको सूचियों का आंतरिक रूप से उपयोग करने की आवश्यकता है (बजाय मानक विधेय के साथ हस्तक्षेप करने के लिए); एक सूची मूल रूप से नेस्टेड कॉन्स कोशिकाओं का एक सेट है, और एक कॉन्स सेल कंस्ट्रक्टर के साथ सिर्फ एक टपल है '.'
, जैसा कि देखा जा सकता है:
| ?- Q = '.'('.'(A,B),'.'(C,D)).
Q = [[A|B],C|D]
यदि आपका कोड "मैन्युअल रूप से" सूचियों का उपयोग करता है, तो इसकी तुलना में बहुत कम टफ कंस्ट्रक्टर का उपयोग करने के लिए बहुत कुछ समझ में आता है '.'
। मेरे लिए एक सामान्य विकल्प है कि आप एक आम सेल का प्रतिनिधित्व करें '/'(Tail,Head)
(क्योंकि यह सबसे पठनीय है, जो आप वर्णों को बर्बाद किए बिना डिबग आउटपुट में प्राप्त कर सकते हैं)। ध्यान दें कि आप शायद अपने स्वयं के []
समकक्ष भी चाहते हैं; आप उपयोग कर सकते हैं, []
लेकिन यह दो बाइट्स लंबा है, और एक-एक बाइट परमाणु (सभी निचले अक्षर) हैं जो आप इसके बजाय उपयोग कर सकते हैं।
उदाहरण के लिए, निम्न सूची:
[1,2,3]
इस तरह से एक ही संख्या में वर्णों को मैन्युअल प्रतिनिधित्व में बदला जा सकता है:
x/3/2/1
फ़ायदा उठाते हुए कि [H|T]
-स्टाइल पैटर्न मैच के रूप में अब और अधिक स्पष्ट रूप से लिखा जा सकता है T/H
, और खाली सूची के खिलाफ एक परीक्षण के x
बजाय केवल लंबे समय तक []
। (बेशक, यह स्पष्ट नुकसान यह है कि के साथ आता है member
, append
आदि, इस प्रतिनिधित्व पर काम नहीं करेगा।)
prolog
टैग थोड़े बेकार है। जब तक हमारे पास एक व्याख्या प्रस्ताव चुनौती नहीं है, हमें इसकी आवश्यकता नहीं है।