📜  来自 RHS 的第二个符号是“a”的字符串的DFA

📅  最后修改于: 2021-09-28 09:28:52             🧑  作者: Mango

先决条件——有限自动机简介
问题 –绘制包含 {a, b} 上所有字符串集合的语言的确定性有限自动机 (DFA),其中来自 RHS 的第二个符号是“a”。

倒数第二个符号是“a”的字符串是:

aa, ab, aab, aaa, aabbaa, bbbab etc

例如:

INPUT : baba
OUTPUT: NOT ACCEPTED

INPUT: aaab
OUTPUT: ACCEPTED

直接构造给定问题的 DFA 非常复杂。因此,在这里我们将设计非确定性有限自动机(NFA),然后将其转换为确定性有限自动机(DFA)。

包含来自 RHS 的第二个符号为“a”的所有字符串的语言的 NFA 是:

这里,A 是初始状态,C 是最终状态。
现在,我们要构建上述 NFA 的状态转移表。

之后我们将在NFA的状态转移表上使用子集配置绘制DFA的状态转移表。我们将提及 a 和 b 的所有可能转换。

现在,借助转换表绘制 DFA 变得非常容易。在这个 DFA 中,我们有四种不同的状态 A、AB、ABC 和 AC,其中 ABC 和 AC 是最终状态,A 是 DFA 的初始状态。

这是我们所需的语言 DFA,其中包含 {a, b} 上的所有字符串的集合,其中来自 RHS 的第二个符号是“a”。

过渡表:

STATES INPUT (a) INPUT (b)
—> A (initial state) AB A
AB ABC* (final state) AC* (final state)
AC* (final state) AB A
ABC* (final state) ABC* (final state) AC* (final state)

Python实现:

def stateA(n):
    #if length found 0 
    #print not accepted
    if (len(n)==0):
        print("string not accepted")
    else:    
          
        #if at index 0 
        #'a' found call 
        #function stateAB 
        if(n[0]=='a'):
            stateAB(n[1:])
              
        #else if 'b' found 
        #call function A.    
        elif (n[0]=='b'):
            stateA(n[1:])
          
def stateAB(n):
    #if length found 0 
    #print not accepted
    if (len(n)==0):
        print("string not accepted")
    else:
          
        #if at index 0 
        #'a' found call 
        #function stateABC
        if(n[0]=='a'):
            stateABC(n[1:])
              
        #else if 'b' found 
        #call function AC.     
        elif (n[0]=='b'):
            stateAC(n[1:]) 
          
def stateABC(n):
    #if length found 0 
    #print accepted
    if (len(n)==0):
        print("string accepted")
    else:
          
        #if at index 0 
        #'a' found call 
        #function stateABC
        if(n[0]=='a'):
            stateABC(n[1:])
              
        #else if 'b' found 
        #call function AC.     
        elif (n[0]=='b'):
            stateAC(n[1:])
          
def stateAC(n):
    #if length found 0 
    #print accepted
    if (len(n)==0):
        print("string accepted")
    else:
        #if at index 0 
        #'a' found call 
        #function stateAB
        if(n[0]=='a'):
            stateAB(n[1:])
              
        #else if 'b' found 
        #call function A.     
        elif (n[0]=='b'):
            stateA(n[1:])        
    
  
#take string input
n=input()
  
#call stateA
#to check the input
stateA(n)