पहले, मुझे लगता है कि आप पहले से ही चर्च-ट्यूरिंग थीसिस के बारे में सुन चुके हैं , जिसमें कहा गया है कि जिसे हम "गणना" कहते हैं वह एक ऐसी चीज है जिसे ट्यूरिंग मशीन (या कई अन्य समकक्ष मॉडलों में से किसी एक) के साथ किया जा सकता है। तो ट्यूरिंग-पूर्ण भाषा वह है जिसमें किसी भी गणना को व्यक्त किया जा सकता है। इसके विपरीत, ट्यूरिंग-अपूर्ण भाषा वह है जिसमें कुछ संगणना होती है जिसे व्यक्त नहीं किया जा सकता है।
ठीक है, यह बहुत जानकारीपूर्ण नहीं था। मुझे एक उदाहरण देने दें। एक चीज है जो आप किसी भी ट्यूरिंग-अधूरी भाषा में नहीं कर सकते हैं: आप ट्यूरिंग मशीन सिम्युलेटर नहीं लिख सकते हैं (अन्यथा आप नकली ट्यूरिंग मशीन पर किसी भी गणना को सांकेतिक शब्दों में बदलना कर सकते हैं)।
ठीक है, यह अभी भी बहुत जानकारीपूर्ण नहीं था। असली सवाल यह है कि ट्यूरिंग-अधूरी भाषा में क्या उपयोगी कार्यक्रम नहीं लिखा जा सकता है? खैर, कोई भी "उपयोगी कार्यक्रम" की परिभाषा के साथ नहीं आया है जिसमें सभी प्रोग्राम शामिल हैं जो किसी ने किसी उपयोगी उद्देश्य के लिए लिखा है, और जिसमें सभी ट्यूरिंग मशीन संगणनाएं शामिल नहीं हैं। इसलिए ट्यूरिंग-अधूरी भाषा को डिजाइन करना जिसमें आप सभी उपयोगी प्रोग्राम लिख सकते हैं, अभी भी एक दीर्घकालिक शोध लक्ष्य है।
अब ट्यूरिंग-अधूरी भाषाओं के कई अलग-अलग प्रकार हैं, और वे अलग-अलग हैं जो वे नहीं कर सकते हैं। हालांकि एक सामान्य विषय है: ट्यूरिंग-पूर्ण भाषाओं में सशर्त रूप से समाप्त करने या किसी ऐसे समय के लिए चलते रहना चाहिए जो प्रोग्राम के आकार से बंधा नहीं है, और प्रोग्राम के लिए स्मृति की मात्रा का उपयोग करने का एक तरीका है जो इनपुट पर निर्भर करता है । लगातार, अधिकांश अनिवार्य प्रोग्रामिंग भाषाएं इन क्षमताओं को प्रदान करती हैं, जबकि क्रमशः लूप और गतिशील मेमोरी आवंटन। अधिकांश कार्यात्मक प्रोग्रामिंग भाषा इन क्षमताओं को पुनरावर्तन और डेटा संरचना घोंसले के माध्यम से प्रदान करती हैं।
इदरिस दृढ़ता से प्रेरित है AGDA । Agda एक भाषा है जिसे प्रमेयों को सिद्ध करने के लिए डिज़ाइन किया गया है । अब प्रमेय सिद्ध करना और कार्यक्रम चलाना बहुत निकटता से संबंधित है , इसलिए आप अगड़ा में वैसे ही कार्यक्रम लिख सकते हैं जैसे आप एक प्रमेय सिद्ध करते हैं। वास्तव में, प्रमेय का एक प्रमाण "ए का अर्थ बी" एक ऐसा कार्य है जो प्रमेय ए के प्रमाण को एक तर्क के रूप में लेता है और प्रमेय बी का एक प्रमाण देता है।
चूंकि सिस्टम का लक्ष्य प्रमेयों को साबित करना है, आप प्रोग्रामर को मनमाने कार्य लिखने नहीं दे सकते। कल्पना कीजिए कि भाषा ने आपको एक मूर्खतापूर्ण पुनरावर्ती कार्य लिखने की अनुमति दी है जो सिर्फ खुद को कहते हैं:
oops : A -> B
oops x = oops x
आप इस तरह के एक समारोह के अस्तित्व को मना नहीं कर सकते हैं कि ए का मतलब है कि बी, या फिर आप कुछ भी साबित करने में सक्षम होंगे और न केवल प्रमेय! अगाडा (और इसी तरह का प्रमेय साबित होता है) मनमानी पुनरावृत्ति की मनाही करता है। जब आप एक पुनरावर्ती फ़ंक्शन लिखते हैं, तो आपको यह साबित करना होगा कि यह हमेशा समाप्त हो जाता है , ताकि जब भी आप इसे प्रमेय A के प्रमाण पर चलाएं तो आपको पता चले कि यह प्रमेय B के प्रमाण का निर्माण करेगा।
अगाडा की तात्कालिक व्यावहारिक सीमा यह है कि आप मनमाने ढंग से पुनरावर्ती कार्य नहीं लिख सकते हैं। चूंकि सिस्टम सभी गैर-समाप्ति वाले कार्यों को अस्वीकार करने में सक्षम होना चाहिए, इसलिए हॉल्टिंग समस्या (या आमतौर पर राइस प्रमेय ) की अनिर्वायता यह सुनिश्चित करती है कि समाप्त होने वाले फ़ंक्शन भी हैं। एक अतिरिक्त व्यावहारिक कठिनाई यह है कि आपको सिस्टम को यह साबित करने में मदद करनी होगी कि आपका कार्य समाप्त हो गया है।
प्रूफ सिस्टम को और अधिक प्रोग्रामिंग-लैंग्वेज बनाने पर बहुत सारे शोध चल रहे हैं, जैसे कि उनकी गारंटी के साथ समझौता किए बिना कि यदि आपके पास ए से बी तक कोई फ़ंक्शन है, तो यह गणितीय प्रमाण के रूप में अच्छा है कि ए का मतलब है कि बी को अधिक स्वीकार करने के लिए सिस्टम का विस्तार करना। कार्य को समाप्त करना अनुसंधान विषयों में से एक है। अन्य विस्तार दिशाओं में इनपुट / आउटपुट और कॉन्सिक्वेरिटी जैसे "वास्तविक दुनिया" चिंताओं का सामना करना पड़ता है। एक और चुनौती इन प्रणालियों को मात्र नश्वर (या शायद मात्र नश्वर को समझाने के लिए कि वे वास्तव में सुलभ हैं) को सुलभ बनाना है।
मैं इदरीस से परिचित नहीं हूँ। यह मेरे द्वारा बताई गई चुनौतियों पर एक कदम है। जहाँ तक मैं 2013 की छाप पर एक सरसरी नज़र से समझता हूँ , इदरिस है ट्यूरिंग-पूर्ण है, लेकिन एक समग्रता चेकर भी शामिल है। समग्र चेकर सत्यापित करता है कि प्रत्येक फ़ंक्शन कीवर्ड के साथ एनोटेट किया गया है total
। भाषा का टुकड़ा जिसमें केवल इदरीस कार्यक्रम होते हैं, जहां हर फ़ंक्शन कुल होता है, अरदा के लिए अभिव्यंजक शक्ति के समान है (शायद प्रकार सिद्धांत में अंतर के कारण सटीक मिलान नहीं है, लेकिन पर्याप्त करीब है कि आप तब तक नोटिस नहीं करेंगे जब तक कि आपने जानबूझकर कोशिश नहीं की)।
उन भाषाओं के अन्य उदाहरणों के लिए जो अलग-अलग तरीकों से ट्यूरिंग-पूर्ण नहीं हैं, देखें कि कोक के साथ एक गैर-ट्यूरिंग पूरी भाषा की व्यावहारिक सीमाएं क्या हैं? (जो यह उत्तर एक बड़े विस्तार से लिया गया है)।