क्या एक प्रोग्रामिंग भाषा के लिए न्यूनतम मानदंड पूर्ण हो रहे हैं?


55

क्या प्रोग्रामिंग भाषा में प्रोग्रामिंग भाषा का एक सेट मौजूद है ताकि ट्यूरिंग को पूर्ण माना जा सके?

विकिपीडिया से जो मैं बता सकता हूं , उससे भाषा को पुनरावृत्ति का समर्थन करने की आवश्यकता है, या प्रतीत होता है, बिना रुके दौड़ने में सक्षम होना चाहिए। क्या यह सब वहाँ है?


6
शायद आपके सवाल से पूछना चाहिए "क्या प्रोग्रामिंग कंस्ट्रक्शंस का एक न्यूनतम सेट है ...?", क्योंकि जैसा कि यह उत्तर दिया जाता है कि उत्तर "सभी कम्प्यूटेशनल हैं।"
डेव क्लार्क


@DaveClarke, धन्यवाद, मैंने इसे अपडेट किया है। मुझे लगता है कि आपकी टिप्पणी कुछ हद तक सवाल का जवाब देती है, हालांकि मैं यह मानता हूं कि मेरी भाषा खराब है। मेरे कहने का मतलब है कि कुछ ऑपरेशन हैं या नहीं, अगर कोई भाषा गणना कर सकती है, तो यह समकक्ष होगा।
खानजोर

जवाबों:


45

मैं हमेशा यद्यपि उस _- मर्सक कार्यों ने इसे भुनाया । यहाँ वही है जो गणना योग्य कार्यों के पूरे सेट को परिभाषित करता है; यह सम्मान से संबंधित कार्यों का सबसे छोटा सेट है। के खिलाफ बंद:μ

  1. लगातार फ़ंक्शन0
  2. उत्तराधिकारी समारोह
  3. मापदंडों का चयन
  4. क्रिया रचना
  5. आदिम पुनरावृत्ति
  6. The -operator (सबसे छोटी ऐसा देखें ...)एक्सμx

विवरण के लिए लिंक से ऊपर की जाँच करें; आप देखते हैं कि यह एक बहुत ही कॉम्पैक्ट प्रोग्रामिंग भाषा के लिए बनाता है। यह भी कार्यक्रम में भयानक है - कोई मुफ्त भोजन नहीं। यदि आप उनमें से किसी को भी गिराते हैं, तो आप पूरी शक्ति खो देंगे, इसलिए यह स्वयंसिद्ध का न्यूनतम सेट है।

आप उन वस्तुतः WHile कार्यक्रमों के लिए मूल वाक्यविन्यास तत्वों में अनुवाद कर सकते हैं , अर्थात्

  1. अटल 0
  2. incrementation _ + 1
  3. चर पहुँच x
  4. कार्यक्रम / बयान संघ _; _
  5. उलटी गिनती लूप for ( x to 0 ) do _ end
  6. जबकि लूप while ( x != 0 ) do _ end

1
मुझे लगता है कि यह स्पष्ट है कि आप भाषा में 5 वां नियम नहीं छोड़ सकते । चूँकि while6 में लूप निरंतर शून्य की तुलना में है, चर केवल नियम 2 से बढ़ सकते हैं और नियम (1) से शुरू होने के लिए कोई नकारात्मक स्थिरांक नहीं हैं, while6 में लूप या तो दर्ज नहीं है (x = 0) या यह अनंत है ( x> 0, और लूप बॉडी इसे कम नहीं कर सकती)।
एमएसएलेटर्स

1
@ दलाल मुझे लगता है कि आप सही हैं; मुझे लगता है कि अनुकरण के लिए, हमें इसकी आवश्यकता है _ - 1और मैं इसे लागू करने के तरीके के बारे में नहीं सोच सकता for। उस पकड़ने के लिए धन्यवाद! (क्या "बेहतर" है - सहित _ - 1या forहम्म?।)
राफेल

20

क्या कम्प्यूटिंग का एक सेट मौजूद है जिसे ट्यूरिंग कंप्लीट माने जाने के लिए प्रोग्रामिंग लैंग्वेज में परफॉर्म करने की जरूरत है?

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

