📌  相关文章
📜  构建接受语言 L = {anbm | 的 DFA 的程序n mod 2=0, m≥1}

📅  最后修改于: 2021-09-27 15:37:35             🧑  作者: Mango

先决条件——有限自动机简介
问题:设计一个确定性有限自动机 (DFA) 来接受语言L = \{a^nb^m | n\mod 2=0, m \geq 1\}

上述语言 L 的正则表达式是,

L = (aa)*.b+

例子:

Input:  a a b b b           
Output:  ACCEPTED
// n = 2 (even) m=3 (>=1)

Input:  a a a b b b         
Output:  NOT ACCEPTED
 // n = 3 (odd), m = 3

Input:  a a a a        
Output:  NOT ACCEPTED
// n = 4, m = 0( must be >=1)

方法:
有 3 个步骤导致接受字符串:

  1. (aa)^*意味着有偶数个a。
  2. b^+表示具有大于 1 的任意数量的 b。
  3. 连接两个 FA 并制作单个 DFA。

    任何其他组合结果都是拒绝输入字符串。

      描述:
      鉴于 DFA 具有以下状态。状态 3 导致接受字符串,而状态 0、1、2 和 4 导致拒绝字符串。

      DFA 状态转换图:

      让我们看看演示的代码:

      C/C++
      // C program to implement DFS that accepts
      // all string which follow the language
      // L = { a^n b^m ; (n)mod 2=0, m>=1 }
      #include 
      #include 
        
      // dfa tells the number associated
      // string end in which state.
      int dfa = 0;
        
      // This function is for
      // the starting state (Q0)of DFA
      void start(char c)
      {
          if (c == 'a') {
              dfa = 1;
          }
          else if (c == 'b') {
              dfa = 3;
          }
        
          // -1 is used to check for any invalid symbol
          else {
              dfa = -1;
          }
      }
        
      // This function is for the first state (Q1) of DFA
      void state1(char c)
      {
          if (c == 'a') {
              dfa = 2;
          }
          else if (c == 'b') {
              dfa = 4;
          }
          else {
              dfa = -1;
          }
      }
        
      // This function is for the second state (Q2) of DFA
      void state2(char c)
      {
          if (c == 'b') {
              dfa = 3;
          }
          else if (c == 'a') {
              dfa = 1;
          }
          else {
              dfa = -1;
          }
      }
        
      // This function is for the third state (Q3)of DFA
      void state3(char c)
      {
          if (c == 'b') {
              dfa = 3;
          }
          else if (c == 'a') {
              dfa = 4;
          }
          else {
              dfa = -1;
          }
      }
        
      // This function is for the fourth state (Q4) of DFA
      void state4(char c)
      {
          dfa = -1;
      }
        
      int isAccepted(char str[])
      {
          // store length of string
          int i, len = strlen(str);
        
          for (i = 0; i < len; i++) {
              if (dfa == 0)
                  start(str[i]);
        
              else if (dfa == 1)
                  state1(str[i]);
        
              else if (dfa == 2)
                  state2(str[i]);
        
              else if (dfa == 3)
                  state3(str[i]);
        
              else if (dfa == 4)
                  state4(str[i]);
              else
                  return 0;
          }
          if (dfa == 3)
              return 1;
          else
              return 0;
      }
        
      // driver code
      int main()
      {
          char str[] = "aaaaaabbbb";
          if (isAccepted(str))
              printf("ACCEPTED");
          else
              printf("NOT ACCEPTED");
          return 0;
      }
        
      // This code is contributed by SHUBHAMSINGH10.


      Java
      // Java program to implement DFS that accepts
      // all string which follow the language
      // L = { a^n b^m ; (n)mod 2=0, m>=1 }
      class GFG
      {
            
      // dfa tells the number associated
      // string end in which state.
      static int dfa = 0;
        
      // This function is for
      // the starting state (Q0)of DFA
      static void start(char c)
      {
          if (c == 'a')
          {
              dfa = 1;
          }
          else if (c == 'b') 
          {
              dfa = 3;
          }
        
          // -1 is used to check for
          // any invalid symbol
          else
          {
              dfa = -1;
          }
      }
        
      // This function is for the
      // first state (Q1) of DFA
      static void state1(char c)
      {
          if (c == 'a') 
          {
              dfa = 2;
          }
          else if (c == 'b')
          {
              dfa = 4;
          }
          else 
          {
              dfa = -1;
          }
      }
        
      // This function is for the 
      // second state (Q2) of DFA
      static void state2(char c)
      {
          if (c == 'b') 
          {
              dfa = 3;
          }
          else if (c == 'a')
          {
              dfa = 1;
          }
          else 
          {
              dfa = -1;
          }
      }
        
      // This function is for the
      // third state (Q3)of DFA
      static void state3(char c)
      {
          if (c == 'b') 
          {
              dfa = 3;
          }
          else if (c == 'a')
          {
              dfa = 4;
          }
          else 
          {
              dfa = -1;
          }
      }
        
      // This function is for the
      // fourth state (Q4) of DFA
      static void state4(char c)
      {
          dfa = -1;
      }
        
      static int isAccepted(char str[])
      {
          // store length of string
          int i, len = str.length;
        
          for (i = 0; i < len; i++)
          {
              if (dfa == 0)
                  start(str[i]);
        
              else if (dfa == 1)
                  state1(str[i]);
        
              else if (dfa == 2)
                  state2(str[i]);
        
              else if (dfa == 3)
                  state3(str[i]);
        
              else if (dfa == 4)
                  state4(str[i]);
              else
                  return 0;
          }
          if (dfa == 3)
              return 1;
          else
              return 0;
      }
        
      // Driver code
      public static void main(String []args) 
      {
          char str[] = "aaaaaabbbb".toCharArray();
          if (isAccepted(str) == 1)
              System.out.printf("ACCEPTED");
          else
              System.out.printf("NOT ACCEPTED");
      }
      }
        
      // This code is contributed by 29AjayKumar


      Python 3
      # Python3 program to implement DFS that accepts   
      # all Stringing which follow the language   
      # L = {a ^ n b ^ m (n)mod 2 = 0, m>= 1 }
            
      # This function is for the dfa = starting  
      # dfa = state (zeroth) of DFA   
      def start(c):  
          if (c == 'a'):  
              dfa = 1
          elif (c == 'b'):  
              dfa = 3
                
          # -1 is used to check for any  
          # invalid symbol   
          else:  
              dfa = -1
          return dfa  
            
      # This function is for the first   
      # dfa = state of DFA   
      def state1(c):   
          if (c == 'a'):  
              dfa = 2
          elif (c == 'b'):  
              dfa = 4
          else:  
              dfa = -1
          return dfa  
            
      # This function is for the second   
      # dfa = state of DFA   
      def state2(c):  
          if (c == 'b'):  
              dfa = 3
          elif (c == 'a'):  
              dfa = 1
          else:  
              dfa = -1
          return dfa  
            
      # This function is for the third   
      # dfa = state of DFA   
      def state3(c):  
          if (c == 'b'):  
              dfa = 3
          elif (c == 'a'):  
              dfa = 4
          else:  
              dfa = -1
          return dfa  
            
      # This function is for the fourth  
      # dfa = state of DFA   
      def state4(c):  
          dfa = -1
          return dfa  
            
      def isAccepted(String):  
                
          # store length of Stringing   
          l = len(String)  
                
          # dfa tells the number associated  
          # with the present dfa = state  
          dfa = 0
          for i in range(l):   
              if (dfa == 0):   
                  dfa = start(String[i])   
            
              elif (dfa == 1):   
                  dfa = state1(String[i])   
            
              elif (dfa == 2) :  
                  dfa = state2(String[i])   
            
              elif (dfa == 3) :  
                  dfa = state3(String[i])   
            
              elif (dfa == 4) :  
                  dfa = state4(String[i])   
              else:  
                  return 0
          if(dfa == 3) :  
              return 1
          else:  
              return 0
            
      # Driver code   
      if __name__ == "__main__" :  
          String = "aaaaaabbbb"
          if (isAccepted(String)) :  
              print("ACCEPTED")   
          else:  
              print("NOT ACCEPTED")   
           
      # This code is contributed by SHUBHAMSINGH10.


      C#
      // C# program to implement DFS that accepts
      // all string which follow the language
      // L = { a^n b^m ; (n)mod 2=0, m>=1 }
      using System;
            
      class GFG
      {
            
      // dfa tells the number associated
      // string end in which state.
      static int dfa = 0;
        
      // This function is for
      // the starting state (Q0)of DFA
      static void start(char c)
      {
          if (c == 'a')
          {
              dfa = 1;
          }
          else if (c == 'b') 
          {
              dfa = 3;
          }
        
          // -1 is used to check for
          // any invalid symbol
          else
          {
              dfa = -1;
          }
      }
        
      // This function is for the
      // first state (Q1) of DFA
      static void state1(char c)
      {
          if (c == 'a') 
          {
              dfa = 2;
          }
          else if (c == 'b')
          {
              dfa = 4;
          }
          else
          {
              dfa = -1;
          }
      }
        
      // This function is for the 
      // second state (Q2) of DFA
      static void state2(char c)
      {
          if (c == 'b') 
          {
              dfa = 3;
          }
          else if (c == 'a')
          {
              dfa = 1;
          }
          else
          {
              dfa = -1;
          }
      }
        
      // This function is for the
      // third state (Q3)of DFA
      static void state3(char c)
      {
          if (c == 'b') 
          {
              dfa = 3;
          }
          else if (c == 'a')
          {
              dfa = 4;
          }
          else
          {
              dfa = -1;
          }
      }
        
      // This function is for the
      // fourth state (Q4) of DFA
      static void state4(char c)
      {
          dfa = -1;
      }
        
      static int isAccepted(char []str)
      {
          // store length of string
          int i, len = str.Length;
        
          for (i = 0; i < len; i++)
          {
              if (dfa == 0)
                  start(str[i]);
        
              else if (dfa == 1)
                  state1(str[i]);
        
              else if (dfa == 2)
                  state2(str[i]);
        
              else if (dfa == 3)
                  state3(str[i]);
        
              else if (dfa == 4)
                  state4(str[i]);
              else
                  return 0;
          }
          if (dfa == 3)
              return 1;
          else
              return 0;
      }
        
      // Driver code
      public static void Main(String []args) 
      {
          char []str = "aaaaaabbbb".ToCharArray();
          if (isAccepted(str) == 1)
              Console.Write("ACCEPTED");
          else
              Console.Write("NOT ACCEPTED");
      }
      }
        
      // This code is contributed by 29AjayKumar


      PHP
      =1 } 
        
      // This function is for the starting 
      // state (zeroth) of DFA 
      function start($c, &$dfa)
      {
          if($c == 'a') 
              $dfa = 1; 
                
          elseif ($c == 'b') 
              $dfa = 3; 
            
          // -1 is used to check for any 
          // invalid symbol 
          else $dfa = -1; 
      }
        
      // This function is for the first 
      // state of DFA 
      function state1($c, &$dfa)
      {
          if ($c == 'a')
              $dfa = 2; 
          elseif ($c == 'b') 
              $dfa = 4; 
          else
              $dfa = -1; 
        
      }
        
      // This function is for the second 
      // state of DFA 
      function state2($c, &$dfa)
      {
          if ($c == 'b') 
              $dfa = 3; 
          elseif ($c == 'a') 
              $dfa = 1; 
          else 
              $dfa = -1; 
      }
        
      // This function is for the third 
      // state of DFA 
      function state3($c, &$dfa)
      {
          if ($c == 'b') 
              $dfa = 3; 
          elseif ($c == 'a') 
              $dfa = 4; 
          else 
              $dfa = -1; 
      }
        
      // This function is for the fourth 
      // state of DFA 
      function state4($c, &$dfa)
      {
          $dfa = -1; 
      }
        
        
      function isAccepted($str,&$dfa)
      {
          // store length of string 
          $i = 0; $len = sizeof($str); 
          for ($i = 0; $i < $len; $i++) 
          { 
              if ($dfa == 0) 
                  start($str[$i], $dfa); 
        
              elseif ($dfa == 1) 
                  state1($str[$i], $dfa); 
        
              elseif ($dfa == 2) 
                  state2($str[$i], $dfa); 
        
              elseif ($dfa == 3) 
                  state3($str[$i], $dfa); 
        
              elseif ($dfa == 4) 
                  state4($str[$i], $dfa); 
              else
                  return 0; 
                    
          } 
          if($dfa == 3) 
              return 1; 
          else
          return 0; 
      }
        
      // Driver Code 
        
      // dfa tells the number associated 
      // with the present state 
      $dfa = 0;
      $str = array("a", "a", "a", "a", "a", 
                   "a", "b", "b", "b", "b");
        
      if (isAccepted($str, $dfa) != 0) 
          echo "ACCEPTED"; 
      else
          echo "NOT ACCEPTED"; 
        
      // This code is contributed 
      // by Adesh Singh
      ?>


      输出:

      ACCEPTED