ट्यूरिंग पूर्णता देने से इदरिस क्या नहीं कर सकता है?


35

मुझे पता है कि इदरिस के पास निर्भर प्रकार हैं, लेकिन पूर्ण रूप से ट्यूरिंग नहीं है। ट्यूरिंग पूर्णता को छोड़ देने से क्या नहीं हो सकता है, और क्या यह निर्भर प्रकार होने से संबंधित है?

मुझे लगता है कि यह काफी विशिष्ट प्रश्न है, लेकिन मैं निर्भर प्रकारों और संबंधित प्रकार के सिस्टम के बारे में एक बड़ी राशि नहीं जानता।


2
मुझे लगता है कि आप एक ठोस उदाहरण की तलाश कर रहे हैं? मैं इदरीस से परिचित नहीं हूं, लेकिन इसाबेल / HOL में आप ऐसे काम नहीं कर सकते (या संकलित), जो हमेशा समाप्त नहीं होते (इससे भी बदतर, आपको समाप्ति प्रमाण देने की आवश्यकता है )।
राफेल

इन पंक्तियों के साथ कुछ हाँ - मुझे पूरी तरह से यकीन नहीं था कि कुछ काफी आला मामला होगा जैसे आप किसी भाषा को टाइप सिस्टम में कुछ गुणों के साथ एनकोड नहीं कर सकते हैं, या यह थोड़ा अधिक सामान्य होगा (जैसे आपने कहा था , सभी कार्यों को समाप्त करने के लिए सिद्ध किया जाना चाहिए)
स्क्वीली

1
यह गलत धारणा एड्विन ब्रैडी से आई है जिसमें कहा गया है कि इदरीस "पैकमैन पूरा" है। मुझे लगता है कि उनका मुख्य बिंदु "ट्यूरिंग पूरा" के बजाय "पैकमैन पूरा" कहकर है, यह है कि वह भाषाओं के महत्व को आसानी से समझने में सक्षम होना चाहते हैं जो मानव दिमाग द्वारा सक्षम हैं और न केवल मशीन! .. मूर्खतापूर्ण भाषा जैसे कि ब्रेनफैक निश्चित रूप से है! ट्यूरिंग पूर्ण, लेकिन यह ब्रेनफक में लिखे गए कोड को समझने के लिए एक मानव मस्तिष्क को काफी समय ले सकता है, इस प्रकार विकसित हो रहा है, और इससे भी अधिक महत्वपूर्ण बनाए रखने , ब्रेनफैक में एक पैक्मैन प्रोग्राम काफी प्रयास करता है ..
मिशेलैंडल

@Mitzh वास्तव में नहीं। मुझे लगता है कि यह इसलिए है क्योंकि मैंने किसी बात में उसे कुछ गलत समझा था।
स्क्वीली

जवाबों:


50

इदरीस ट्यूरिंग कम्प्लीट है! यह समग्रता के लिए जाँच करता है (डेटा के साथ प्रोग्रामिंग करते समय, कोडाटा के साथ प्रोग्रामिंग करते समय उत्पादकता) लेकिन सब कुछ कुल होने की आवश्यकता नहीं है।

दिलचस्प बात यह है कि डेटा और कोडाटा ट्यूरिंग पूर्णता को मॉडल करने के लिए पर्याप्त है क्योंकि आप आंशिक कार्यों के लिए एक मोनाड लिख सकते हैं। मैंने यह किया था, सालों पहले, Coq में - यह शायद अब तक बिट्रोटेड है, लेकिन यहां यह फिर भी है: http://eb.host.cs.st-andrews.ac.uk/Partial/partial.v

आपको वास्तव में ऐसी चीजों को चलाने के लिए एक भागने की आवश्यकता है, लेकिन इदरीस आपको ऐसा करने की अनुमति देता है।

प्रकार की जाँच को निर्णायक रखने के लिए, इदरीस प्रकार के स्तर पर आंशिक कार्यों को कम नहीं करेगा। इसके अलावा, केवल कुल कार्यक्रमों को प्रमाण के रूप में यथोचित माना जा सकता है।


