Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में L = {an bm a(n+m) - n,m≥1} के लिए ट्यूरिंग मशीन का निर्माण


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

एक TM को औपचारिक रूप से 7-टपल (Q, X, Σ, δ, q0, B, F) के रूप में वर्णित किया जा सकता है जहां:

  • Q अवस्थाओं का एक परिमित समुच्चय है
  • X टेप वर्णमाला है
  • Σ इनपुट वर्णमाला है
  • δ एक संक्रमण फ़ंक्शन है; δ: Q × X → Q × X × {लेफ्ट_शिफ्ट, राइट_शिफ्ट}।
  • q0 प्रारंभिक अवस्था है
  • B ब्लैंक सिंबल है
  • F अंतिम अवस्थाओं का समुच्चय है

हमारा लक्ष्य एक ट्यूरिंग मशीन TM का निर्माण करना है जो भाषा को स्वीकार करती है

L = an bm a(n+m) जहां n,m ≥ 1

उन शब्दों के उदाहरण लें जिन्हें TM स्वीकार कर सकता है,

  • abaa, n=1,m=1
  • aabaaa, n=2,m=1
  • abbaaa, n=1,m=2
  • aaabaaaa, n=3,m=1

यानी n बार a फिर m बार b फिर n+m बार a फिर से। n,m ≥ 1

a की न्यूनतम संख्या हमेशा 3 होगी और b की 1। जब n=m=1 दोनों हों।

दृष्टिकोण नीचे संक्षेपित है:

मशीन पहले n संख्या के a और फिर m संख्या के b को स्वीकार करती है। फिर जैसे-जैसे अधिक a आते हैं, यह पिछले इनपुट b और a को हटाना शुरू कर देती है। अंत में जब कोई नया a नहीं आ रहा होता और हेड पहले इनपुट कैरेक्टर तक पहुंच जाता है, तो इसका मतलब है कि सभी कैरेक्टर सही ढंग से प्रोसेस हो गए हैं। आइए इनपुट स्ट्रिंग के लिए चरण-दर-चरण अनुसरण करें:

स्टेट q0 से संक्रमण:

  • δ(q0, a) → (q1, x, R)। स्टेट q0 पर यदि पढ़ा गया कैरेक्टर a है तो स्टेट q1 पर जाएं, इसे x बनाएं और स्ट्रिंग में अगले कैरेक्टर को इंगित करने के लिए दाएं जाएं।
  • δ(q0, b) → (q3, x, R)। स्टेट q0 पर यदि पढ़ा गया कैरेक्टर b है तो स्टेट q3 पर जाएं, इसे x बनाएं और स्ट्रिंग में अगले कैरेक्टर को इंगित करने के लिए दाएं जाएं।

यहां x पहले कैरेक्टर को दर्शाने के लिए उपयोग किया जाता है।

स्टेट q1 से संक्रमण:

  • δ(q1, a) → (q1, a, R)। स्टेट q1 पर यदि पढ़ा गया कैरेक्टर a है तो q1 पर रहें, और स्ट्रिंग में अगले कैरेक्टर को इंगित करने के लिए दाएं जाएं।
  • δ(q1, b) → (q2, b, R)। स्टेट q1 पर यदि पढ़ा गया कैरेक्टर b है तो q1 पर रहें, और स्ट्रिंग में अगले कैरेक्टर को इंगित करने के लिए दाएं जाएं।

स्टेट q2 से संक्रमण:

  • δ(q2, b) → (q2, b, R)। स्टेट q2 पर यदि पढ़ा गया कैरेक्टर b है तो q2 पर रहें, और स्ट्रिंग में अगले कैरेक्टर को इंगित करने के लिए दाएं जाएं।
  • δ(q2, z) → (q2, z, R)। स्टेट q2 पर यदि पढ़ा गया कैरेक्टर z है तो q2 पर रहें, और स्ट्रिंग में अगले कैरेक्टर को इंगित करने के लिए दाएं जाएं।
  • δ(q2, a) → (q3, z, L)। स्टेट q2 पर यदि पढ़ा गया कैरेक्टर a है, तो इसे z बनाएं फिर स्टेट q3 पर जाएं, और स्ट्रिंग में पिछले कैरेक्टर को इंगित करने के लिए बाएं जाएं।

