भाषा सुविधाओं / संरचनाओं का न्यूनतम सेट क्या है जो इसे ट्यूरिंग-पूर्ण बनाता है?
भाषा सुविधाओं / संरचनाओं का न्यूनतम सेट क्या है जो इसे ट्यूरिंग-पूर्ण बनाता है?
जवाबों:
एक ट्यूरिंग tarpit गूढ़ प्रोग्रामिंग भाषा जो ट्यूरिंग-पूर्ण होने के लिए संभव के रूप में कुछ तत्वों का उपयोग करते समय प्रयास का एक प्रकार है। ब्रेनफक शायद सबसे अच्छा ज्ञात टारपीट है, लेकिन कई हैं।
Iota और जोत क्रमशः दो और तीन प्रतीकों वाली कार्यात्मक भाषाएं हैं, जो SK (I) कॉम्बीनेटर कैलकुलस पर आधारित हैं ।
OISC ( वन इंस्ट्रक्शन सेट कंप्यूटर ) एक प्रकार की अनिवार्यता को दर्शाता है जिसके लिए एक या अधिक तर्कों के केवल एक निर्देश की आवश्यकता होती है, आमतौर पर "घटाना और शाखा यदि शून्य से कम या बराबर", या "रिवर्स घटाना और यदि उधार हो तो छोड़ें"। X86 MMU पूर्व अनुदेश को लागू करता है और इस प्रकार ट्यूरिंग-पूर्ण होता है।
सामान्य तौर पर, ट्यूरिंग-पूर्ण होने के लिए अनिवार्य भाषा के लिए, इसकी आवश्यकता है:
सशर्त पुनरावृत्ति या सशर्त कूद का एक रूप (जैसे while
, if
+ goto
)
भंडारण के कुछ प्रकार पढ़ने और लिखने का एक तरीका (जैसे, चर, टेप)
एक लैम्ब्डा-पथरी- आधारित कार्यात्मक भाषा के लिए टीसी होने के लिए, इसकी आवश्यकता है:
तर्कों पर अमूर्त कार्यों की क्षमता (जैसे, लंबोदर अमूर्तन, उद्धरण)
कार्यों को तर्कों पर लागू करने की क्षमता (जैसे, कमी)
कंप्युटेशन को देखने के अन्य तरीके भी हैं, लेकिन ट्यूरिंग टारपीट्स के लिए ये सामान्य मॉडल हैं। ध्यान दें कि वास्तविक कंप्यूटर हैं नहीं सार्वभौमिक ट्यूरिंग मशीन क्योंकि वे असीम भंडारण की जरूरत नहीं है। कड़ाई से बोलते हुए, वे "बंधी हुई भंडारण मशीनें" हैं। यदि आप उनके साथ स्मृति को जोड़ते रहे, तो वे शक्ति में ट्यूरिंग मशीनों से संपर्क करेंगे। हालांकि, यहां तक कि बंधे हुए भंडारण मशीन और परिमित राज्य मशीनें गणना के लिए उपयोगी हैं; वे केवल सार्वभौमिक नहीं हैं ।
ट्यूरिंग-पूर्णता के लिए कड़ाई से बोलना, I / O की आवश्यकता नहीं है; टीसी केवल यह दावा करता है कि एक भाषा आपके इच्छित फ़ंक्शन की गणना कर सकती है , न कि यह आपको परिणाम दिखा सकती है। व्यवहार में, हर उपयोगी भाषा का दुनिया के साथ बातचीत करने का एक तरीका है।
अधिक व्यावहारिक दृष्टिकोण से: यदि आप ट्यूरिंग-पूर्ण भाषा में सभी कार्यक्रमों को अपनी भाषा में अनुवाद कर सकते हैं, तो (जहाँ तक मुझे पता है), आपकी भाषा ट्यूरिंग-पूर्ण होनी चाहिए। इसलिए, यदि आप यह जांचना चाहते हैं कि क्या आपके द्वारा डिज़ाइन की गई भाषा ट्यूरिंग-पूर्ण है, तो आप बस एक ब्रेनफ *** को YourLanguage संकलक को लिख सकते हैं और यह साबित कर सकते हैं कि यह सभी कानूनी बीएफ कार्यक्रमों को संकलित कर सकता है।
स्पष्ट करने के लिए, मेरा मतलब है कि YourLanguage के लिए एक दुभाषिया के अलावा, आप एक संकलक (किसी भी भाषा में) लिखते हैं जो कि किसी भी BF प्रोग्राम को YourLanguage (उसी शब्दार्थ को ध्यान में रखते हुए) को संकलित कर सकता है।
</sarcasm>
एक प्रणाली को केवल ट्यूरिंग पूर्ण माना जा सकता है अगर यह एक सार्वभौमिक ट्यूरिंग मशीन कुछ भी कर सकती है। चूँकि यूनिवर्सल ट्यूरिंग मशीन को किसी भी समय पर दिए गए कम्प्यूटेशनल फ़ंक्शन को हल करने में सक्षम कहा जाता है, ट्यूरिंग सिस्टम पूरी तरह से विस्तार से भी ऐसा कर सकता है।
यह देखने के लिए कि क्या कुछ ट्यूरिंग पूर्ण है, यह देखने के लिए कि क्या आप उसके अंदर ट्यूरिंग मशीन को लागू कर सकते हैं। दूसरे शब्दों में, यह देखने के लिए जांचें कि क्या यह निम्नलिखित अनुकरण कर सकता है:
ट्यूरिंग को पूर्ण माना जाने वाली प्रणाली के लिए ये सही न्यूनतम आवश्यकताएं हैं। न कुछ ज्यादा, न कुछ कम। अगर यह किसी भी फैशन में इनमें से किसी का अनुकरण नहीं कर सकता है, तो यह पूर्ण नहीं है। अन्य लोगों द्वारा प्रस्तावित तरीके केवल अंत तक का मतलब हैं क्योंकि कई ट्यूरिंग संपूर्ण सिस्टम हैं जिनमें वे विशेषताएं नहीं हैं।
ध्यान दें कि वास्तव में एक सही ट्यूरिंग सिस्टम बनाने का कोई ज्ञात तरीका नहीं है। इसका कारण यह है कि भौतिक स्थान के भीतर ट्यूरिंग मशीन के टेप की असीमता का अनुकरण करने का कोई ज्ञात तरीका नहीं है।
यदि आप इसके साथ कोई गणना कर सकते हैं, तो एक प्रोग्रामिंग भाषा पूर्ण हो रही है। ऐसी विशेषताओं का एक सेट नहीं है, जो किसी भाषा को पूर्ण बनाती हैं, इसलिए उत्तर में कहा जाता है कि आपको छोरों की आवश्यकता है या आपको चर की आवश्यकता है क्योंकि ऐसी भाषाएं गलत हैं जो न तो हैं, बल्कि पूरी तरह से ट्यूरिंग हैं।
एलन ट्यूरिंग ने सार्वभौमिक ट्यूरिंग मशीन बनाई और यदि आप अपनी भाषा पर चलने के लिए सार्वभौमिक मशीन पर काम करने के लिए डिज़ाइन किए गए किसी भी प्रोग्राम का अनुवाद कर सकते हैं, तो यह ट्यूरिंग पूर्ण भी है। यह अप्रत्यक्ष रूप से भी काम करता है इसलिए आप कह सकते हैं कि भाषा X पूरी तरह से ट्यूरिंग है अगर संपूर्ण भाषा Y को ट्यूर करने के सभी प्रोग्राम X के लिए अनुवादित किए जा सकते हैं क्योंकि सभी सार्वभौमिक ट्यूरिंग मशीन प्रोग्रामों को Y प्रोग्राम में अनुवादित किया जा सकता है।
समय जटिलता, अंतरिक्ष जटिलता, इनपुट / आउटपुट प्रारूप में आसान और किसी भी कार्यक्रम को लिखने में आसान समीकरण में शामिल नहीं है, इसलिए ऐसी मशीन सैद्धांतिक रूप से सभी गणना कर सकती है यदि गणना बिजली की हानि या पृथ्वी को सूर्य द्वारा निगलने से रोक नहीं है।
आमतौर पर ट्यूरिंग की पूर्णता साबित करने के लिए वे किसी भी व्यक्ति के लिए एक टेंपरेचर साबित करते हैं, जो पूरी तरह से ट्यूरिंग भाषा साबित होता है, लेकिन इसके लिए आपको इनपुट और आउटपुट के साधनों की आवश्यकता होती है, दो चीजें जो पूरी तरह से ट्यूरिंग होने के लिए किसी भाषा की आवश्यकता नहीं होती हैं। यह पर्याप्त है कि आपका कार्यक्रम स्टार्टअप पर स्थिति बदल सकता है और कार्यक्रम के रुकने के बाद आप मेमोरी का निरीक्षण कर सकते हैं।
एक सफल भाषा बनाने के लिए इसे पूर्णता को प्राप्त करने से अधिक की आवश्यकता होती है और यह टारिंग टारिट्स के लिए भी सही है। मुझे नहीं लगता कि ब्रेनफ़क बिना ,
और लोकप्रिय हुआ होगा .
।
आप यह नहीं बता सकते हैं कि यह अनंत रूप से लूप करेगा या बंद हो जाएगा।
स्पष्टीकरण: कुछ इनपुट को देखते हुए, हर मामले में (किसी अन्य ट्यूरिंग मशीन का उपयोग करके) यह बताना असंभव है कि क्या बात अनन्त रूप से लूप में जा रही है या अंत में रुकने वाली है, सिवाय इसे चलाने के (जो आपको जवाब देती है कि क्या यह रुकता है, लेकिन नहीं अगर यह छोरों!)।
इसका मतलब है कि आपको किसी तरह से संभावित असीमित मात्रा में डेटा स्टोर करने में सक्षम होना चाहिए - अनंत टेप के बराबर होना चाहिए, चाहे कोई भी दोषी हो! (अन्यथा केवल राज्यों की एक सीमित संख्या है और फिर आप जांच सकते हैं कि क्या आप उस राज्य के माध्यम से पहले और अंत में रुक गए हैं)। आम तौर पर, ट्यूरिंग मशीन कुछ नियंत्रणीय साधनों द्वारा अपने राज्य के आकार को बढ़ा या छोटा कर सकती हैं।
चूंकि ट्यूरिंग की ऑरिजनल यूनिवर्सल ट्यूरिंग मशीन में एक बेकार चलन की समस्या है, इसलिए आपकी खुद की ट्यूरिंग पूरी मशीन में भी एक अनचाहे पड़ाव की समस्या होनी चाहिए।
ट्यूरिंग पूरा सिस्टम किसी भी अन्य ट्यूरिंग सिस्टम का अनुकरण कर सकता है, इसलिए यदि आप अपने सिस्टम में कुछ प्रसिद्ध ट्यूरिंग सिस्टम के लिए एमुलेटर बना सकते हैं, तो यह साबित होता है कि आपका सिस्टम भी ट्यूरिंग पूरा कर रहा है।
उदाहरण के लिए, मान लें कि आप यह साबित करना चाहते हैं कि सांप और सीढ़ी ट्यूरिंग पूर्ण है, एक बोर्ड को असीम रूप से दोहराया ग्रिड पैटर्न (शीर्ष और बाईं ओर एक अलग संस्करण के साथ) दिया गया है। यह जानते हुए कि 2-काउंटर मिन्स्की मशीन ट्यूरिंग पूर्ण है (जिसमें 2 असीमित काउंटर हैं और एक परिमित संख्या से 1 राज्य है), आप एक समतुल्य बोर्ड का निर्माण कर सकते हैं जहां ग्रिड पर X और Y स्थिति 2 काउंटरों का वर्तमान मूल्य है और वर्तमान पथ वर्तमान स्थिति है। बैंग! आपने बस यह साबित कर दिया कि सांप और सीढ़ी पूरी तरह से ट्यूरिंग हैं।
एक आवश्यक शर्त एक लूप है जिसमें अधिकतम पुनरावृत्ति गणना है जो पुनरावृत्ति के आगे, या पुनरावृत्ति से निर्धारित नहीं होती है जहां अधिकतम पुनरावृत्ति की गहराई आगे निर्धारित नहीं की जाती है। एक उदाहरण के रूप में ... के लिए ... लूप्स के रूप में आप उन्हें कई नई भाषाओं में पाते हैं भाषा को पूर्ण बनाने के लिए पर्याप्त नहीं हैं (लेकिन उनके पास अन्य साधन होंगे)। ध्यान दें कि इसका मतलब सीमित संख्या में पुनरावृत्तियों या सीमित पुनरावृत्ति की गहराई नहीं है, लेकिन अधिकतम पुनरावृत्तियों और पुनरावृत्ति की गहराई की गणना आगे की जानी चाहिए।
उदाहरण के लिए, एकरमन फ़ंक्शन इन विशेषताओं के बिना किसी भाषा में गणना नहीं की जा सकती। दूसरी ओर, इन सुविधाओं की आवश्यकता के बिना बहुत अधिक जटिल और अत्यधिक उपयोगी सॉफ़्टवेयर लिखे जा सकते हैं।
दूसरी ओर, प्रत्येक पुनरावृत्ति गणना और आगे की गणना की जाने वाली प्रत्येक पुनरावृत्ति गहराई के साथ, न केवल यह तय किया जा सकता है कि कोई कार्यक्रम रुक जाएगा या नहीं, बल्कि यह रुक जाएगा ।
मुझे पता है कि यह औपचारिक रूप से सही उत्तर नहीं है, लेकिन एक बार जब आप 'न्यूनतम' को 'ट्यूरिंग-पूर्ण' से निकाल लेते हैं और 'व्यावहारिक' वापस रख देते हैं, जहां यह होता है, तो आप सबसे महत्वपूर्ण विशेषताएं देखेंगे जो एक प्रोग्रामिंग भाषा को अलग करती है मार्कअप भाषा हैं
आगे आओ
इन कथनों का परीक्षण करने के लिए, मार्कअप भाषा के साथ शुरुआत करें, बोलें, HTML। हम एक HTML + केवल चर के साथ, या केवल सशर्त (MS ने सशर्त टिप्पणियों के साथ), या कुछ प्रकार के लूप निर्माण का आविष्कार कर सकते हैं (जो कि सशर्त की अनुपस्थिति में संभवतः कुछ के रूप में समाप्त हो जाएगा <repeat n='4'>...</repeat>
)। इनमें से कोई भी करना HTML + को सादे HTML की तुलना में अधिक शक्तिशाली (?) बना देगा, लेकिन यह अभी भी प्रोग्रामिंग भाषा की तुलना में अधिक मार्कअप होगा; प्रत्येक नई सुविधा के साथ, आप इसे एक घोषणापत्र के कम और एक अनिवार्य भाषा के अधिक बनाते हैं।
तर्क और प्रोग्रामिंग में अतिसूक्ष्मता की खोज सुनिश्चित करना महत्वपूर्ण और दिलचस्प है, लेकिन अगर मुझे n00bies को सिखाना था युवा या बूढ़े 'प्रोग्रामिंग क्या है' और 'प्रोग्राम कैसे सीखें', तो मैं शायद ही पूरी चौड़ाई और चौड़ाई के साथ शुरू करूंगा ट्यूरिंग पूर्णता की सैद्धांतिक नींव। खाना पकाने और प्रोग्रामिंग का पूरा सार सही क्रम में सामान तैयार कर रहा है, तैयार होने तक दोहराता है, जैसा कि आपकी माँ ने किया था। इसके बारे में यह मेरे लिए है।
फिर से, मैंने अपना CS कभी पूरा नहीं किया।