4
वह आदमी खुद। इस संदर्भ में उत्पादकता क्या है?
स्क्वीली

5
समाप्त करने के लिए दोहरी: जबकि एक प्रेरक परिभाषा को समाप्त करना चाहिए (अपने सभी डेटा का उपभोग करके) एक सहवर्ती परिभाषा उत्पादक होनी चाहिए - व्यवहार में इसका मतलब है, संक्षेप में, कि किसी भी पुनरावर्ती कॉल को एक निर्माता द्वारा संरक्षित किया जाना चाहिए। मैंने इस स्पष्टीकरण को स्पष्ट (ymmv) पाया: adam.chlipala.net/cpdt/html/Coinductive.html
एडविन ब्रैडी

14

पहले, मुझे लगता है कि आप पहले से ही चर्च-ट्यूरिंग थीसिस के बारे में सुन चुके हैं , जिसमें कहा गया है कि जिसे हम "गणना" कहते हैं वह एक ऐसी चीज है जिसे ट्यूरिंग मशीन (या कई अन्य समकक्ष मॉडलों में से किसी एक) के साथ किया जा सकता है। तो ट्यूरिंग-पूर्ण भाषा वह है जिसमें किसी भी गणना को व्यक्त किया जा सकता है। इसके विपरीत, ट्यूरिंग-अपूर्ण भाषा वह है जिसमें कुछ संगणना होती है जिसे व्यक्त नहीं किया जा सकता है।

ठीक है, यह बहुत जानकारीपूर्ण नहीं था। मुझे एक उदाहरण देने दें। एक चीज है जो आप किसी भी ट्यूरिंग-अधूरी भाषा में नहीं कर सकते हैं: आप ट्यूरिंग मशीन सिम्युलेटर नहीं लिख सकते हैं (अन्यथा आप नकली ट्यूरिंग मशीन पर किसी भी गणना को सांकेतिक शब्दों में बदलना कर सकते हैं)।

ठीक है, यह अभी भी बहुत जानकारीपूर्ण नहीं था। असली सवाल यह है कि ट्यूरिंग-अधूरी भाषा में क्या उपयोगी कार्यक्रम नहीं लिखा जा सकता है? खैर, कोई भी "उपयोगी कार्यक्रम" की परिभाषा के साथ नहीं आया है जिसमें सभी प्रोग्राम शामिल हैं जो किसी ने किसी उपयोगी उद्देश्य के लिए लिखा है, और जिसमें सभी ट्यूरिंग मशीन संगणनाएं शामिल नहीं हैं। इसलिए ट्यूरिंग-अधूरी भाषा को डिजाइन करना जिसमें आप सभी उपयोगी प्रोग्राम लिख सकते हैं, अभी भी एक दीर्घकालिक शोध लक्ष्य है।

अब ट्यूरिंग-अधूरी भाषाओं के कई अलग-अलग प्रकार हैं, और वे अलग-अलग हैं जो वे नहीं कर सकते हैं। हालांकि एक सामान्य विषय है: ट्यूरिंग-पूर्ण भाषाओं में सशर्त रूप से समाप्त करने या किसी ऐसे समय के लिए चलते रहना चाहिए जो प्रोग्राम के आकार से बंधा नहीं है, और प्रोग्राम के लिए स्मृति की मात्रा का उपयोग करने का एक तरीका है जो इनपुट पर निर्भर करता है । लगातार, अधिकांश अनिवार्य प्रोग्रामिंग भाषाएं इन क्षमताओं को प्रदान करती हैं, जबकि क्रमशः लूप और गतिशील मेमोरी आवंटन। अधिकांश कार्यात्मक प्रोग्रामिंग भाषा इन क्षमताओं को पुनरावर्तन और डेटा संरचना घोंसले के माध्यम से प्रदान करती हैं।

