तर्क प्रोग्रामिंग के संबंध में, प्रोलॉग और मिनीक्रेन के बीच मुख्य तकनीकी अंतर क्या हैं? [बन्द है]


124

जब मैं तर्क प्रोग्रामिंग पर पढ़ना चाहता हूं, तो मैं आजकल इसे करने के दो "मुख्य" तरीकों पर ठोकर खाता हूं:

  • MiniKanren , एक मिनीलेंजेज रीज़नड स्कीमर में पेश किया गया था और कोर के कारण इस समय लोकप्रिय था ।
  • प्रोलॉग , पहला "बड़ा" तर्क प्रोग्रामिंग भाषा।

अब मुझे क्या दिलचस्पी है: दोनों के बीच मुख्य तकनीकी अंतर क्या हैं? क्या वे दृष्टिकोण और कार्यान्वयन में बहुत समान हैं, या क्या वे तर्क प्रोग्रामिंग के लिए पूरी तरह से अलग दृष्टिकोण लेते हैं? वे गणित की किस शाखा से आते हैं और सैद्धांतिक आधार क्या हैं?


3
इस प्रश्न को देखकर दुखी हुआ। जैसा कि बहुत ही अस्पष्ट उत्तर और बड़ी संख्या में उत्थान द्वारा प्रदर्शित किया गया है, यह एक पूरी तरह से उपयोगी प्रश्न है। मैंने दोबारा मतदान किया ....
nealmcb

@nealmcb प्रश्न जो एक बार कई अपवॉट्स के साथ विषय पर थे, अब नहीं हो सकते, अपवोट्स की मात्रा वह नहीं है जो इसे मान्य या नहीं परिभाषित करता है।
टियागो मार्टिंस पेरेस

जवाबों:


281

सबसे पहले, मुझे आपके ठीक 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

चीयर्स,

--मर्जी


9
अगर मुझे अभी उड़ा दिया जाए तो मुझे माफ करना। मैंने तर्क और बाधा आधारित प्रोग्रामिंग में पहले सोचा प्रयोगों को शुरू किया और मुझे जो उत्तर मिला वह है। :) वास्तव में, जैसा कि आपने अपने जवाब में उल्लेख किया है, मेरे पास भी एक मजबूत संदेह तर्क है कि एक मोनाड के रूप में लागू करने के लिए एक आदर्श उम्मीदवार था; यह एक मोनाडप्लस के अधिक है और वास्तव में आपके सहयोगी फ्राइडमैन द्वारा एक कागज और संदर्भ कार्यान्वयन है! तो मैं इसे पढ़ रहा हूं और इसके साथ खेल रहा हूं, इसके बारे में कोई विचार?
प्रोफ़ेसटच

4
मुझे संदेह है कि आपको माइक्रोकेन पेपर और कोड दिलचस्प भी मिलेगा: webyrd.net/scheme-2013/papers/HemannMuKanren2013.pdf और github.com/jasonhemann/microKrren
विलियम ई। बर्ड

5
इसके अलावा, मैं Google Hangouts पर रविवार, दोपहर 3 बजे पूर्वी समय (GMT -5: 00) पर एक साप्ताहिक मिनीक्रेन का आयोजन करता हूं। मैं हमेशा अपने @webyrd ट्विटर अकाउंट से लिंक ट्वीट करता हूं, अगर आप हमसे जुड़ना चाहते हैं। पिछले रिकॉर्ड किए गए हैंगआउट निम्न हैं: youtube.com/playlist?list=PLO4TbomOdn2cks2n5PvifialL8kQwt0aW
विलियम ई। बर्ड

2
मुझे लगता है कि यह मूल रूप से '05 पेपर 'के समान ही खोज है। इसके अलावा, Seres और Spivey द्वारा by एंबेडिंग प्रोलॉग हॉगल
विलियम ई।

1
@ विलियमई.बर्ड - बहुत बढ़िया जवाब! यह मानते हुए कि एक, सबसे अच्छा मिनीक्रेन कार्यान्वयन क्या है जिसे C / C ++ प्रोग्राम में एम्बेड किया जा सकता है? इसके अलावा, क्या मिनीक्रेन के पास प्रोलॉग की उदार प्रकृति है? यही है, एक अभिव्यक्ति को भूमिगत में एक चर छोड़ने की क्षमता और कोर इंजन कार्यक्रम द्वारा घोषित वर्तमान संबंधों को देखते हुए भूमिगत चर के लिए सभी संभावित मान उत्पन्न करेगा?
रॉबर्ट ओस्लर

4

टेंटेटिव उत्तर:

AFAIK, "द रीज़िश्ड स्कीमर" ने स्कीम-वाई सिंटैक्स और फ़ंक्शनल प्रोग्रामिंग स्टाइल में बुनियादी लॉजिक प्रोग्रामिंग पेश की, विशेष रूप से निरंतर लक्ष्यों "#u" (असफल) और "#s" (suceeed) को बूलियन मानों में जोड़ना #t "और" # एफ "। यह Prolog: Unification और backtracking खोज के रूप में लॉजिक प्रोग्रामिंग के लिए एक ही दृष्टिकोण का उपयोग करता था। मैं देखूंगा कि क्या मेरे पास सप्ताहांत में अपने शेल्फ से उस पुस्तक को प्राप्त करने के लिए कुछ समय है। गणित की शाखा एक प्रतिबंधित प्रपत्र प्रथम-क्रम तर्क है, इस मामले में हॉर्न क्लॉज़, और रिज़ॉल्यूशन अनफिकेशन। देखें: कम्प्यूटेशनल लॉजिक: जॉन एलन रॉबिन्सन द्वारा भविष्य के लिए अतीत और चुनौतियों की यादें और एक ठंडी शुरुआत के लिए रॉबर्ट कॉवाल्स्की द्वारा तर्क प्रोग्रामिंग के प्रारंभिक वर्ष


3
Kanren, या MiniKanren के साथ इन दो उद्धरणों का क्या करना है?
झूठी

2
अंतिम प्रश्न देखें: "वे गणित की कौन सी शाखा से आते हैं, और सैद्धांतिक नींव क्या हैं?"
फ्रैंक शियरार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.