विकिपीडिया से जो मैं बता सकता हूं, उससे भाषा को पुनरावृत्ति का समर्थन करने की आवश्यकता है, या प्रतीत होता है, बिना रुके दौड़ने में सक्षम होना चाहिए। क्या यह सब वहाँ है?

उदाहरण के लिए, एक ऐसी भाषा जहां केवल अनुमत ऑपरेशन है पुनरावृत्ति (यानी केवल संभावित फ़ंक्शन जो आप लिख सकते हैं f(x) = f(x), वह है , ट्यूरिंग पूर्ण नहीं है क्योंकि आप इसमें लिख सकते हैं वे प्रोग्राम हैं जो कभी समाप्त नहीं होते हैं। जैसा कि मैंने पहले कहा था, ट्यूरिंग पूरी भाषा है। किसी भी गणना को लागू करने में सक्षम होने की आवश्यकता है जो ट्यूरिंग मशीन द्वारा किया जा सकता है। इसलिए स्पष्ट रूप से यह पर्याप्त नहीं है।

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


इस बात के लिए कि क्या आवश्यक और पर्याप्त परिचालनों का एक न्यूनतम सेट है, जैसे कि इन कार्यों का समर्थन करने वाली कोई भी भाषा ट्यूरिंग पूर्ण है और कोई भी भाषा जो नहीं है: नहीं, वहाँ नहीं है (जब तक कि आप "ऑपरेशन" को परिभाषित नहीं करते हैं , कि यह व्यर्थ हो जाता है):

उदाहरण के लिए जैसा कि मैंने पहले ही कहा, ट्यूरिंग पूर्ण भाषाएं हैं जो पुनरावर्ती कार्यों (या किसी भी फ़ंक्शन) का समर्थन नहीं करती हैं। वे अभी भी ट्यूरिंग पूरा हो सकता है अगर उनके पास एक gotoबयान या whileलूप हो (और डेटा की मनमानी मात्रा को संग्रहीत करने का एक तरीका)। हालाँकि पुनरावर्ती कार्यों वाली भाषा को न तो ट्यूरिंग पूर्ण होने की आवश्यकता है और न whileही goto। तो gotoयह आवश्यक पर्याप्त संचालन के सेट में नहीं होगा, लेकिन ऐसी भाषाएं हैं जो अब पूरी तरह से ट्यूरिंग नहीं हैं यदि आप निकालते हैं goto। इस प्रकार ऐसा कोई सेट नहीं है।


एकमात्र हिस्सा जो मैं निश्चित नहीं हूं, वह आवश्यक संचालन के न्यूनतम सेट पर आपका उत्तर है। आप संचालन संरचनाओं की अपनी परिभाषा को सीमित करने के लिए लगते हैं जो कि पूछे जाने की तुलना में बहुत अधिक संकीर्ण गुंजाइश है, और उन्हें "इतना अस्पष्ट" नहीं परिभाषित करने की अपनी आवश्यकता से परे है, कि [वे] अर्थहीन हो जाते हैं "।
यहोशू ड्रेक 20

@JoshuaDrake मुझे यकीन नहीं है कि आपका क्या मतलब है। मैं संरचनाओं को नियंत्रित करने के लिए संचालन को सीमित नहीं कर रहा हूं। यह सिर्फ इतना है कि मैं अपने काउंटर उदाहरण में संरचनाओं को नियंत्रित नहीं करने वाले किसी भी ऑपरेशन के बारे में बात नहीं करता हूं क्योंकि वे उदाहरण के लिए प्रासंगिक नहीं हैं। वास्तव में मैं "डेटा की मनमानी मात्रा में स्टोर करने का एक तरीका" का उल्लेख करता हूं - यह शायद ही एक नियंत्रण संरचना है।
sepp2k

आप यह कहते हैं कि कुछ भाषाएं ट्यूरिंग पूर्णता का समर्थन gotoकरती हैं, लेकिन कुछ ऐसा नहीं करते हैं, ऐसा प्रतीत होता है कि दावा करते हैं क्योंकि कुछ इसका उपयोग करते हैं और कुछ ऐसा नहीं करते हैं gotoतो ट्यूरिंग पूर्णता के लिए आवश्यक संचालन के एक सेट का हिस्सा नहीं हो सकता है। मेरा कहना है कि gotoएक विशेष रूप से अधिक सामान्य ऑपरेशन को लागू करने का एक सिंटैक्टिकल तरीका है, जैसे कि एक छलांग। इसलिए मेरा मानना ​​है कि यदि आप केवल विशिष्ट नियंत्रण संरचनाओं से दूर हो गए हैं, तो आप संचालन के एक सेट के करीब जाएंगे जो कम से कम ट्यूरिंग पूर्णता की ओर इशारा करेगा।
जोशुआ ड्रेक

@JoshuaDrake मुझे नहीं लगता कि गोटो के बजाय "कूद" का उपयोग हमें उस बिंदु पर ले जाता है जहां हम ऑपरेशन के पर्याप्त और आवश्यक सेट को परिभाषित कर सकते हैं। यह शायद सच है कि हर भाषा को किसी प्रकार के जंप ऑपरेशन की आवश्यकता होगी (और यदि यह केवल फ़ंक्शन कॉल है), लेकिन मुझे नहीं लगता कि आप इसे पर्याप्त बनाने के लिए आगे के संचालन के साथ आ पाएंगे। उदाहरण के लिए लैम्ब्डा कैलकुलस के दो ऑपरेशन होते हैं: एप्लिकेशन (यानी हमारा जंप ऑपरेशन) और एब्स्ट्रैक्शन (यानी फंक्शन बनाना) ...
sepp2k

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

14

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

यह एक लक्षण वर्णन की ओर जाता है: एक भाषा ट्यूरिंग पूर्ण है यदि और केवल यह स्मृति में पूर्णांकों को लाने और संग्रहीत करने के संचालन का अनुकरण करने में सक्षम है और उन पर "शून्य और ऑपरेशन" यदि शून्य हो तो "प्रदर्शन करें"।


13

यह आपके प्रश्न का सामान्य उत्तर नहीं है, लेकिन संरचित प्रोग्रामिंग प्रमेय द्वारा , सभी आवश्यक है कि चयन करने की क्षमता है (उदाहरण, ifC / C ++ में) और पुनरावृत्ति (जैसे, whileC / C ++ में)। संपादित करें: जैसा कि डेव क्लार्क ने टिप्पणियों में बताया है, संरचित प्रोग्रामिंग प्रमेय को भी अनुक्रम की आवश्यकता होती है। मैंने शुरुआत में इसे सूचीबद्ध नहीं किया था क्योंकि मैंने लेने के लिए पाठक को समझा होगा कि अन्य निर्देशों के बुनियादी ब्लॉक, जैसे कि बाद में पढ़ने और मेमोरी स्टोर से लिखने के लिए आवंटित किए गए, आदि भी आवश्यक थे)। जाहिर है, स्पष्ट होना बेहतर है; आपको इन चीजों को करने में सक्षम होना चाहिए।