इदरिस दृढ़ता से प्रेरित है AGDA । Agda एक भाषा है जिसे प्रमेयों को सिद्ध करने के लिए डिज़ाइन किया गया है । अब प्रमेय सिद्ध करना और कार्यक्रम चलाना बहुत निकटता से संबंधित है , इसलिए आप अगड़ा में वैसे ही कार्यक्रम लिख सकते हैं जैसे आप एक प्रमेय सिद्ध करते हैं। वास्तव में, प्रमेय का एक प्रमाण "ए का अर्थ बी" एक ऐसा कार्य है जो प्रमेय ए के प्रमाण को एक तर्क के रूप में लेता है और प्रमेय बी का एक प्रमाण देता है।

चूंकि सिस्टम का लक्ष्य प्रमेयों को साबित करना है, आप प्रोग्रामर को मनमाने कार्य लिखने नहीं दे सकते। कल्पना कीजिए कि भाषा ने आपको एक मूर्खतापूर्ण पुनरावर्ती कार्य लिखने की अनुमति दी है जो सिर्फ खुद को कहते हैं:

oops : A -> B
oops x = oops x

आप इस तरह के एक समारोह के अस्तित्व को मना नहीं कर सकते हैं कि ए का मतलब है कि बी, या फिर आप कुछ भी साबित करने में सक्षम होंगे और न केवल प्रमेय! अगाडा (और इसी तरह का प्रमेय साबित होता है) मनमानी पुनरावृत्ति की मनाही करता है। जब आप एक पुनरावर्ती फ़ंक्शन लिखते हैं, तो आपको यह साबित करना होगा कि यह हमेशा समाप्त हो जाता है , ताकि जब भी आप इसे प्रमेय A के प्रमाण पर चलाएं तो आपको पता चले कि यह प्रमेय B के प्रमाण का निर्माण करेगा।

अगाडा की तात्कालिक व्यावहारिक सीमा यह है कि आप मनमाने ढंग से पुनरावर्ती कार्य नहीं लिख सकते हैं। चूंकि सिस्टम सभी गैर-समाप्ति वाले कार्यों को अस्वीकार करने में सक्षम होना चाहिए, इसलिए हॉल्टिंग समस्या (या आमतौर पर राइस प्रमेय ) की अनिर्वायता यह सुनिश्चित करती है कि समाप्त होने वाले फ़ंक्शन भी हैं। एक अतिरिक्त व्यावहारिक कठिनाई यह है कि आपको सिस्टम को यह साबित करने में मदद करनी होगी कि आपका कार्य समाप्त हो गया है।

प्रूफ सिस्टम को और अधिक प्रोग्रामिंग-लैंग्वेज बनाने पर बहुत सारे शोध चल रहे हैं, जैसे कि उनकी गारंटी के साथ समझौता किए बिना कि यदि आपके पास ए से बी तक कोई फ़ंक्शन है, तो यह गणितीय प्रमाण के रूप में अच्छा है कि ए का मतलब है कि बी को अधिक स्वीकार करने के लिए सिस्टम का विस्तार करना। कार्य को समाप्त करना अनुसंधान विषयों में से एक है। अन्य विस्तार दिशाओं में इनपुट / आउटपुट और कॉन्सिक्वेरिटी जैसे "वास्तविक दुनिया" चिंताओं का सामना करना पड़ता है। एक और चुनौती इन प्रणालियों को मात्र नश्वर (या शायद मात्र नश्वर को समझाने के लिए कि वे वास्तव में सुलभ हैं) को सुलभ बनाना है।

