क्या नियमित भाषाएं ट्यूरिंग पूरी हो सकती हैं?


32

मैं इटा और जोत के बारे में पढ़ रहा था और इस खंड को भ्रामक पाया:

इओटा के विपरीत, जहां एक स्ट्रिंग के लिए सिंटैक्टिक पेड़ बाईं तरफ या दाईं ओर शाखा कर सकता है, जोट सिंटैक्स समान रूप से बाएं-शाखा है। नतीजतन, इओटा सख्ती से संदर्भ-मुक्त है, लेकिन जोत एक नियमित भाषा है।

मेरी समझ यह है कि Iota और Jot दोनों ट्यूरिंग पूरी कर रहे हैं। लेकिन जाहिर है, एक संदर्भ-मुक्त है, और दूसरा नियमित है! निश्चित रूप से नियमित भाषाएं पूरी नहीं हो सकती हैं?


3
ध्यान दें कि ट्यूरिंग मशीन का वर्णन करने वाली भाषा को नियमित रूप से एक सामान्य भाषा में लिखा जा सकता है, उदाहरण के लिए i = {0,1, -1}, b = {इनपुट का अंत} (i + bi + bi) + b (i +) का वर्णन करता है गैर-खाली इनपुट के बाद नियमों का एक गैर-खाली सेट। या, इसके बजाय, आप इसे इस तरह से व्याख्या कर सकते हैं यदि आपके पास एक दुभाषिया है, जो, जैसा कि उत्तर का उल्लेख है, भाषा के वर्ग के लिए एक अलग अवधारणा है।
घन 25

1
@ क्यूबिक: उस मामले के लिए, ट्यूरिंग मशीनों को ऐसे नंबर पर रखा जा सकता है कि हर नंबर बिल्कुल एक मशीन का प्रतिनिधित्व करता है (यानी वे गणनीय हैं), और उन संख्याओं को एकात्मक अंकन में व्यक्त किया जा सकता है। मैंने इस सामान का ठीक से अध्ययन नहीं किया है, इसलिए मुझे परिभाषाओं पर श्रम करना पड़ता है, लेकिन मुझे लगता 1*0है कि यह एक नियमित भाषा है;; फिर भी प्रोग्रामर या कंपाइलर-लेखक के लिए बहुत अनुकूल प्रोग्रामिंग भाषा नहीं है।
स्टीव जेसोप

जवाबों:


40

संक्षेप में, इसका उत्तर हां है।

लेकिन आप "भाषा" शब्द के दो पूरी तरह से असंबंधित अर्थों को मिला रहे हैं (हाँ, यह भ्रामक है):

  • तार का एक सेट। "संदर्भ-मुक्त भाषा" का अर्थ है "तार का एक सेट जिसे संदर्भ-मुक्त व्याकरण का उपयोग करके पहचाना जा सकता है"।
  • गणना करने का एक तरीका। "ट्यूरिंग-पूर्ण भाषा" का अर्थ है "कार्यक्रमों को निर्दिष्ट करने का एक तरीका जिसमें ट्यूरिंग मशीन को निर्दिष्ट किया जा सकता है"।

ध्यान दें कि आप "C ++ भाषा" के बारे में दो पूरी तरह से असंबंधित दृष्टिकोण से बात कर सकते हैं, "भाषा" शब्द के दो असंबंधित अर्थों का उपयोग कर सकते हैं:

  • C ++ स्ट्रिंग्स के एक सेट के रूप में है जो C ++ व्याकरण के अनुसार कानूनी है
  • C ++ प्रोग्राम को निर्दिष्ट करने के तरीके के रूप में।

इन दो दृष्टिकोणों से "C ++ भाषा" के लक्षण असंबंधित हैं।

इन अवधारणाओं को अलग करने में आपकी मदद करने के लिए और उदाहरण:

  • अभिव्यक्ति "[az] + @ [az]। [az]" परिमित ऑटोमेटा, यानी एक नियमित भाषा द्वारा पहचाने जाने वाले तार के एक सेट का वर्णन करता है। हालांकि, यह सिर्फ इतना है कि - स्ट्रिंग्स का एक सेट: कार्यक्रमों को निर्दिष्ट करने का एक तरीका नहीं है (जब तक कि आप प्रत्येक स्ट्रिंग को प्रोग्राम के रूप में व्याख्या करने का एक तरीका नहीं बताते हैं), इसलिए यह इस बारे में बात करने का कोई मतलब नहीं है कि क्या यह ट्यूरिंग- पूर्ण।
  • फ्लोचार्ट की भाषा कार्यक्रमों को निर्दिष्ट करने का एक तरीका है; फ्लोचार्ट्स के विशेष स्वाद के आधार पर, यह ट्यूरिंग-पूर्ण हो सकता है या नहीं भी हो सकता है। हालाँकि, फ्लोचार्ट स्ट्रिंग्स नहीं हैं, इसलिए यह फ्लोचार्ट्स के बारे में "भाषा में स्ट्रिंग्स का एक सेट" के रूप में बात करने के लिए बिल्कुल कोई मतलब नहीं है।

