📜  设计确定性有限自动机(第 11 组)

📅  最后修改于: 2021-09-28 10:18:07             🧑  作者: Mango

先决条件:设计有限自动机
在本文中,我们将看到确定性有限自动机(DFA)的设计。

问题:在 {a, b} 上构造一个接受字符串集的最小 DFA,其中 Number of a(w) mod 2 = 0 或 Number of b(w) mod 2 = 0 即,’a’ 的数目应该是可整除的by 2 或 ‘b’ 的数量应该可以被 2 整除,或者两者都可以被 2 整除,其中 ‘w’ 是 {a, b} 上的任何字符串。

说明:所需的语言将类似于:

L1 = {ε, aa, aabb, aab, bb, bba, ...........}

在这里,我们可以看到上述语言的每个字符串都满足给定问题的条件,即,这里 ε 被接受,因为 ‘a’ 和 ‘b’ 的数量都为零,而其余的字符串具有 ‘a’可被 2 整除或 ‘b’ 可被 2 整除,或两者均可被 2 整除。

但是此 DFA 不接受以下语言,因为它的字符串不满足给定问题的条件。

L2 = {ba, bbba, baaa, ..............}

在这里我们可以看到,上述语言的字符串都不满足给定问题的条件,即“a”或“b”或以上任何字符串都不能被 2 整除。

所需语言的状态转换图如下所示:

在上面的 DFA 中,在每个州都有一个州名作为“A”,在它的正下方有 (ee) 表示“a”的数量是偶数 (e) 和“b”的数量是偶数 (e ) 也。对于状态名称为“B”,其正下方有(eo)表示“a”的数量是偶数(e),“b”的数量是奇数(o)等等。

  • 初始和最终状态 ‘A’ 在将 ‘a’ 作为输入时,它转换到最终状态 ‘D’,在获取 ‘b’ 作为输入时,它转换到另一个最终状态 ‘B’。
  • 将“a”作为输入时的最终状态“B”转换为状态“C”,并在输入返回到初始状态“A”时获得“b”。
  • 另一个最终状态 ‘D’ 在将 ‘b’ 作为输入时它转换到状态 ‘C’ 并在获得 ‘a’ 作为输入时返回到初始状态 ‘A’。
  • 状态 ‘C’ 在将 ‘b’ 作为输入时转换到最终状态 ‘D’ 并在获得 ‘a’ 作为输入时返回到状态 ‘B’。

Python实现:

def stateA(n):
    #if length of n become 0 
    #then print accepted
    if(len(n)==0):
        print("string accepted")
          
    else: 
        #if at zero index 
        #'a' found call
        #stateD function    
        if (n[0]=='a'):
            stateD(n[1:])
          
        #if at zero index 
        #'b' found call
        #stateB function    
        elif (n[0]=='b'):
            stateB(n[1:])    
         
def stateB(n):
    #if length of n become 0 
    #then print accepted
    if(len(n)==0):
        print("string accepted")
          
    else:  
        #if at zero index 
        #'a' found call
        #stateC function    
        if (n[0]=='a'):
            stateC(n[1:])
              
        #if at zero index 
        #'b' found call
        #stateA function    
        elif (n[0]=='b'):
            stateA(n[1:])    
          
def stateC(n):
    #if length of n become 0 
    #then print not accepted
    if(len(n)==0):
        print("string not accepted")
          
    else:
        #if at zero index 
        #'a' found call
        #stateB function    
        if (n[0]=='a'):
            stateB(n[1:])
              
        #if at zero index 
        #'b' found call
        #stateD function    
        elif (n[0]=='b'):
            stateD(n[1:])    
          
def stateD(n):
    #if length of n become 0 
    #then print accepted
    if(len(n)==0):
        print("string accepted")
          
    else: 
        #if at zero index 
        #'a' found call
        #stateA function    
        if (n[0]=='a'):
            stateA(n[1:])
              
        #if at zero index 
        #'b' found call
        #stateC function    
        elif (n[0]=='b'):
            stateC(n[1:])    
  
              
              
#take input
n=input()
  
#call stateA function
#to check the input
stateA(n)