【问题标题】:Turing machine for language L={a^m b^n a^m b^n ∣ m,n≥0}语言图灵机 L={a^m b^n a^m b^n ∣ m,n≥0}
【发布时间】:2019-11-10 21:57:12
【问题描述】:

我无法为语言 L={a^m b^n a^m b^n ∣ m,n≥0} 制作图灵机

到目前为止我的想法是:

如果我们以空白开头,则字符串为空,它应该接受,如果不是,则开始阅读 as,我认为用 X 标记 a,用 Y 标记 b 就可以了

【问题讨论】:

    标签: automata turing-machines


    【解决方案1】:

    为此设计 TM 的高级策略如下:

    1. 检查您是否正在查看格式为 a^2k 或 b^2k 的字符串(包括空字符串)。在任何这些情况下,停止接受。否则,请继续执行第 2 步。
    2. 将一对a 分别从第一部分和第三部分中删除,直到其中一个部分用完a。如果一个用完而另一个仍然有a,则停止拒绝。否则,请继续执行第 3 步。
    3. 划掉一对b,分别来自第二和第四部分,直到其中一个部分用完b。如果一个用完而另一个仍然有b,则停止拒绝。否则,停止接受。

    【讨论】:

      【解决方案2】:

      本题有4种情况:

      1. 可以立即接受空字符串。
      2. 列表仅包含 a,因此如果它们的总数是偶数,我们接受该字符串。
      3. 如果输入仅包含 b,则类似于第 2 点。
      4. 输入是 a 和 b 的组合。

      我将第一组a标记为X,第二组a标记为Z,第一组b标记为U,第二组b标记为V。

      设计的图灵机是:

      这里{q0,q10}处理第一种情况,{q0, q1, q11, q12, q13, q14}处理第二种情况,{q0, q4, q15, q16, q17, q18}处理第三种情况,{q0, q1, q2, q3, q4, q5, q6, q7, q8, q9}处理最后一种情况。

      我也为这个图灵机设计了相应的python代码。

      #function to perform action of states
      def action(inp, rep, move):
          global tapehead
          if tape[tapehead] == inp:
              tape[tapehead] = rep
              if move == 'L':
                  tapehead -= 1
              else:
                  tapehead += 1
              return True
          return False
      
      tape = ['B']*50 
      string = input("Enter String: ")
      i = 5
      tapehead = 5
      for s in string: #loop to place string in tape
          tape[i] = s
          i += 1
      
      state = 0
      a, b, X, Z, U, V, R, L, B = 'a', 'b', 'X', 'Z', 'U', 'V', 'R', 'L', 'B'
      oldtapehead = -1
      accept = False
      while(oldtapehead != tapehead): #if tapehead not moving that means terminate Turing machine
          oldtapehead = tapehead
      
          if state == 0:
              if action(a, X, R):
                  state = 1
              elif action(B, B, R):
                  state = 10
              elif action(Z, Z, R):
                  state = 7
              elif action(b, U, R):
                  state = 4
      
          elif state == 1:
              if action(a, a, R):
                  state = 1
              elif action(b, b, R):
                  state = 2
              elif action(B, B, L):
                  state = 11
      
          elif state == 2:
              if action(b, b, R) or action(Z, Z, R):
                  state = 2
              elif action(a, Z, L):
                  state = 3
      
          elif state == 3:
              if action(b, b, L) or action(Z, Z, L) or action(a, a, L):
                  state = 3
              elif action(X, X, R):
                  state = 0
      
          elif state == 4:
              if action(b, b, R):
                  state = 4
              elif action(Z, Z, R):
                  state = 5
              elif action(B, B, L):
                  state = 15
      
          elif state == 5:
              if action(Z, Z, R) or action(V, V, R):
                  state = 5
              elif action(b, V, L):
                  state = 6
      
          elif state == 6:
              if action(Z, Z, L) or action(V, V, L) or action(b, b, L):
                  state = 6
              elif action(U, U, R):
                  state = 0
      
          elif state == 7:
              if action(Z, Z, R):
                  state = 7
              elif action(V, V, R):
                  state = 8
      
          elif state == 8:
              if action(V, V, R):
                  state = 8
              elif action(B, B, R):
                  state = 9
      
          elif state == 11:
              if action(a, a, L):
                  state = 11
              elif action(X, X, R):
                  state = 12
      
          elif state == 12:
              if action(a, Z, R):
                  state = 13
      
          elif state == 13:
              if action(a, X, R):
                  state = 12
              elif action(B, B, R):
                  state = 14
      
          elif state == 15:
              if action(b, b, L):
                  state = 15
              elif action(U, U, R):
                  state = 16
      
          elif state == 16:
              if action(b, V, R):
                  state = 17
      
          elif state == 17:
              if action(b, U, R):
                  state = 16
              elif action(B, B, R):
                  state = 18
      
          else:
              accept = True
      
      
      if accept:
          print("String accepted on state = ", state)
      else:
          print("String not accepted on state = ", state)
      

      您可以检查图中不清楚的任何状态或针对任何输入进行测试。一些输入的输出:

      Enter String: aaaaabbaaaaabb
      String accepted on state =  9
      
      Enter String: aaaaaa
      String accepted on state =  14
      
      Enter String: 
      String accepted on state =  10
      
      Enter String: aaabaaa
      String not accepted on state =  5
      
      Enter String: bbb
      String not accepted on state =  16
      

      【讨论】:

        猜你喜欢
        • 2021-12-11
        • 2018-10-21
        • 2022-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-16
        • 2018-06-18
        • 2021-08-31
        相关资源
        最近更新 更多