问题:构造一个接受语言 L = {a n b m | 的 DFA n > =1, (m) mod 3 = 1}。
解释:
在构建 DFA 时,需要记住以下几点:
这意味着任何元素,和 = 这意味着任何大于 1 的元素。
例子:
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)
方法:
它的构建应包含以下步骤:
- 步骤 1:构建 FA 表示具有大于 1 的任意数量的 a。
- 步骤 2:构建 FA 意味着有
- 第 3 步:构建 FA 意味着 b 等于 3 的倍数。
- 步骤 4:连接三个 FA 并制作单个 DFA。始终保持 a、b 和 c 的顺序。
鉴于 DFA 具有以下状态。状态 2 导致接受字符串 。而状态 0、1、3、4 和 5 导致拒绝字符串。
DFA 状态转换图:
让我们看看演示的代码:
C/C++
// C program to implement DFS that accepts // all string which follow the language // L = { a^n b^m ; n >=1, (m)mod 3=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 = 5; } // -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 = 1; } else if (c == 'b') { dfa = 2; } 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 = 5; } else { dfa = -1; } } // This function is for the third state (Q3)of DFA void state3(char c) { if (c == 'b') { dfa = 4; } else if (c == 'a') { dfa = 5; } else { dfa = -1; } } // This function is for the forth state (Q4)of DFA void state4(char c) { if (c == 'b') { dfa = 2; } else if (c == 'a') { dfa = 5; } else { dfa = -1; } } // This function is for the fifth state (Q5) of DFA void state5(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 if (dfa == 5) state5(str[i]); else return 0; } if (dfa == 2) return 1; else return 0; } // driver code int main() { char str[] = "aaabbbb"; 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 >=1, (m)mod 3=1} import java.util.*; 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 = 5; } // -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 = 1; } else if (c == 'b') { dfa = 2; } 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 = 5; } else { dfa = -1; } } // This function is for the third state (Q3)of DFA static void state3(char c) { if (c == 'b') { dfa = 4; } else if (c == 'a') { dfa = 5; } else { dfa = -1; } } // This function is for the forth state (Q4)of DFA static void state4(char c) { if (c == 'b') { dfa = 2; } else if (c == 'a') { dfa = 5; } else { dfa = -1; } } // This function is for the fifth state (Q5) of DFA static void state5(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 if (dfa == 5) state5(str[i]); else return 0; } if (dfa == 2) return 1; else return 0; } // Driver code public static void main(String[] args) { char str[] = "aaabbbb".toCharArray(); if (isAccepted(str)==1) System.out.println("ACCEPTED"); else System.out.println("NOT ACCEPTED"); } } // This code is contributed by Rajput-Ji
Python 3
# Python3 program to implement DFS that accepts # all Stringing which follow the language # L = {a ^ n b ^ m | n >= 1, (m)mod 3 = 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 = 5 # -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 = 1 elif (c == 'b'): dfa = 2 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 = 5 else: dfa = -1 return dfa # This function is for the third # dfa = state of DFA def state3(c): if (c == 'b'): dfa = 4 elif (c == 'a'): dfa = 5 else: dfa = -1 return dfa # This function is for the fouth # dfa = state of DFA def state4(c): if (c == 'b'): dfa = 2 elif (c == 'a'): dfa = 5 else: dfa = -1 return dfa # This function is for the fifth # dfa = state of DFA def state5(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]) elif (dfa == 5) : dfa = state5(String[i]) else: return 0 if(dfa == 2) : return 1 else: return 0 # Driver code if __name__ == "__main__" : String = "aaabbbb" 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 >=1, (m)mod 3=1} using System; public 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 = 5; } // -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 = 1; } else if (c == 'b') { dfa = 2; } 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 = 5; } else { dfa = -1; } } // This function is for the third state (Q3)of DFA static void state3(char c) { if (c == 'b') { dfa = 4; } else if (c == 'a') { dfa = 5; } else { dfa = -1; } } // This function is for the forth state (Q4)of DFA static void state4(char c) { if (c == 'b') { dfa = 2; } else if (c == 'a') { dfa = 5; } else { dfa = -1; } } // This function is for the fifth state (Q5) of DFA static void state5(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 if (dfa == 5) state5(str[i]); else return 0; } if (dfa == 2) return 1; else return 0; } // Driver code public static void Main(String[] args) { char []str = "aaabbbb".ToCharArray(); if (isAccepted(str)==1) Console.WriteLine("ACCEPTED"); else Console.WriteLine("NOT ACCEPTED"); } } // This code has been contributed by 29AjayKumar
输出:
ACCEPTED