Open In App

Program to construct a DFA which accept the language L = {anbm | n mod 2=0, m≥1}

Last Updated : 14 Nov, 2019
Improve
Improve
Like Article
Like
Save
Share
Report
Prerequisite – Finite Automata Introduction Problem: Design a deterministic finite automata (DFA) for accepting the language L = \{a^nb^m | n\mod 2=0, m \geq 1\} Regular expression for above language L is,
L = (aa)*.b+
Examples:
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)
Approaches:
There are 3 steps involve which results in acceptance of string:
  1. Construct FA for (aa)^* means having even number of a’s.
  2. Construct FA for b^+ means having any number of b’s greater than one.
  3. Concatenate the two FA and make single DFA.
  4. Any other combination result is the rejection of the input string.
      Description: Given DFA has following states. State 3 leads to the acceptance of the string, whereas states 0, 1, 2 and 4 leads to the rejection of the string. DFA State Transition Diagram: Let’s see code for the demonstration:

      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 <stdio.h>
      #include <string.h>
        
      // 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

      <?php
      // PHP program to implement DFS that accepts 
      // all string which follow the language 
      // L = { a^n b^m ;(n)mod 2=0, m>=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
      ?>
      
                          
      Output:
      ACCEPTED


      Like Article
      Suggest improvement
      Previous
      Next
      Share your thoughts in the comments

Similar Reads