📜  为输入 (a,b) 的长度不小于 4 的游程实施 DFA

📅  最后修改于: 2022-05-13 01:54:10.497000             🧑  作者: Mango

为输入 (a,b) 的长度不小于 4 的游程实施 DFA

DFA 或确定性有限自动机是一种有限状态机,其中在每个输入字母表上,根据字符串接受的需要,根据一组定义的规则从一个状态转换到另一个状态。
在这个特殊的问题中,长度是要考虑的因素。输入字母是{a,b}。没有长度小于 4 的运行意味着任何输入字母至少重复 4 次。

例子:

逐步设计 DFA:
Step-1:首先我们要考虑输入的是什么输入字母。因为这大约是至少 4 次运行的长度。在状态“A”上输入字母为“a”并将该状态标记为初始状态。输入“a”发生以下转换:

  • 从状态“A”到状态“B”
  • 从状态“B”到状态“C”
  • 从状态“C”到状态“D”
  • 从状态“D”到状态“E”

输入长度为 4

步骤2:如上述步骤,输入最少4 个可接受的a,因此使状态“E”为最终状态。长度超过 4 的运行也是可以接受的,因此将“a”的自循环放在最终状态“E”上。

将状态“E”标记为最终状态

Step-3:到目前为止,机器设计是通过输入字母'a'完成的。但是状态“A”的输入字母'b'需要处理。现在对状态“A”上的输入字母“b”执行相同的过程。在输入“b”上发生以下转换:

  • 从状态“A”到状态“F”
  • 从状态“F”到状态“G”
  • 从状态“G”到状态“H”
  • 从状态“H”到状态“Q”

将状态“Q”标记为最终状态。并且长度超过 4 的运行也是可以接受的,因此将自循环置于最终状态“Q”。

输入字母“b”转换

Step-4:到目前为止,我们只处理了单个输入 a 或 b,即 aaaa 和 bbbb,但现在处理两个输入,例如 aaaabbbb 或 aaaabbbbaaaaa 等。
对于输入“b”从状态“E”到状态“F”的转换以及输入“a”从状态“Q”到状态“B”的转换。

Step-5:现在处理剩余的输入字母,到目前为止,设计的机器已经涵盖了所有可能的可接受情况,并且剩余的输入字母也不会进入死状态“DS”。

最终设计

上述DFA的转换表:
这里“A”是初始状态,“E”和“Q”是最终状态。 DS被称为死亡状态

转换表

上述 DFA 的Python实现:

Python3
def checkStateA(n):
    # if length of is 0
    # print string not accepted
    if(len(n)== 0):
        print("string not accepted")
         
    else:
        # if 'a' is found
        # call stateB function
        # else call stateF
        # function
        if(n[0]=='a'):
            stateB(n[1:])
        else:
            stateF(n[1:])
     
 
def stateB(n):
    # if length of is 0
    # print string not accepted
    if (len(n)== 0):
        print("string not accepted")
         
    else:   
        # if 'a' is found
        # call stateC function
        # print string not
        # accepted
        if(n[0]=='a'):
            stateC(n[1:])
        else:
            print("string not accepted")
     
     
def stateC(n):
    # if length of is 0
    # print string not accepted
    if (len(n)== 0):
        print("string not accepted")
         
    else:  
        # if 'a' is found
        # call stateD function
        # print string not
        # accepted
        if(n[0]=='a'):
            stateD(n[1:])
        else:
            print("string not accepted")
     
     
def stateD(n):
    # if length of is 0
    # print string not accepted
    if(len(n)== 0):
        print("string not accepted")
         
    else:   
        # if 'a' is found
        # call stateE function
        # print string not
        # accepted
        if(n[0]=='a'):
            stateE(n[1:])
        else:
            print("string not accepted")
         
         
def stateE(n):
    # if length of is 0
    # print string accepted
    if(len(n)== 0):
        print("string accepted")
         
    # if 'a' is found
    # call stateE function
    # if 'b' is found
    # call stateF function   
    elif(n[0]=='a'):
        stateE(n[1:])
    elif(n[0]=='b'):
        stateF(n[1:])
         
         
def stateF(n):
    # if length of is 0
    # print string not accepted
    if(len(n)== 0):
        print("string not accepteed")
         
    else:
        # if 'b' is found
        # call stateG function
        # print string not
        # accepted
        if(n[0]=='b'):
            stateG(n[1:])
        else:
            print("string not accepted")
     
     
def stateG(n):
    # if length of is 0
    # print string not accepted
    if(len(n)== 0):
        print("string not accepteed")
         
    else:   
        # if 'b' is found
        # call stateHfunction
        # print string not
        # accepted
        if(n[0]=='b'):
            stateH(n[1:])
        else:
            print("string not accepted")
             
             
def stateH(n):
    # if length of is 0
    # print string not accepted
    if(len(n)== 0):
        print("string not accepteed")
         
    else: 
        # if 'b' is found
        # call stateQ function
        # print string not
        # accepted
        if(n[0]=='b'):
            stateQ(n[1:])
        else:
            print("string not accepted") 
             
             
def stateQ(n):
    # if length of is 0
    # print string accepted
    if(len(n)== 0):
        print("string accepteed")
         
    else:  
        # if 'b' is found
        # call stateQ function
        # else call stateB function
        if(n[0]=='b'):
            stateQ(n[1:])
        elif(n[0]=='a'):
            stateB(n[1:])           
     
         
         
 
# Driver code
if __name__ == '__main__':
 
    # input string 1
    n ="aaaabbbbbaaaa"
 
    # function call to check the string
    checkStateA(n)
 
    # input string 2
    n ="aaaabbb"
 
    # function call to check the string
    checkStateA(n)


输出:
string accepted
string not accepteed