स्टेट q3 से संक्रमण:

  • δ(q3, z) → (q3, z, L)। स्टेट q3 पर यदि पढ़ा गया कैरेक्टर z है तो q3 पर रहें, और स्ट्रिंग में पिछले कैरेक्टर को इंगित करने के लिए बाएं जाएं।
  • δ(q3, b) → (q2, z, R)। स्टेट q2 पर यदि पढ़ा गया कैरेक्टर b है तो इसे z बनाएं और स्टेट q2 पर जाएं, और स्ट्रिंग में अगले कैरेक्टर को इंगित करने के लिए दाएं जाएं। सभी b को प्रतिस्थापित करें।
  • δ(q3, a) → (q2, z, R)। स्टेट q2 पर यदि पढ़ा गया कैरेक्टर a है तो इसे z बनाएं और स्टेट q3 पर जाएं, और स्ट्रिंग में अगले कैरेक्टर को इंगित करने के लिए दाएं जाएं। सभी a को प्रतिस्थापित करें।
  • δ(q3, x) → (q4, z, R)। स्टेट q2 पर यदि पढ़ा गया कैरेक्टर x है तो इसे z बनाएं फिर स्टेट q3 पर जाएं, और स्ट्रिंग में अगले कैरेक्टर को इंगित करने के लिए दाएं जाएं। पहला सिंबल पहुंच गया है।

स्टेट q4 से संक्रमण:

  • δ(q4, z) → (q4, z, R)। स्टेट q4 पर यदि पढ़ा गया कैरेक्टर z है तो q4 पर रहें, और स्ट्रिंग में अगले कैरेक्टर को इंगित करने के लिए दाएं जाएं। सभी कैरेक्टर अब z हैं।
  • δ(q4, $) → (qf, $, R)। स्टेट q4 पर यदि कोई कैरेक्टर नहीं बचा, अंत पहुंच गया। अंतिम स्टेट qf पर जाएं। जिसका मतलब है स्ट्रिंग स्वीकार कर ली गई।

आरेख ट्यूरिंग मशीन दिखाता है:

C++ में L = {an bm a(n+m) - n,m≥1} के लिए ट्यूरिंग मशीन का निर्माण

इनपुट

aabaaa q0: aabaaa → q1: xabaaa → q1: xabaaa → q2: xabaaa → q3: xabzaa → q2: xazzaa q2: xazzaa → q3: xazzza → q3: xazzza → q3: xazzza → q2: xzzzzza → q2: xzzzzza q2: xzzzzza → q2: xzzzzza → q2: xzzzzza → q2: xzzzzzz → q3: xzzzzzz...... q3: xzzzzzz → q3: xzzzzzz → q4: zzzzzzz → q4: zzzzzzz......q4: xzzzzzz$ → qf: xzzzzzz$

qf पर पहुंचा मतलब aabaaa स्वीकार कर लिया गया


  1. L = {aibjck | i j k; k ≥ 1} के लिए ट्यूरिंग मशीन का निर्माण L = {aibjck | i>j>k; k ≥ 1} के लिए ट्यूरिंग मशीन का निर्माण

    k; k ≥ 1} के लिए ट्यूरिंग मशीन कैसे बनाएं। तो यह एक प्रकार की भाषा दर्शाता है जहां हम केवल तीन वर्ण a, b और c का उपयोग करेंगे। w एक स्ट्रिंग है। तो यदि w = aaaaaabbbbccc, तो ट्यूरिंग मशीन इसे स्वीकार करेगी। |A|, तो यह स्वीकार नहीं की जाएगी, अन्यथा यह स्वीकार की जाएगी। स्टेट ट्रांजिशन डायग्राम

  1. L = {aibjck | i j k; i ≥ 1} के लिए ट्यूरिंग मशीन का निर्माण L = {aibjck | i<j<k; i ≥ 1} के लिए ट्यूरिंग मशीन का निर्माण

    यहां हम देखेंगे कि भाषा L = {AiBjCk | i < j < k; i ≥ 1} के लिए ट्यूरिंग मशीन कैसे बनाएं। तो यह एक प्रकार की भाषा दर्शाता है जहां हम केवल तीन वर्ण A, B और C का उपयोग करेंगे। w एक स्ट्रिंग है। तो यदि w = AABBBBCCCCC, तो ट्यूरिंग मशीन इसे स्वीकार करेगी। |Second|, तो यह स्वीकार किया जाएगा, अन्यथा स्वी

  1. L = {aibjck | i*j = k; i, j, k ≥ 1} के लिए ट्यूरिंग मशीन का निर्माण L = {aibjck | i*j = k; i, j, k ≥ 1} के लिए ट्यूरिंग मशीन का निर्माण

    यहां हम देखेंगे कि भाषा L = {AiBjCk | i * j = k; i, j, k ≥ 1} के लिए ट्यूरिंग मशीन कैसे बनाएं। तो यह एक प्रकार की भाषा दर्शाता है जहां हम केवल तीन वर्ण A, B और C का उपयोग करेंगे। w एक स्ट्रिंग है। तो यदि w = AABBBBCCCCCCCC, तो ट्यूरिंग मशीन इसे स्वीकार करेगी। इसे हल करने के लिए, हम इस दृष्टिकोण का