सबसे पहले, मुझे आपके ठीक pw0n1e आइकन पर आपकी प्रशंसा करने की अनुमति दें।
यह जवाब देने के लिए एक मुश्किल सवाल है, मोटे तौर पर क्योंकि मिनीक्रेन और प्रोलोग दोनों के बहुत सारे संस्करण हैं। मिनीक्रेन और प्रोलॉग वास्तव में भाषाओं के परिवार हैं, जिससे उनकी विशेषताओं की तुलना करना मुश्किल हो जाता है, या यहां तक कि उन्हें अभ्यास में कैसे उपयोग किया जाता है। इस वजह से, कृपया सावधानी के साथ मैं जो कुछ भी कहने जा रहा हूं, उसे ले लें: अगर मैं कहता हूं कि प्रोलॉग गहराई-पहली खोज का उपयोग करता है, तो ध्यान रखें कि कई प्रोलॉग कार्यान्वयन अन्य खोज रणनीतियों का समर्थन करते हैं, और यह कि वैकल्पिक खोज रणनीतियों को मेटा में एन्कोड भी किया जा सकता है। -निष्पक्ष स्तर फिर भी, मिनीक्रेन और प्रोलॉग के अलग-अलग डिज़ाइन दर्शन हैं, और अलग-अलग ट्रेड-ऑफ हैं।
प्रोलॉग प्रतीकात्मक कृत्रिम बुद्धिमत्ता प्रोग्रामिंग के लिए दो क्लासिक भाषाओं में से एक है (दूसरी क्लासिक भाषा लिस्प है)। प्रतीकात्मक नियम-आधारित प्रणाली को लागू करने में प्रस्तावनाओं का विस्तार जिसमें प्रथम-क्रम तर्क में घोषित ज्ञान निहित है। इस प्रकार के अनुप्रयोगों के लिए भाषा को स्पष्टता और दक्षता के लिए अनुकूलित किया जाता है, कभी-कभी तार्किक शुद्धता की कीमत पर। उदाहरण के लिए, डिफ़ॉल्ट रूप से Prolog एकीकरण में "घटित चेक" का उपयोग नहीं करता है। एक गणित / तर्क की दृष्टि से, एकीकरण का यह संस्करण गलत है। हालाँकि, होने वाला चेक महंगा है, और ज्यादातर मामलों में होने वाली चेक की कमी कोई समस्या नहीं है। यह एक बहुत ही व्यावहारिक डिजाइन निर्णय है, जैसा कि प्रोलॉग की गहराई-पहली खोज, और कट का उपयोग है (!
) बैकट्रैकिंग को नियंत्रित करने के लिए। मुझे यकीन है कि 1970 के दशक के हार्डवेयर पर चलने के दौरान ये निर्णय बिल्कुल आवश्यक थे, और आज बड़ी समस्याओं पर काम करते समय बहुत उपयोगी होते हैं, और जब विशाल (अक्सर अनंत!) खोज स्थानों से निपटते हैं।
प्रोलॉग कई "अतिरिक्त-तार्किक" या "गैर-तार्किक" सुविधाओं का समर्थन करता है, जिसमें कट, assert
और retract
, अंकगणित के उपयोग के लिए चर का प्रक्षेपण शामिल हैis
, इत्यादि। इनमें से कई विशेषताएं जटिल नियंत्रण प्रवाह को व्यक्त करना आसान बनाती हैं, और प्रोलोग के तथ्यों के वैश्विक डेटाबेस में हेरफेर करती हैं। प्रोलॉग की एक बहुत ही दिलचस्प विशेषता यह है कि प्रोलॉग कोड खुद को तथ्यों के वैश्विक डेटाबेस में संग्रहीत किया जाता है, और इसे रन टाइम के खिलाफ क्वेर किया जा सकता है। यह मेटा-दुभाषियों को लिखने के लिए तुच्छ बनाता है जो व्याख्या के तहत प्रोलॉग कोड के व्यवहार को संशोधित करते हैं। उदाहरण के लिए, खोज क्रम में परिवर्तन करने वाले मेटा-दुभाषिया का उपयोग करके प्रोलॉग में चौड़ाई-पहली खोज को एनकोड करना संभव है। यह एक अत्यंत शक्तिशाली तकनीक है जो प्रोलॉग दुनिया के बाहर अच्छी तरह से ज्ञात नहीं है। 'द आर्ट ऑफ प्रोलॉग' इस तकनीक का विस्तार से वर्णन करता है।
प्रचंड प्रयास प्रोलॉग कार्यान्वयन को बेहतर बनाने में चला गया है, जिनमें से अधिकांश वॉरेन सार मशीन (WAM) पर आधारित हैं। WAM एक साइड-इफ़ेक्टिंग मॉडल का उपयोग करता है जिसमें मानों को विनाशकारी रूप से लॉजिक वेरिएबल्स को सौंपा जाता है, इन साइड-इफेक्ट्स को बैकट्रैकिंग पर पूर्ववत किया जाता है। WAM के निर्देशों का विस्तार करके Prolog में कई सुविधाएँ जोड़ी जा सकती हैं। इस दृष्टिकोण का एक नुकसान यह है कि प्रोग्ल कार्यान्वयन कागजात को WAM की ठोस समझ के बिना पढ़ना मुश्किल हो सकता है। दूसरी ओर, प्रोलोग कार्यान्वयनकर्ता के पास कार्यान्वयन के मुद्दों पर चर्चा करने के लिए एक सामान्य मॉडल है। 1990 के दशक में अंडोरा प्रोलॉग में समापन, समांतर प्रोलॉग में काफी शोध हुआ है। कम से कम इन विचारों में से कुछ Ciao Prolog में रहते हैं। (सियाओ प्रोलॉग दिलचस्प विचारों से भरा है, जिनमें से कई प्रोलॉग मानक से बहुत आगे जाते हैं।)
प्रोलॉग में एक सुंदर एकीकरण-आधारित "पैटर्न-मिलान" -स्टाइल वाक्यविन्यास है जिसके परिणामस्वरूप बहुत ही रसीला कार्यक्रम हैं। प्रोलोगर्स अपने सिंटैक्स से प्यार करते हैं, जैसे लिस्पर्स अपने एस-एक्सप्रेशन से प्यार करते हैं। प्रोलॉग में मानक विधेयकों का एक बड़ा पुस्तकालय भी है। सभी इंजीनियरिंग के कारण जो कि WAM को तेज बनाने में चली गई है, बहुत सक्षम और परिपक्व प्रोलॉग कार्यान्वयन हैं। नतीजतन, कई बड़े ज्ञान-आधारित सिस्टम पूरी तरह से प्रोलॉग में लिखे गए हैं।
मिनीक्रेन को एक छोटी, आसानी से समझने योग्य और आसानी से हैक करने योग्य कार्यान्वयन के साथ एक न्यूनतम तर्क प्रोग्रामिंग भाषा के रूप में डिज़ाइन किया गया था। मिनीक्रेन को मूल रूप से योजना में शामिल किया गया था, और पिछले एक दशक में दर्जनों अन्य होस्ट भाषाओं में पोर्ट किया गया है। सबसे लोकप्रिय मिनीकरन कार्यान्वयन क्लोजर में 'core.logic' है, जिसमें अब कई प्रोलॉग जैसे एक्सटेंशन और कई अनुकूलन हैं। हाल ही में मिनीक्रेन के कार्यान्वयन के मूल को और भी सरल बनाया गया है, जिसके परिणामस्वरूप "माइक्रोकेरेन" नामक एक छोटा "माइक्रो कर्नेल" बना है। miniKanren तो इस microKanren कोर के शीर्ष पर लागू किया जा सकता है। एक नई होस्ट भाषा के लिए माइक्रोकैनर या मिनीक्रेन को पोर्ट करना मिनीक्रेन सीखने वाले प्रोग्रामरों के लिए एक मानक अभ्यास बन गया है। नतीजतन,
MiniKanren और microKanren के मानक कार्यान्वयन में एक भी अपवाद के साथ कोई उत्परिवर्तन या अन्य दुष्प्रभाव नहीं होते हैं: MiniKanren के कुछ संस्करण तर्क चर की तुलना के लिए सूचक समानता का उपयोग करते हैं। मैं इसे "सौम्य प्रभाव" मानता हूं, हालांकि कई कार्यान्वयन कार्यान्वयन के माध्यम से एक काउंटर पास करने से भी इस प्रभाव से बचते हैं। कोई वैश्विक तथ्य डेटाबेस भी नहीं है। मिनीक्रेन के कार्यान्वयन दर्शन कार्यात्मक प्रोग्रामिंग से प्रेरित है: उत्परिवर्तन और प्रभावों से बचा जाना चाहिए, और सभी भाषा निर्माणों को लेक्सस गुंजाइश का सम्मान करना चाहिए। यदि आप कार्यान्वयन को ध्यान से देखते हैं तो आप एक-दो भिक्षुओं को भी हाजिर कर सकते हैं। खोज कार्यान्वयन आलसी धाराओं के संयोजन और हेरफेर पर आधारित है, एक बार फिर से उत्परिवर्तन का उपयोग किए बिना। इन कार्यान्वयन विकल्पों से प्रोलॉग की तुलना में बहुत अलग व्यापार-बंद होते हैं। प्रोलॉग में, वैरिएबल लुकअप निरंतर समय होता है, लेकिन बैकट्रैकिंग को साइड इफेक्ट करने की आवश्यकता होती है। मिनीकरन वैरिएबल लुकअप में ज्यादा खर्चीला है, लेकिन बैकट्रैकिंग "फ्री" है। वास्तव में, मिनीक्रेन में कोई बैकट्रैकिंग नहीं है, इसकी वजह यह है कि धाराओं को कैसे संभाला जाता है।
मिनीक्रेन के कार्यान्वयन का एक दिलचस्प पहलू यह है कि कोड स्वाभाविक रूप से थ्रेड-सेफ है और --- कम से कम सिद्धांत में --- त्रिविमीय समानांतर। बेशक, इसे धीमा किए बिना कोड को समानांतर करना तुच्छ नहीं है, यह देखते हुए कि समानांतर के ओवरहेड के लिए बनाने के लिए प्रत्येक थ्रेड या प्रक्रिया को पर्याप्त काम दिया जाना चाहिए। फिर भी, यह मिनीक्रेन के कार्यान्वयन का एक क्षेत्र है जो मुझे आशा है कि अधिक ध्यान और प्रयोग प्राप्त होगा।
MiniKanren एकीकरण के लिए होने वाली जांच का उपयोग करता है, और गहराई-पहले खोज के बजाय एक पूर्ण इंटरलेविंग खोज का उपयोग करता है। इंटरलीविंग खोज गहराई-पहली खोज की तुलना में अधिक मेमोरी का उपयोग करती है, लेकिन कुछ मामलों में ऐसे उत्तर पा सकते हैं जिनमें गहराई-पहली खोज हमेशा के लिए विचलित हो जाएगी। miniKanren करता है कुछ अतिरिक्त तार्किक ऑपरेटरों --- का समर्थन conda
, condu
और project
, के लिए उदाहरण। conda
और condu
प्रोलॉग की कटौती का अनुकरण करने के लिए इस्तेमाल किया जा सकता है, और project
इसका उपयोग तर्क चर के साथ जुड़े मूल्य प्राप्त करने के लिए किया जा सकता है।
की उपस्थिति conda
, condu
औरproject
--- और खोज की रणनीति को आसानी से संशोधित करने की क्षमता --- प्रोग्रामर को मिनील्रेन को एक एम्बेडेड प्रोलॉग जैसी भाषा के रूप में उपयोग करने की अनुमति देता है। यह क्लोजर के 'core.logic' के उपयोगकर्ताओं के लिए विशेष रूप से सच है, जिसमें कई प्रोलॉग जैसे एक्सटेंशन शामिल हैं। मिनीक्रेन का यह "व्यावहारिक" उपयोग उद्योग में मिनीक्रेन के अधिकांश उपयोग के लिए जिम्मेदार लगता है। प्रोग्रामर जो क्लोजर या पायथन या जावास्क्रिप्ट में लिखे गए मौजूदा एप्लिकेशन में एक ज्ञान-आधारित तर्क प्रणाली को जोड़ना चाहते हैं, वे आमतौर पर प्रोलॉग में अपने पूरे आवेदन को फिर से लिखने में रुचि नहीं रखते हैं। क्लोजर या पाइथन में एक छोटी लॉजिक प्रोग्रामिंग लैंग्वेज एम्बेड करना कहीं अधिक आकर्षक है। एक एम्बेडेड प्रोलॉग कार्यान्वयन इस उद्देश्य के लिए, संभवत: बस काम करेगा।
प्रोलॉग की तरह ही एक व्यावहारिक एम्बेडेड लॉजिक प्रोग्रामिंग भाषा के रूप में मिनीक्रेन के उपयोग के अलावा, मिनीकलैन का उपयोग "रिलेशनल" प्रोग्रामिंग में अनुसंधान के लिए किया जा रहा है। यही है, उन कार्यक्रमों को लिखने में जो गणितीय कार्यों के बजाय गणितीय संबंधों के रूप में व्यवहार करते हैं। उदाहरण के लिए, योजना में append
फ़ंक्शन दो सूचियों को जोड़ सकता है, एक नई सूची लौटा सकता है: फ़ंक्शन कॉल (append '(a b c) '(d e))
सूची को लौटाता है (a b c d e)
। हालाँकि, हम append
दो-तर्क फ़ंक्शन के बजाय तीन-स्थान संबंध के रूप में भी व्यवहार कर सकते हैं । कॉल (appendo '(a b c) '(d e) Z)
तब Z
सूची के साथ तर्क चर को जोड़ देगा (a b c d e)
। जब हम तर्क चर को अन्य पदों पर रखते हैं तो निश्चित रूप से चीजें अधिक दिलचस्प हो जाती हैं। कॉल (appendo X '(d e) '(a b c d e))
के X
साथ (a b c)
, कॉल सहयोगी होता है(appendo X Y '(a b c d e))
सहयोगी X
और Y
सूचियों के जोड़े के साथ, जब जोड़ा जाता है, के बराबर हैं (a b c d e)
। उदाहरण के लिए X
= (a b)
और Y
= (c d e)
मूल्यों की एक ऐसी जोड़ी है। हम यह भी लिख सकते हैं (appendo X Y Z)
, जो सूची के असीम कई ट्रिपल उत्पादन करेगा X
, Y
और Z
इस तरह के जोड़ है कि X
करने के लिए Y
पैदा करता है Z
।
इस संबंधपरक संस्करण को append
आसानी से प्रोलॉग में व्यक्त किया जा सकता है, और वास्तव में कई प्रोलॉग ट्यूटोरियल में दिखाया गया है। व्यवहार में, अधिक जटिल प्रोलोग प्रोग्राम कम से कम कुछ अतिरिक्त-तार्किक सुविधाओं का उपयोग करते हैं, जैसे कि कट, जो परिणामस्वरूप प्रोग्राम को संबंध के रूप में व्यवहार करने की क्षमता को बाधित करते हैं। इसके विपरीत, मिनीक्रेन स्पष्ट रूप से रिलेशनल प्रोग्रामिंग की इस शैली का समर्थन करने के लिए डिज़ाइन किया गया है। MiniKanren के नवीनतम संस्करण (प्रतीकात्मक बाधा को हल करने के लिए समर्थन symbolo
, numbero
,absento
, असमानता बाधाओं, नाममात्र तर्क प्रोग्रामिंग) संबंधों के रूप में गैर-तुच्छ कार्यक्रमों को लिखना आसान बनाता है। व्यवहार में मैं कभी भी मिनीक्रेन की अतिरिक्त-तार्किक विशेषताओं का उपयोग नहीं करता, और मैं अपने सभी मिनीक्रेन कार्यक्रमों को संबंधों के रूप में लिखता हूं। सबसे दिलचस्प संबंधपरक कार्यक्रम योजना के सबसेट के लिए संबंधपरक व्याख्याकार हैं। इन दुभाषियों में कई दिलचस्प क्षमताएँ होती हैं, जैसे कि एक मिलियन स्कीम प्रोग्राम बनाना जो सूची का मूल्यांकन करते हैं (I love you)
, या तुच्छ रूप से उत्पन्न क्वीन (ऐसे प्रोग्राम जो स्वयं का मूल्यांकन करते हैं)।
MiniKanren प्रोग्रामिंग की इस संबंधपरक शैली को सक्षम करने के लिए कई ट्रेड-ऑफ करता है, जो ट्रेड-ऑफ्स से बहुत अलग हैं Prolog बनाता है। समय के साथ मिनीक्रेन ने और अधिक प्रतीकात्मक बाधाओं को जोड़ा है, वास्तव में प्रतीकात्मक रूप से उन्मुख बाधा सूचक प्रोग्रामिंग भाषा बन रही है। कई मामलों में ये प्रतीकात्मक अड़चनें अतिरिक्त तार्किक ऑपरेटरों जैसे condu
और का उपयोग करने से बचने के लिए इसे व्यावहारिक बनाती हैं project
। अन्य मामलों में, ये प्रतीकात्मक अवरोध पर्याप्त नहीं हैं। प्रतीकात्मक बाधाओं के लिए बेहतर समर्थन मिनीक्रेन अनुसंधान का एक सक्रिय क्षेत्र है, साथ ही व्यापक प्रश्न के साथ कि संबंधों के रूप में बड़े और अधिक जटिल कार्यक्रम कैसे लिखें।
संक्षेप में, मिनीक्रेन और प्रोलोग दोनों में दिलचस्प विशेषताएं, कार्यान्वयन और उपयोग हैं, और मुझे लगता है कि यह दोनों भाषाओं के विचारों को सीखने के लायक है। अन्य बहुत ही दिलचस्प लॉजिक प्रोग्रामिंग लैंग्वेज हैं, जैसे कि मर्करी, करी और गोडेल, जिनमें से प्रत्येक की लॉजिक प्रोग्रामिंग पर अपनी पकड़ है।
मैं कुछ मिनीकैनर संसाधनों के साथ समाप्त हो जाऊंगा:
मुख्य मिनीक्रेन वेबसाइट:
http://minikanren.org/
एक साक्षात्कार जो मैंने रिलेशनल प्रोग्रामिंग और मिनीक्रेन पर दिया था, जिसमें प्रोलॉग के साथ तुलना शामिल है:
http://www.infoq.com/interviews/byrd-relational-programming-minikanren
चीयर्स,
--मर्जी