चूंकि इन दोनों को सशर्त कूद अनुदेश (जैसे, JNZx86 में) का उपयोग करके लागू किया जा सकता है , जो कि ट्यूरिंग-तुल्यता के लिए भी पर्याप्त है।

ध्यान दें कि अन्य चीजों की आवश्यकता होती है, अर्थात, किसी प्रकार के बाहरी मेमोरी स्टोर में प्रतीकों की एक अनबिके संख्या (जैसे, बिट्स ... 0 या 1) लिखने की क्षमता। इस अर्थ में, वास्तविक कंप्यूटर ट्यूरिंग समतुल्य नहीं हैं, क्योंकि उनमें से किसी में भी अनंत मात्रा में भंडारण नहीं है। ट्यूरिंग मॉडल अभी भी उपयोगी है, हालाँकि, मेमोरी की मात्रा आम तौर पर बहुत बड़ी है, और किसी भी समस्या का वास्तविक कंप्यूटर हल करने के बावजूद एक नियत परिमित ऑटोमोटन द्वारा हल किया जा सकता है, गणना के उस मॉडल का उपयोग करना विशेष रूप से उपयोगी नहीं है (क्योंकि राज्यों की संख्या बहुत बड़ी होगी)।

ध्यान दें कि यह जरूरी नहीं कि sepp2k के उत्तर के साथ है; यह एक ही प्रश्न के बारे में सोचने का एक अलग तरीका है।

