算法:模擬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) # 判斷是否接受