Construct a DFA which accept the language L = {anbm | n > =1, (m) mod 3 = 1}
Last Updated :
11 Jul, 2019
Problem: Construct a DFA which accept the language L = {a
nb
m | n > =1, (m) mod 3 = 1}.
Explanation:
For constructing the DFA, the following things to be remember:
which means any no of elements, and
= which means any no of elements greater than 1.
Examples:
Input: a a b b b
Output: NOT ACCEPTED
// n = 2 (>=1), m=3 ((3) mod3 != 1)
Input: a a a b
Output: ACCEPTED
// n = 3 (>=1), m = 1 ((1) mod 3= 1)
Input: b b b b
Output: NOT ACCEPTED
// n = 0(must be >=1), m = 4 ((4) mod 3 = 1)
Approaches:
It’s construction should contain the following steps:
- Step-1: Construct FA for means having any number of a’s greater than one.
- Step-2: Construct FA for means having exactly
- Step-3: Construct FA for means having b’s equal to multiple of 3 .
- Step-4: Concatenate the three FA and make single DFA. Always maintain the order of a, b and c.
Given DFA has following states. State 2 leads to the acceptance of the string.Whereas states 0, 1, 3, 4 and 5 leads to the rejection of the string.
DFA State Transition Diagram:
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 = 1;
}
else if (c == 'b' ) {
dfa = 5;
}
else {
dfa = -1;
}
}
void state1( char c)
{
if (c == 'a' ) {
dfa = 1;
}
else if (c == 'b' ) {
dfa = 2;
}
else {
dfa = -1;
}
}
void state2( char c)
{
if (c == 'b' ) {
dfa = 3;
}
else if (c == 'a' ) {
dfa = 5;
}
else {
dfa = -1;
}
}
void state3( char c)
{
if (c == 'b' ) {
dfa = 4;
}
else if (c == 'a' ) {
dfa = 5;
}
else {
dfa = -1;
}
}
void state4( char c)
{
if (c == 'b' ) {
dfa = 2;
}
else if (c == 'a' ) {
dfa = 5;
}
else {
dfa = -1;
}
}
void state5( char c)
{
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)
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
return 0;
}
if (dfa == 2)
return 1;
else
return 0;
}
int main()
{
char str[] = "aaabbbb" ;
if (isAccepted(str))
printf ( "ACCEPTED" );
else
printf ( "NOT ACCEPTED" );
return 0;
}
|
Java
import java.util.*;
class GFG {
static int dfa = 0 ;
static void start( char c)
{
if (c == 'a' ) {
dfa = 1 ;
}
else if (c == 'b' ) {
dfa = 5 ;
}
else {
dfa = - 1 ;
}
}
static void state1( char c)
{
if (c == 'a' ) {
dfa = 1 ;
}
else if (c == 'b' ) {
dfa = 2 ;
}
else {
dfa = - 1 ;
}
}
static void state2( char c)
{
if (c == 'b' ) {
dfa = 3 ;
}
else if (c == 'a' ) {
dfa = 5 ;
}
else {
dfa = - 1 ;
}
}
static void state3( char c)
{
if (c == 'b' ) {
dfa = 4 ;
}
else if (c == 'a' ) {
dfa = 5 ;
}
else {
dfa = - 1 ;
}
}
static void state4( char c)
{
if (c == 'b' ) {
dfa = 2 ;
}
else if (c == 'a' ) {
dfa = 5 ;
}
else {
dfa = - 1 ;
}
}
static void state5( char c)
{
dfa = - 1 ;
}
static int isAccepted( char str[])
{
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
return 0 ;
}
if (dfa == 2 )
return 1 ;
else
return 0 ;
}
public static void main(String[] args) {
char str[] = "aaabbbb" .toCharArray();
if (isAccepted(str)== 1 )
System.out.println( "ACCEPTED" );
else
System.out.println( "NOT ACCEPTED" );
}
}
|
Python 3
def start(c):
if (c = = 'a' ):
dfa = 1
elif (c = = 'b' ):
dfa = 5
else :
dfa = - 1
return dfa
def state1(c):
if (c = = 'a' ):
dfa = 1
elif (c = = 'b' ):
dfa = 2
else :
dfa = - 1
return dfa
def state2(c):
if (c = = 'b' ):
dfa = 3
elif (c = = 'a' ):
dfa = 5
else :
dfa = - 1
return dfa
def state3(c):
if (c = = 'b' ):
dfa = 4
elif (c = = 'a' ):
dfa = 5
else :
dfa = - 1
return dfa
def state4(c):
if (c = = 'b' ):
dfa = 2
elif (c = = 'a' ):
dfa = 5
else :
dfa = - 1
return dfa
def state5(c):
dfa = - 1
return dfa
def isAccepted(String):
l = len (String)
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])
else :
return 0
if (dfa = = 2 ) :
return 1
else :
return 0
if __name__ = = "__main__" :
String = "aaabbbb"
if (isAccepted(String)) :
print ( "ACCEPTED" )
else :
print ( "NOT ACCEPTED" )
|
C#
using System;
public class GFG {
static int dfa = 0;
static void start( char c)
{
if (c == 'a' ) {
dfa = 1;
}
else if (c == 'b' ) {
dfa = 5;
}
else {
dfa = -1;
}
}
static void state1( char c)
{
if (c == 'a' ) {
dfa = 1;
}
else if (c == 'b' ) {
dfa = 2;
}
else {
dfa = -1;
}
}
static void state2( char c)
{
if (c == 'b' ) {
dfa = 3;
}
else if (c == 'a' ) {
dfa = 5;
}
else {
dfa = -1;
}
}
static void state3( char c)
{
if (c == 'b' ) {
dfa = 4;
}
else if (c == 'a' ) {
dfa = 5;
}
else {
dfa = -1;
}
}
static void state4( char c)
{
if (c == 'b' ) {
dfa = 2;
}
else if (c == 'a' ) {
dfa = 5;
}
else {
dfa = -1;
}
}
static void state5( char c)
{
dfa = -1;
}
static int isAccepted( char []str)
{
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
return 0;
}
if (dfa == 2)
return 1;
else
return 0;
}
public static void Main(String[] args) {
char []str = "aaabbbb" .ToCharArray();
if (isAccepted(str)==1)
Console.WriteLine( "ACCEPTED" );
else
Console.WriteLine( "NOT ACCEPTED" );
}
}
|
Output:
ACCEPTED
Share your thoughts in the comments
Please Login to comment...