संपादित करें:

ध्यान दें कि आपको वास्तव में ifऔर whileC / C ++ दोनों की आवश्यकता नहीं है। आप निम्नानुसार अनुकरण ifकर सकते whileहैं:

bool C;
// some code that sets C
if(C) { /* some other code /* }
// rest of the program

निम्नलिखित कोड हमेशा समतुल्य होता है:

bool C;
// some code that sets C
bool C2 = C;
while(C2) { /* some other code /* C2 = false; }
// rest of the program

ठीक है ... यदि आप सावधान रहें, तो निर्माण कार्य और संभव होना चाहिए। ध्यान दें कि यदि आपके पास पुनरावर्ती कार्य हैं, तो आपको अंततः चयन की भी आवश्यकता है; चूंकि चयन के बिना पुनरावर्ती कार्य वास्तव में आधार मामलों को लागू नहीं कर सकते हैं, इसलिए किसी भी पुनरावर्ती कार्य के परिणामस्वरूप अनंत पुनरावृत्ति होगी।

संपादित करें:

इसके अलावा, अपने प्रश्न के बारे में कि क्या ट्यूरिंग तुल्यता के लिए पर्याप्त नहीं है एक कार्यक्रम लिखने की क्षमता, जवाब नहीं है; यह आवश्यक है, लेकिन पर्याप्त नहीं है। हम एक भाषा में लिखे गए कार्यक्रमों के लिए रुकने की समस्या को हल कर सकते हैं जो उन कार्यक्रमों को व्यक्त नहीं कर सकते हैं जो रुकने में विफल रहते हैं; सभी उदाहरणों के लिए उत्तर "कार्यक्रम रुक जाता है" है। हालाँकि, हम एक ऐसी भाषा को परिभाषित कर सकते हैं जहाँ एकमात्र निर्देश मशीन को एक अनंत लूप में प्रवेश करने का कारण बनता है ... ऐसी भाषा ट्यूरिंग-समतुल्य नहीं है।


13

कॉम्बिनेटर और जहां, और किसी भी (बंद) लैम्ब्डा शब्द को व्यक्त करने के लिए पर्याप्त है, इसलिए कोई भी कम्प्यूटेशनल फ़ंक्शन। विवरण के लिए इस विकिपीडिया पृष्ठ को देखें।K ( S x y z ) = ( x z ( y z ) ) ( K x y ) = xSK(S x y z)=(x z (y z))(K x y)=x

वास्तव में, लैम्ब्डा शब्द सभी लैम्ब्डा शब्दों को व्यक्त करने के लिए एक पर्याप्त आधार है। बाद में उसी विकिपीडिया पृष्ठ में देखें ।X=λx.((x S) K)


5

भाषा निर्माण विनिमेय हैं

मूल रूप से एक प्रोग्रामिंग भाषा द्वारा प्रदान किए जाने वाले निर्माणों के बारे में कोई निर्धारित न्यूनतम मानदंड नहीं है । यदि यह कुछ अजीब निर्माण प्रदान करता है जो किसी तरह ट्यूरिंग-पूर्ण प्रणाली को व्यक्त करने के लिए जटिल हो सकते हैं, तो जाहिर है कि वे निर्माण किसी भी अन्य के समान "उपयुक्त" हैं।

यह साबित करने के लिए - एक भाषा जो केवल "घटाव और शाखा प्रदान करती है यदि शून्य" ऑपरेशन पूरा हो रहा है; ट्यूरिंग पूर्ण भाषाएं मौजूद हैं जो एक अलग "सब्स्ट्रक्ट और शाखा प्रदान नहीं करती हैं यदि शून्य" निर्माण, एर्गो कोई निर्माण नहीं है या निर्माण का एक सेट है जो अनिवार्य है।

किसी भी टीपी-पूर्ण भाषा के निर्माण के प्रभावों का अनुकरण किसी अन्य टीपी-पूर्ण भाषा के निर्माण द्वारा किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.