Python實現模擬DFA算法

算法:模擬DFA
輸入: DFA D和輸入字符串x,D的初態爲s0, 終態集爲F。
輸出: 若D接受x,回答‘yes’,否則回答‘no’


# 構造DFA
class DFA:
    # 初始化DFA
    def __init__(self, S, s0, F, move):
        self.S = S  # 狀態集(list)
        self.s0 = s0  # 初態(int)
        self.F = F  # 終態(int)
        self.move = move  # 狀態轉移函數(list套dict)

    # 判斷是否接受x
    def isAccept(self,x):
        print('開始判斷是否接受輸入的字符串x')
        for ch in x:
            # 如果能轉換(判斷字典中是否存在key爲'ch')
            if ch in move[self.s0]:
                self.s0=move[self.s0][ch]
            #如果不能轉換,直接返回拒絕
            else:
                print('輸入被拒絕~~')
                return 0

        #判斷是否達到終態
        if self.s0==self.F:
            print('輸入被接受~~')
        else:
            print('輸入被拒絕~~')
        return 0

if __name__ == '__main__':
    print("---------本程序用於識別正規式爲'(a|b)*abb'的字符序列---------")
    #手動輸入DFA元素
    #S = [0, 1, 2, 3]
    S = eval(input("請輸入DFA的狀態集S,輸入格式爲List,如'[0, 1, 2, 3]' :"))#動態輸入成功
    #s0 = 0
    s0 = int(input("請輸入DFA的初態s0,如'0' :"))#動態輸入成功
    #F = 3
    F = int(input("請輸入DFA的終態F,如'3' :"))#動態輸入成功

    #move = [{'a': 1, 'b': 0}, {'a': 1, 'b': 2}, {'a': 1, 'b': 3}, {'a': 1, 'b': 0}]
    print("請輸入DFA的狀態轉移矩陣,輸入格式爲List嵌套Dict,如'[{'a': 1, 'b': 0}, {'a': 1, 'b': 2}, {'a': 1, 'b': 3}, {'a': 1, 'b': 0}]' ")
    move = eval(input(":"))
    #動態獲取DFA元素

    D = DFA(S, s0, F, move)
    while True:
        print(' ')
        x = input('請輸入要識別的字符串x:')#提示輸入
        if x=='quit':
            print('程序結束運行')
            break
        D.isAccept(x)  # 判斷是否接受
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章