我必须实现一个函数来检查FSM(有限状态自动机)下面是否接受了查询字符串
我已经制作了一个小型设计,基本上可以检索所需的所有数据。我仍然需要实现检查query_string中每个字符的代码,如果它在特定箭头中可用(转换)。
所以我们有例如查询字符串' aab'代码必须运行的方式是它检查查询中的第一个字符是否在从q0到q1的转换中可用。在这种情况下,这是正确的,那么代码需要去检查查询中的第二个字符是否存在于从q1到q2的转换中。这是真的。但是之后没有转换,所以查询中的第三个字符不存在于任何转换中,并且它需要返回false。如果接受查询字符串,则代码必须返回True 我对此非常陌生,所以我希望您能够理解下面的代码
代码:
def accept(fsm, query_string):
query_list = list(query_string)
# this is the list of the query string
print(query_list)
start = fsm1.get_initial_state()
betweenstates = fsm1.get_transitions()
endstates = fsm1.get_end_states()
# this function iterates through a dictionary and gives the available transtions per state
for i,j in betweenstates.items():
print("The transition to the next state" + str(i) + " : ")
for k in tuple(j):
print(k)
return False
print('This is the first query_string')
# This is the function that is ran
print(accept(fsm1, "b")) # should be True
print('\n')
print('This is the second query_string')
print(accept(fsm1, "aab")) # should be False
这是输出:
This is the first query_string
['b']
First entries for Q0 :
('a', 'Q1')
('b', 'Q1')
First entries for Q1 :
('a', 'Q2')
('', 'Q2')
('b', 'Q2')
False
This is the second query_string
['a', 'a', 'b']
First entries for Q0 :
('a', 'Q1')
('b', 'Q1')
First entries for Q1 :
('a', 'Q2')
('', 'Q2')
('b', 'Q2')
False
答案 0 :(得分:1)
编写有限状态机非常简单:
需要三个组件。
(state_old, state_new, char)
的3d数组)。 (epsilon边缘仅表示所有转换都有效)然后创建一个递归调用自身的函数。此函数将字符串作为输入,当前状态以及两组状态和转换表。如果字符串为空,则在状态为最终状态时返回true,如果state不是final,则返回false。如果该字符串不为空,则检查转换表中的条目以获取已通过状态和string[0]
,并使用string[1:]
和新状态调用自身,但这次是。
几乎就是这样。我没有故意在这里放任何代码,因为这是一个非常好的练习,可以自己完成。