题目预览
本来是准备直接在网上找代码修改一下,写到实验报告算了,结果发现网上的代码都没有什么很详细的解释,只有代码,而且不是交互式的输入,所以自己用Python写了一个模拟DFA。
代码里面的注释很详细了,在这里就不做过多解释。上代码!
代码实现
class DFA:
# 初始化函数,传入状态集、输入集、转移函数集、初态、终态
def __init__(self, states, my_inputs, move, s, e):
self.states = states
self.my_inputs = my_inputs
self.move = move
self.s = s
self.e = e
# 判断是否接受输入字符串x
def is_accept(self):
count = 0
while self.my_inputs[count] is not '#':
# 先判断遇到该字符当前状态是否能够转移到下一状态
if self.my_inputs[count] in self.move[self.s].keys():
# 有下一状态,将下一状态赋值给s0
self.s = self.move[self.s][self.my_inputs[count]]
count += 1
else:
# 如果没有下一状态,说明出错,不接受该输入串
return 0
# 如果上述循环成功执行,最后的状态是否为终态,如果不是,返回0
if self.s is not self.e:
return 0
return 1
if __name__ == '__main__':
'''
首先让用户输入初始数据,包括:
1)状态总数states:此程序中所有状态均由数字表示,如果用户输入4,则states = [0, 1, 2, 3]
2)输入字符串my_inputs: 字符串形式
3)转移状态集move:形式如:[dict1, dict2, dict3……],转移状态集是一个列表,有几个状态里面就包含几个字典。
比如[dict1, dict2, dict3]就表示当前有三个状态dict1里面存储的就是0状态会转移的状态,dict2存储的是1状态
会转移的状态。假如现在0状态遇到字符a会转移到1状态,那么dict1 = {'a': 1}
4)初态s:数字形式表示
5)终态e:数字形式表示
'''
# 用户输入状态总数
statu_number = int(input("请输入状态总数:"))
# 用户输入转移规则,顺带着一块创建
states = []
move = []
# 用户输入初态和终态
s = int(input("请输入初态:"))
e = int(input("请输入终态:"))
# 用户输入待检测的字符串
my_inputs = input("请输入待检测的字符串,以#结尾:")
# 用户输入字符的种类
types = input("请输入字符串中不同的字符,比如aba就输入a,b、abca就输入a,b,c:")
type_results = types.split(',')
for i in range(0, statu_number):
states.append(i)
dict = {}
for j in type_results:
next_state = int(input("请输入状态" + str(i) + "遇到字符" + j + "时转移的状态").replace(' ', ''))
dict[j] = next_state
move.append(dict)
# 创建一个DFA,并调用is_accept函数
dfa = DFA(states, my_inputs, move, s, e)
result = dfa.is_accept()
if result == 1:
print("Congratulations,DFA接受此字符串!")
else:
print("Sorry, DFA不接受此字符串")