मैं इदरीस से परिचित नहीं हूँ। यह मेरे द्वारा बताई गई चुनौतियों पर एक कदम है। जहाँ तक मैं 2013 की छाप पर एक सरसरी नज़र से समझता हूँ , इदरिस है ट्यूरिंग-पूर्ण है, लेकिन एक समग्रता चेकर भी शामिल है। समग्र चेकर सत्यापित करता है कि प्रत्येक फ़ंक्शन कीवर्ड के साथ एनोटेट किया गया है total। भाषा का टुकड़ा जिसमें केवल इदरीस कार्यक्रम होते हैं, जहां हर फ़ंक्शन कुल होता है, अरदा के लिए अभिव्यंजक शक्ति के समान है (शायद प्रकार सिद्धांत में अंतर के कारण सटीक मिलान नहीं है, लेकिन पर्याप्त करीब है कि आप तब तक नोटिस नहीं करेंगे जब तक कि आपने जानबूझकर कोशिश नहीं की)।

उन भाषाओं के अन्य उदाहरणों के लिए जो अलग-अलग तरीकों से ट्यूरिंग-पूर्ण नहीं हैं, देखें कि कोक के साथ एक गैर-ट्यूरिंग पूरी भाषा की व्यावहारिक सीमाएं क्या हैं? (जो यह उत्तर एक बड़े विस्तार से लिया गया है)।


3
" ट्यूरिंग-अपूर्ण भाषा में क्या उपयोगी कार्यक्रम नहीं लिखा जा सकता है?" एक जावा वर्चुअल मशीन।
डेविड रिचेर्बी

@DavidRicherby क्या आप नहीं कर सकते? क्या जेवीएम वास्तव में ट्यूरिंग-पूर्ण है? एक व्यक्तिगत वस्तु के आकार की सीमा होती है, क्या आप किसी ऑब्जेक्ट की अनबाउंड संख्या को आवंटित और एक्सेस करने की व्यवस्था कर सकते हैं? उदाहरण के लिए, सी में, उत्तर नहीं लगता है क्योंकि केवल बहुत सारे सूचक मान हैं।
गाइल्स 'एसओ- बुराई को रोकना'

उस हिस्से में रुचि रखने वाले पाठकों के लिए, हमारे पास एक और पोस्ट है कि हमेशा हमेशा समाप्त होने वाली भाषाओं के लिए प्रोग्रामिंग भाषा क्यों नहीं हो सकती है।
राफेल

3
@ क्या मैं आपकी बात लेता हूं, लेकिन यह कहना कमोबेश समान नहीं है कि कोई वास्तविक प्रोग्रामिंग भाषा ट्यूरिंग-पूर्ण नहीं है? आखिरकार, कोई भी कार्यान्वयन आपके द्वारा उल्लिखित बाधाओं को चलाने वाला है। ऐसा लगता है कि काफी बड़ा हाथी कमरे में है, जबकि विचार है कि क्या ट्यूरिंग-पूरा नहीं होने से हारता है। क्या यह किसी अन्य भाषा से अधिक खोता है, उदाहरण के लिए? यदि आप अनबाउंड बाहरी स्टोरेज को रोकते हैं (उदाहरण के लिए, "कृपया अगली / पिछली डिस्क डालें" कहने के लिए रोक रहा है) तो कोई भी भाषा तुच्छ रूप से ट्यूरिंग-पूर्ण नहीं है, इसलिए उस मामले के बारे में कोई भी प्रश्न खाली नहीं है।
डेविड रिचरबी

3
@DavidRicherby मेरी टिप्पणियां (लेकिन मेरा जवाब नहीं) प्रोग्रामिंग भाषा सिद्धांत गीक मोड में हैं। यदि आप एसएमएल के औपचारिक विनिर्देश लेते हैं (उदाहरण के लिए), तो डिजाइन करना संभव है (लेकिन निश्चित रूप से भौतिक दुनिया में लागू नहीं) भाषा का एक कार्यान्वयन जो सभी कम्प्यूटेशनल कार्यक्रमों को अनुकरण कर सकता है। सी में ऐसा नहीं है, क्योंकि स्मृति की सुंदरता को भाषा में बनाया गया है ( sizeof(void*))। अपने जवाब में, मैं भाषाओं को एक आदर्श तरीके से मानता हूं, इसलिए SML या C को ट्यूरिंग-पूर्ण माना जाएगा।
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.