Construct a DFA which accept the language L = {w | w ∈ {a,b}* and Na(w) mod 3 = Nb (w) mod 3}
Problem:
Construct a deterministic finite automata (DFA) for accepting the language L = {w | w ∈ {a,b}* and Na(w) mod 3 = Nb (w) mod 3}. Language L={w | Na(w) = Nb(w)mod 3} which means all string contain modulus of count of a’s equal to modulus of count of b’s by 3.
Examples:
Input: a a b b b Output: NOT ACCEPTED // n = 2, m=3 (2 mod 3! = 3 mod 3) Input: a a b b Output: ACCEPTED // n = 2, m = 2 (2 mod 3 = 2 mod 3) Input: b b b Output: NOT ACCEPTED // n = 0, m = 3 ((0 mod 3 = 3 mod 3) <=> (0=0))
Approaches:
- Construct FA for {w | w [Tex]\epsilon
[/Tex] {a, b}} and Na = 0 mod 3 means having a’s as a multiple of 3.
- Construct FA for {w | w [Tex]\epsilon
[/Tex] {a, b}} and Nb = 0 mod 3 means having b’s as a multiple of 3.
- Concatenate the two FA and make single DFA using Concatenation process in DFA.
- Making state as final state which accepts the equal modulus count for a’s and b’s.
- DFA State Transition Diagram:
States 00, 11 and 22 leads to the acceptance of the string.Whereas states 01, 02, 10, 12, 20 and 21 leads to the rejection of the string. Let’s see code for the demonstration:
C/C++
#include <stdio.h>
#include <string.h>
int dfa = 0;
void start( char c)
{
if (c == 'a' ) {
dfa = 10;
}
else if (c == 'b' ) {
dfa = 1;
}
else {
dfa = -1;
}
}
void state01( char c)
{
if (c == 'a' ) {
dfa = 11;
}
else if (c == 'b' ) {
dfa = 2;
}
else {
dfa = -1;
}
}
void state02( char c)
{
if (c == 'b' ) {
dfa = 0;
}
else if (c == 'a' ) {
dfa = 12;
}
else {
dfa = -1;
}
}
void state10( char c)
{
if (c == 'b' ) {
dfa = 11;
}
else if (c == 'a' ) {
dfa = 20;
}
else {
dfa = -1;
}
}
void state11( char c)
{
if (c == 'b' ) {
dfa = 12;
}
else if (c == 'a' ) {
dfa = 21;
}
else {
dfa = -1;
}
}
void state12( char c)
{
if (c == 'b' ) {
dfa = 10;
}
else if (c == 'a' ) {
dfa = 22;
}
else {
dfa = -1;
}
}
void state20( char c)
{
if (c == 'b' ) {
dfa = 21;
}
else if (c == 'a' ) {
dfa = 0;
}
else {
dfa = -1;
}
}
void state21( char c)
{
if (c == 'b' ) {
dfa = 22;
}
else if (c == 'a' ) {
dfa = 1;
}
else {
dfa = -1;
}
}
void state22( char c)
{
if (c == 'b' ) {
dfa = 20;
}
else if (c == 'a' ) {
dfa = 2;
}
else {
dfa = -1;
}
}
int isAccepted( char str[])
{
int i, len = strlen (str);
for (i = 0; i < len; i++) {
if (dfa == 0)
start(str[i]);
else if (dfa == 1)
state01(str[i]);
else if (dfa == 2)
state02(str[i]);
else if (dfa == 10)
state10(str[i]);
else if (dfa == 11)
state11(str[i]);
else if (dfa == 12)
state12(str[i]);
else if (dfa == 20)
state20(str[i]);
else if (dfa == 21)
state21(str[i]);
else if (dfa == 22)
state22(str[i]);
else
return 0;
}
if (dfa == 0 || dfa == 11 || dfa == 22)
return 1;
else
return 0;
}
int main()
{
char str[] = "aaaabbbb" ;
if (isAccepted(str))
printf ( "ACCEPTED" );
else
printf ( "NOT ACCEPTED" );
return 0;
}
|
Java
class GFG{
static int dfa = 0 ;
static void start( char c)
{
if (c == 'a' ) {
dfa = 10 ;
}
else if (c == 'b' ) {
dfa = 1 ;
}
else {
dfa = - 1 ;
}
}
static void state01( char c)
{
if (c == 'a' ) {
dfa = 11 ;
}
else if (c == 'b' ) {
dfa = 2 ;
}
else {
dfa = - 1 ;
}
}
static void state02( char c)
{
if (c == 'b' ) {
dfa = 0 ;
}
else if (c == 'a' ) {
dfa = 12 ;
}
else {
dfa = - 1 ;
}
}
static void state10( char c)
{
if (c == 'b' ) {
dfa = 11 ;
}
else if (c == 'a' ) {
dfa = 20 ;
}
else {
dfa = - 1 ;
}
}
static void state11( char c)
{
if (c == 'b' ) {
dfa = 12 ;
}
else if (c == 'a' ) {
dfa = 21 ;
}
else {
dfa = - 1 ;
}
}
static void state12( char c)
{
if (c == 'b' ) {
dfa = 10 ;
}
else if (c == 'a' ) {
dfa = 22 ;
}
else {
dfa = - 1 ;
}
}
static void state20( char c)
{
if (c == 'b' ) {
dfa = 21 ;
}
else if (c == 'a' ) {
dfa = 0 ;
}
else {
dfa = - 1 ;
}
}
static void state21( char c)
{
if (c == 'b' ) {
dfa = 22 ;
}
else if (c == 'a' ) {
dfa = 1 ;
}
else {
dfa = - 1 ;
}
}
static void state22( char c)
{
if (c == 'b' ) {
dfa = 20 ;
}
else if (c == 'a' ) {
dfa = 2 ;
}
else {
dfa = - 1 ;
}
}
static boolean isAccepted(String st)
{
int i, len = st.length();
char [] str = st.toCharArray();
for (i = 0 ; i < len; i++) {
if (dfa == 0 )
start(str[i]);
else if (dfa == 1 )
state01(str[i]);
else if (dfa == 2 )
state02(str[i]);
else if (dfa == 10 )
state10(str[i]);
else if (dfa == 11 )
state11(str[i]);
else if (dfa == 12 )
state12(str[i]);
else if (dfa == 20 )
state20(str[i]);
else if (dfa == 21 )
state21(str[i]);
else if (dfa == 22 )
state22(str[i]);
else
return false ;
}
if (dfa == 0 || dfa == 11 || dfa == 22 )
return true ;
else
return false ;
}
public static void main(String []args)
{
String str = "aaaabbbb" ;
if (isAccepted(str))
System.out.println( "ACCEPTED" );
else
System.out.println( "NOT ACCEPTED" );
}
}
|
C#
using System;
class GFG
{
static int dfa = 0;
static void start( char c)
{
if (c == 'a' ) {
dfa = 10;
}
else if (c == 'b' ) {
dfa = 1;
}
else {
dfa = -1;
}
}
static void state01( char c)
{
if (c == 'a' ) {
dfa = 11;
}
else if (c == 'b' ) {
dfa = 2;
}
else {
dfa = -1;
}
}
static void state02( char c)
{
if (c == 'b' ) {
dfa = 0;
}
else if (c == 'a' ) {
dfa = 12;
}
else {
dfa = -1;
}
}
static void state10( char c)
{
if (c == 'b' ) {
dfa = 11;
}
else if (c == 'a' ) {
dfa = 20;
}
else {
dfa = -1;
}
}
static void state11( char c)
{
if (c == 'b' ) {
dfa = 12;
}
else if (c == 'a' ) {
dfa = 21;
}
else {
dfa = -1;
}
}
static void state12( char c)
{
if (c == 'b' ) {
dfa = 10;
}
else if (c == 'a' ) {
dfa = 22;
}
else {
dfa = -1;
}
}
static void state20( char c)
{
if (c == 'b' ) {
dfa = 21;
}
else if (c == 'a' ) {
dfa = 0;
}
else {
dfa = -1;
}
}
static void state21( char c)
{
if (c == 'b' ) {
dfa = 22;
}
else if (c == 'a' ) {
dfa = 1;
}
else {
dfa = -1;
}
}
static void state22( char c)
{
if (c == 'b' ) {
dfa = 20;
}
else if (c == 'a' ) {
dfa = 2;
}
else {
dfa = -1;
}
}
static Boolean isAccepted(String st)
{
int i, len = st.Length;
char [] str = st.ToCharArray();
for (i = 0; i < len; i++) {
if (dfa == 0)
start(str[i]);
else if (dfa == 1)
state01(str[i]);
else if (dfa == 2)
state02(str[i]);
else if (dfa == 10)
state10(str[i]);
else if (dfa == 11)
state11(str[i]);
else if (dfa == 12)
state12(str[i]);
else if (dfa == 20)
state20(str[i]);
else if (dfa == 21)
state21(str[i]);
else if (dfa == 22)
state22(str[i]);
else
return false ;
}
if (dfa == 0 || dfa == 11 || dfa == 22)
return true ;
else
return false ;
}
public static void Main(String []args)
{
String str = "aaaabbbb" ;
if (isAccepted(str))
Console.WriteLine( "ACCEPTED" );
else
Console.WriteLine( "NOT ACCEPTED" );
}
}
|
Javascript
let dfa = 0;
function start(c) {
if (c === 'a' ) {
dfa = 10;
} else if (c === 'b' ) {
dfa = 1;
} else {
dfa = -1;
}
}
function state01(c) {
if (c === 'a' ) {
dfa = 11;
} else if (c === 'b' ) {
dfa = 2;
} else {
dfa = -1;
}
}
function state02(c) {
if (c === 'b' ) {
dfa = 0;
} else if (c === 'a' ) {
dfa = 12;
} else {
dfa = -1;
}
}
function state10(c) {
if (c === 'b' ) {
dfa = 11;
} else if (c === 'a' ) {
dfa = 20;
} else {
dfa = -1;
}
}
function state11(c) {
if (c === 'b' ) {
dfa = 12;
} else if (c === 'a' ) {
dfa = 21;
} else {
dfa = -1;
}
}
function state12(c) {
if (c === 'b' ) {
dfa = 10;
} else if (c === 'a' ) {
dfa = 22;
} else {
dfa = -1;
}
}
function state20(c) {
if (c === 'b' ) {
dfa = 21;
} else if (c === 'a' ) {
dfa = 0;
} else {
dfa = -1;
}
}
function state21(c) {
if (c === 'b' ) {
dfa = 22;
} else if (c === 'a' ) {
dfa = 1;
} else {
dfa = -1;
}
}
function state22(c) {
if (c === 'b' ) {
dfa = 20;
} else if (c === 'a' ) {
dfa = 2;
} else {
dfa = -1;
}
}
function isAccepted(str) {
const len = str.length;
for (let i = 0; i < len; i++) {
if (dfa === 0)
start(str[i]);
else if (dfa === 1)
state01(str[i]);
else if (dfa === 2)
state02(str[i]);
else if (dfa === 10)
state10(str[i]);
else if (dfa === 11)
state11(str[i]);
else if (dfa === 12)
state12(str[i]);
else if (dfa === 20)
state20(str[i]);
else if (dfa === 21)
state21(str[i]);
else if (dfa === 22)
state22(str[i]);
else
return 0;
}
return (dfa === 0 || dfa === 11 || dfa === 22) ? 1 : 0;
}
const str = "aaaabbbb" ;
if (isAccepted(str))
console.log( "ACCEPTED" );
else
console.log( "NOT ACCEPTED" );
|
Python 3
def start( c):
if (c = = 'a' ):
dfa = 10
elif (c = = 'b' ) :
dfa = 1
else :
dfa = - 1
return dfa
def state01( c):
if (c = = 'a' ):
dfa = 11
elif (c = = 'b' ) :
dfa = 2
else :
dfa = - 1
return dfa
def state02( c):
if (c = = 'b' ) :
dfa = 0
elif (c = = 'a' ):
dfa = 12
else :
dfa = - 1
return dfa
def state10( c):
if (c = = 'b' ) :
dfa = 11
elif (c = = 'a' ):
dfa = 20
else :
dfa = - 1
return dfa
def state11( c):
if (c = = 'b' ) :
dfa = 12
elif (c = = 'a' ):
dfa = 21
else :
dfa = - 1
return dfa
def state12( c):
if (c = = 'b' ) :
dfa = 10
elif (c = = 'a' ):
dfa = 22
else :
dfa = - 1
return dfa
def state20( c):
if (c = = 'b' ) :
dfa = 21
elif (c = = 'a' ):
dfa = 0
else :
dfa = - 1
return dfa
def state21( c):
if (c = = 'b' ) :
dfa = 22
elif (c = = 'a' ):
dfa = 1
else :
dfa = - 1
return dfa
def state22( c):
if (c = = 'b' ) :
dfa = 20
elif (c = = 'a' ):
dfa = 2
else :
dfa = - 1
return dfa
def isAccepted( str ):
l = len ( str )
dfa = 0
for i in range (l):
if (dfa = = 0 ) :
start( str [i])
elif (dfa = = 1 ):
state01( str [i])
elif (dfa = = 2 ) :
state02( str [i])
elif (dfa = = 10 ) :
state10( str [i])
elif (dfa = = 11 ) :
state11( str [i])
elif (dfa = = 12 ) :
state12( str [i])
elif (dfa = = 20 ) :
state20( str [i])
elif (dfa = = 21 ) :
state21( str [i])
elif (dfa = = 22 ) :
state22( str [i])
else :
return 0
if (dfa = = 0 or dfa = = 11 or dfa = = 22 ) :
return 1
else :
return 0
if __name__ = = "__main__" :
string = "aaaabbbb"
if (isAccepted(string)) :
print ( "ACCEPTED" )
else :
print ( "NOT ACCEPTED" )
|
Output:
ACCEPTED
Last Updated :
29 Feb, 2024
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...