3
मैं (([a-z][0-9]*)*[A-Z][0-9]*([a-z][0-9]*)*->([a-zA-Z][0-9]*)*)*
जोड़ूंगा कि

2
{0,1}

10

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

वैसे, संदर्भ-मुक्त भाषाएं भी (शायद) एनपी-पूर्ण नहीं हैं, क्योंकि उनके पास एक बहुपद समय पार्सिंग एल्गोरिदम है।


9

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

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

अब आपके प्रश्न का उत्तर देने के लिए: हाँ, यह संभव है। उदाहरण के लिए, ट्यूरिंग मशीनों के किसी भी गोडेल नंबरिंग पर विचार करें ; आपको सभी प्राकृतिक संख्याओं की "प्रोग्रामिंग भाषा" मिलती है, प्रत्येक टीएम का प्रतिनिधित्व करती है। दी, यह प्रोग्राम करने के लिए एक अच्छी भाषा नहीं है, लेकिन यह निश्चित रूप से ट्यूरिंग-पूर्ण भाषा है जो नियमित है - तुच्छ, यहां तक ​​कि।


3
  1. एक प्रोग्रामिंग लैंग्वेज ट्यूरिंग-कम्प्लीट है यदि ट्यूरिंग मशीनों द्वारा कम्प्यूटेड हर फंक्शन को निर्दिष्ट करने के लिए यह पर्याप्त रूप से स्पष्ट है। यहां हम प्रोग्रामिंग भाषाओं में निर्दिष्ट भाषाओं की शक्ति पर चर्चा कर रहे हैं । उदाहरण के लिए पायथन में ट्यूरिंग मशीनों के लिए एक दुभाषिया लिखना मुश्किल नहीं है, इसलिए पायथन एक ट्यूरिंग-पूर्ण प्रोग्रामिंग भाषा है।

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

ध्यान दें कि प्रोग्रामिंग भाषा की वाक्य रचना की सरलता उस प्रोग्रामिंग भाषाओं में निर्दिष्ट कार्यक्रमों की कम्प्यूटेशनल शक्ति पर प्रतिबंध नहीं लगाती है।


1

इसका जवाब है हाँ। आप देखते हैं, जैसा कि स्वीकृत उत्तर बताता है, एक व्याकरण इसके अर्थ से स्वतंत्र है। चॉम्स्की के अपने शब्दों में:

मुझे लगता है कि हम यह निष्कर्ष निकालने के लिए मजबूर हैं कि एक व्याकरण स्वायत्त है और अर्थ से स्वतंत्र है ...

चॉम्स्की, सिंथेटिक संरचनाएं (1956)

यदि एक व्याकरण उन सभी चीजों का वर्णन करने के लिए पर्याप्त वाक्य का उत्पादन कर सकता है जो गणना की जा सकती हैं, तो हम मनमाने ढंग से इसके वाक्यों को कम्प्यूटेशनल अर्थ प्रदान कर सकते हैं - प्रत्येक चीज़ के लिए जो गणना की जा सकती है।

वास्तविक ठोस उदाहरण के लिए, लोकप्रिय भाषा whitespaceमें एक नियमित व्याकरण होता है और शायद x86 assembly languages(सत्यापन की भी आवश्यकता होती है)।


मुझे नहीं लगता है कि मार्ग का अर्थ यह है कि गो का व्याकरण औपचारिक अर्थों में एक नियमित भाषा है; मुझे लगता है कि इसका मतलब यह है कि व्याकरण अनियमित नहीं है , अर्थात सुसंगत है। यदि गो सिंटैक्स वास्तव में चॉम्स्की पदानुक्रम में एक नियमित भाषा थी, तो यह संतुलित, नेस्टेड कोष्ठक उत्पन्न करने में असमर्थ होगा।
tsleyson

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