我目前正在为python中的epsilon闭包创建一个函数。我正在使用递归来运行使用epsilon的NFA中的每个可能的转换。我对该函数的输入是一个格式为:
的字典tf2 = {('q0','a') : 'q1', ('q1','eps') : ['q2', 'q3'], ('q3','eps') : 'q0', ('q2','a') : 'q4', ('q4','eps') : 'q3'}
其中键是2元组(当前状态,输入),值是结果状态。
在这种情况下,我试图关闭的转换是'eps'
是键的第二部分的转换。
我遇到的问题是每当传入包含列表的值时(比如在('q1','eps') : ['q2', 'q3']
条目中),我的递归会因"unhashable type: 'list'"
异常而失败。
我现在的代码如下:
tf2 = {('q0','a') : 'q1', ('q1','eps') : ['q2', 'q3'], ('q3','eps') : 'q0', ('q2','a') : 'q4', ('q4','eps') : 'q3'}
def epsilonClosure(transition, state):
closure = []
if (state, 'eps') not in transition: # epsilon transition not possible
return closure
elif (state, 'eps') in transition: # epsilon transition is possible
closure.append(state)
state = transition[(state, 'eps')]
epsilonClosure(transition, state)
if state not in closure: # adds current state to list if not visited before
closure.append(state)
return closure
epsilonClosure(tf2, 'q1')
此代码适用于字典中的非列表值,但在命中列表时会中断。
任何帮助将不胜感激,谢谢!
-edit 固定代码,因此在隔离时可执行。遗憾!
答案 0 :(得分:0)
让我们暂时忽略错误,并根据问题进行思考。您的函数需要状态名称作为变量state
的值。但是,列表['q2', 'q3']
不是有效状态。而是每个字符串'q2'
和'q3'
都是。您需要修改算法以将此考虑在内。我可以想到两个选择:
更改参数列表以接受状态的列表。然后迭代这个列表。
更改递归调用以调用列表中每个状态的函数。
如果您可以控制字典输入,我建议您使用列表作为所有值。您可以在需要时轻松制作包含一个州的列表。这将允许您编写算法以始终处理状态名称列表。
如果您无法执行此操作,则首先必须检查字典中的值是否为列表,并将其处理为与字符串不同。