DFA for accepting the language L = { anbm | n+m=even } - GeeksforGeeks

09 Aug, 2021
Design a deterministic finite automata(DFA) for accepting the language L =For creating DFA for language, L = { a^n b^m ; n+m=even } use elementary mathematics, which says- even + even = even and odd + odd = even
Examples: 
Input:  a a b b     // n = 2, m = 2, 2 + 2 = 4 (even)
Output:  ACCEPTED

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

Input:  a a a b b b     // n = 3, m = 3, 3 + 3 = 6 (even)
Output:  ACCEPTED
Approaches: There is 2 cases that results in acceptance of string:  
If both n and m are even then their sum will be evenIf both n and m are odd then their sum will be even
If both n and m are even then their sum will be even
If both n and m are odd then their sum will be even
Description: Given DFA has 2 parts. The first part consists of states 0, 1, 5, and 6 which is for both n and m is odd. The second part consists of states 2, 3, and 4 is for both n and m is even.DFA State Transition Diagram:
Let’s see the code for the demonstration: 
C++
C
Java
Python3
C#
PHP
Javascript
// C++ program to implement DFA that accepts// all strings which follow the language// L = { a^n b^m ; n+m=even }#include <bits/stdc++.h>using namespace std; // dfa tells the number associated// with the present stateint dfa = 0; // This function is for// the starting state (zeroth) of DFAvoid start(char c){    if (c == 'a')        dfa = 1;    else if (c == 'b')        dfa = 2;     // -1 is used to check for any invalid symbol    else        dfa = -1;} // This function is for the first state of DFAvoid state1(char c){    if (c == 'a')        dfa = 0;    else if (c == 'b')        dfa = 5;    else        dfa = -1;} // This function is for the second state of DFAvoid state2(char c){    if (c == 'b')        dfa = 3;    else        dfa = -1;} // This function is for the third state of DFAvoid state3(char c){    if (c == 'b')        dfa = 4;    else        dfa = -1;} // This function is for the fourth state of DFAvoid state4(char c){    if (c == 'b')        dfa = 3;    else        dfa = -1;} // This function is for the fifth state of DFAvoid state5(char c){    if (c == 'b')        dfa = 6;    else        dfa = -1;} // This function is for the sixth state of DFAvoid state6(char c){    if (c == 'b')        dfa = 5;    else        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 if (dfa == 5)            state5(str[i]);         else if (dfa == 6)            state6(str[i]);         else            return 0;    }    if (dfa == 3 || dfa == 5)        return 1;    else        return 0;} // Driver codeint main(){    char str[] = "aaabbb";    if (isAccepted(str))        cout << "\nACCEPTED\n";    else        cout << "NOT ACCEPTED\n";    return 0;} // This code is contributed by SHUBHAMSINGH10
// C program to implement DFA that accepts// all strings which follow the language// L = { a^n b^m ; n+m=even }#include <stdio.h>#include <string.h> // dfa tells the number associated// with the present stateint dfa = 0; // This function is for// the starting state (zeroth) of DFAvoid start(char c){    if (c == 'a')        dfa = 1;    else if (c == 'b')        dfa = 2;     // -1 is used to check for any invalid symbol    else        dfa = -1;} // This function is for the first state of DFAvoid state1(char c){    if (c == 'a')        dfa = 0;    else if (c == 'b')        dfa = 5;    else        dfa = -1;} // This function is for the second state of DFAvoid state2(char c){    if (c == 'b')        dfa = 3;    else        dfa = -1;} // This function is for the third state of DFAvoid state3(char c){    if (c == 'b')        dfa = 4;    else        dfa = -1;} // This function is for the fourth state of DFAvoid state4(char c){    if (c == 'b')        dfa = 3;    else        dfa = -1;} // This function is for the fifth state of DFAvoid state5(char c){    if (c == 'b')        dfa = 6;    else        dfa = -1;} // This function is for the sixth state of DFAvoid state6(char c){    if (c == 'b')        dfa = 5;    else        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 if (dfa == 5)            state5(str[i]);         else if (dfa == 6)            state6(str[i]);         else            return 0;    }    if (dfa == 3 || dfa == 5)        return 1;    else        return 0;} // driver codeint main(){    char str[] = "aaabbb";    if (isAccepted(str))        printf("\nACCEPTED\n");    else        printf("NOT ACCEPTED\n");    return 0;}
// Java program to implement DFA that accepts// all strings which follow the language// L = { a^n b^m ; n+m=even }class GFG {     // dfa tells the number associated    // with the present 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 = 2;        }         // -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 = 0;        }        else if (c == 'b') {            dfa = 5;        }        else {            dfa = -1;        }    }     // This function is for the    // second state (Q2) of DFA    static void state2(char c)    {        if (c == 'b') {            dfa = 3;        }        else {            dfa = -1;        }    }     // This function is for the    // third state (Q3)of DFA    static void state3(char c)    {        if (c == 'b') {            dfa = 4;        }        else {            dfa = -1;        }    }     // This function is for the    // fourth state (Q4) of DFA    static void state4(char c)    {        if (c == 'b') {            dfa = 3;        }        else {            dfa = -1;        }    }     // This function is for the    // fifth state (Q5) of DFA    static void state5(char c)    {        if (c == 'b') {            dfa = 6;        }        else {            dfa = -1;        }    }     // This function is for the    // sixth state (Q6) of DFA    static void state6(char c)    {        if (c == 'b') {            dfa = 5;        }        else {            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 if (dfa == 5)                state5(str[i]);             else if (dfa == 6)                state6(str[i]);             else                return 0;        }        if (dfa == 3 || dfa == 5)            return 1;        else            return 0;    }     // Driver code    public static void main(String[] args)    {        char str[] = "aaabbb".toCharArray();        if (isAccepted(str) == 1)            System.out.println("ACCEPTED");        else            System.out.println("NOT ACCEPTED");    }}
# Python3 program to implement DFA that accepts# all strings which follow the language# L = a ^ n b ^ m n + m = even # This function is for the dfa = starting# dfa = state (zeroth) of DFAdef start(c):    if (c == 'a'):        dfa = 1    elif (c == 'b'):        dfa = 2         # -1 is used to check for any    # invalid symbol    else:        dfa = -1    return dfa # This function is for the first# dfa = state of DFAdef state1(c):    if (c == 'a'):        dfa = 0    elif (c == 'b'):        dfa = 5    else:        dfa = -1    return dfa # This function is for the second# dfa = state of DFAdef state2(c):    if (c == 'b'):        dfa = 3    else:        dfa = -1    return dfa # This function is for the third# dfa = state of DFAdef state3(c):    if (c == 'b'):        dfa = 4    else:        dfa = -1    return dfa # This function is for the fourth# dfa = state of DFAdef state4(c):    if (c == 'b'):        dfa = 3    else:        dfa = -1    return dfa # This function is for the fifth# dfa = state of DFAdef state5(c):    if (c == 'b'):        dfa = 6    else:        dfa = -1    return dfa  # This function is for the sixth# dfa = state of DFAdef state6(c):    if (c == 'b'):        dfa = 5    else:        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])          elif (dfa == 5) :            dfa = state5(String[i])         elif (dfa == 6):            dfa = state6(String[i])         else:            return 0    if(dfa == 3 or dfa == 5) :        return 1    else:        return 0 # Driver codeif __name__ == "__main__" :    String = "aaabbb"    if (isAccepted(String)) :        print("ACCEPTED")    else:        print("NOT ACCEPTED") # This code is contributed by# Shubham Singh(SHUBHAMSINGH10)
// C# program to implement DFA that accepts// all strings which follow the language// L = { a^n b^m ; n+m=even }using System;     class GFG{     // dfa tells the number associated    // with the present 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 = 2;        }         // -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 = 0;        }        else if (c == 'b')        {            dfa = 5;        }        else        {            dfa = -1;        }    }     // This function is for the    // second state (Q2) of DFA    static void state2(char c)    {        if (c == 'b')        {            dfa = 3;        }        else        {            dfa = -1;        }    }     // This function is for the    // third state (Q3)of DFA    static void state3(char c)    {        if (c == 'b')        {            dfa = 4;        }        else        {            dfa = -1;        }    }     // This function is for the    // fourth state (Q4) of DFA    static void state4(char c)    {        if (c == 'b')        {            dfa = 3;        }        else        {            dfa = -1;        }    }     // This function is for the    // fifth state (Q5) of DFA    static void state5(char c)    {        if (c == 'b')        {            dfa = 6;        }        else        {            dfa = -1;        }    }     // This function is for the    // sixth state (Q6) of DFA    static void state6(char c)    {        if (c == 'b')        {            dfa = 5;        }        else        {            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 if (dfa == 5)                state5(str[i]);             else if (dfa == 6)                state6(str[i]);             else                return 0;        }        if (dfa == 3 || dfa == 5)            return 1;        else            return 0;    }     // Driver code    public static void Main(String[] args)    {        char []str = "aaabbb".ToCharArray();        if (isAccepted(str) == 1)            Console.WriteLine("ACCEPTED");        else            Console.WriteLine("NOT ACCEPTED");    }} /* This code contributed by PrinciRaj1992 */
<?php// PHP program to implement DFA that accepts// all strings which follow the language// L = { a^n b^m ; n+m=even } // This function is for the// starting state (zeroth) of DFAfunction start($c, &$dfa){    if ($c == 'a') $dfa = 1;    elseif ($c == 'b') $dfa = 2;         // -1 is used to check for any    // invalid symbol    else $dfa = -1;} // This function is for the first// state of DFAfunction state1($c, &$dfa){    if ($c == 'a') $dfa = 0;    elseif ($c == 'b') $dfa = 5;    else $dfa = -1;} // This function is for the second// state of DFAfunction state2($c, &$dfa){    if ($c == 'b') $dfa = 3;    else $dfa = -1;} // This function is for the third// state of DFAfunction state3($c, &$dfa){    if ($c == 'b') $dfa = 4;    else $dfa = -1;} // This function is for the fourth// state of DFAfunction state4($c, &$dfa){    if ($c == 'b') $dfa = 3;    else $dfa = -1;} // This function is for the fifth// state of DFAfunction state5($c, &$dfa){    if ($c == 'b') $dfa = 6;    else $dfa = -1;} // This function is for the sixth// state of DFAfunction state6($c, &$dfa){    if ($c == 'b') $dfa = 5;    else $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);         elseif ($dfa == 5)            state5($str[$i], $dfa);         elseif ($dfa == 6)            state6($str[$i], $dfa);         else            return 0;    }         if($dfa == 3 || $dfa == 5)        return 1;    else        return 0;} // Driver code // dfa tells the number associated// with the present state$dfa = 0;$str = array("a", "a", "a", "b", "b", "b"); if (isAccepted($str, $dfa) != 0)    echo "ACCEPTED";else    echo "NOT ACCEPTED"; // This code is contributed by// Adesh kumar Singh(adeshsingh1)?>
<script> // Javascript program to implement DFA that accepts// all strings which follow the language// L = { a^n b^m ; n+m=even } // dfa tells the number associated// with the present statevar dfa = 0; // This function is for// the starting state (zeroth) of DFAfunction start(c){    if (c == 'a')        dfa = 1;    else if (c == 'b')        dfa = 2;     // -1 is used to check for any invalid symbol    else        dfa = -1;} // This function is for the first state of DFAfunction state1(c){    if (c == 'a')        dfa = 0;    else if (c == 'b')        dfa = 5;    else        dfa = -1;} // This function is for the second state of DFAfunction state2(c){    if (c == 'b')        dfa = 3;    else        dfa = -1;} // This function is for the third state of DFAfunction state3(c){    if (c == 'b')        dfa = 4;    else        dfa = -1;} // This function is for the fourth state of DFAfunction state4(c){    if (c == 'b')        dfa = 3;    else        dfa = -1;} // This function is for the fifth state of DFAfunction state5(c){    if (c == 'b')        dfa = 6;    else        dfa = -1;} // This function is for the sixth state of DFAfunction state6(c){    if (c == 'b')        dfa = 5;    else        dfa = -1;} function isAccepted(str){    // Store length of string    var 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 if (dfa == 5)            state5(str[i]);         else if (dfa == 6)            state6(str[i]);         else            return 0;    }    if (dfa == 3 || dfa == 5)        return 1;    else        return 0;} // Driver codevar str = "aaabbb";if (isAccepted(str))    document.write( "ACCEPTED");else    document.write( "NOT ACCEPTED");  </script>
Output: 
ACCEPTED
 There is a minimal DFA for the same problem. 
SHUBHAMSINGH10
AdeshSingh1
princiraj1992
noob2000
siddheshjn
GATE CS
Theory of Computation & Automata
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Layers of OSI Model
ACID Properties in DBMS
Types of Operating Systems
Normal Forms in DBMS
TCP/IP Model
Difference between DFA and NFA
Design 101 sequence detector (Mealy machine)
Closure properties of Regular languages
Conversion of Epsilon-NFA to NFA
Regular expression to ∈-NFA