Python - 创建一个函数来检查给定的FSM是否接受给定的查询字符串

时间:2018-04-10 18:42:02

标签: python fsm

我必须实现一个函数来检查FSM(有限状态自动机)下面是否接受了查询字符串

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

1 个答案:

答案 0 :(得分:1)

编写有限状态机非常简单:

需要三个组件。

  1. 一组状态(整数列表)
  2. 一组最终状态(整数列表)
  3. 转换矩阵(bool (state_old, state_new, char)的3d数组)。 (epsilon边缘仅表示所有转换都有效)
  4. 然后创建一个递归调用自身的函数。此函数将字符串作为输入,当前状态以及两组状态和转换表。如果字符串为空,则在状态为最终状态时返回true,如果state不是final,则返回false。如果该字符串不为空,则检查转换表中的条目以获取已通过状态和string[0],并使用string[1:]和新状态调用自身,但这次是。

    几乎就是这样。我没有故意在这里放任何代码,因为这是一个非常好的练习,可以自己完成。