1.任务要求
从具有epsilon的不确定有限状态自动机(NFA)得到一个无Epsilon 的NFA。
2.思路
Epsilon-NFA到NFA的目标主要是产生一个没有Epsilon边的,跟原状态图等价的新状态图。过程不复杂,首先从起始状态开始,寻找所有Epsilons边到达的对象的集合,然后复制这个集合的所有状态包含的非Epsilon状态。其实状态做完之后,寻找所有能够产生非Epsilon边的状态然后重复这个过程,最后NFA就出来了。
其本质就是使用无Epsilon的状态转换函数中的条件去替换有Epsilon的状态转换函数中的Epsilon,不断循环,最终实现NFA中的条件无Epsilon。
global nfa
nfa = parser.parse_fa()
closures = parser.parse_closures()
# TODO: implement this
print(",".join(nfa['states']))
print(",".join(nfa['alphabet']))
print(nfa['start'])
print(",".join(nfa['final']))
global dfa
dfa = {}
dfa['delta'] = []
dfa['final'] = nfa['final']
start = nfa['start']
start_e = closures[start]
begin = nfa['start']
alpha = nfa['alphabet']
delta = nfa['delta']
final = nfa['final']
# seach all relations can arrive from a ,and m is means the intermediate variable
# it means if a->b and b->c, then we van get a->c
def search(a, m, delta, closures):
for re in closures[a]:
for relation in delta:
s, c, t = relation
if re == s:
if ((a, c, t)) not in h:
h.append((a, c, t))
global h
# get others delta by adding a search function
for relation in delta:
s, c, t = relation
if c:
dfa['delta'].append((s, c, t))
h = dfa['delta']
for a in nfa['states']:
search(a, a, dfa['delta'], closures)
for a in nfa['states']:
for re in h:
s, c, t = re
if s == a:
print("{},{},{}".format(s, c, t))
print("end")
4.结果
输入:

输出:

博客主要围绕从具有epsilon的不确定有限状态自动机(NFA)得到无Epsilon的NFA展开。介绍了转换思路,即产生无Epsilon边且与原状态图等价的新状态图,用无Epsilon的状态转换条件替换有Epsilon的条件,最终实现NFA条件无Epsilon,并给出了输入输出情况。

7753

被折叠的 条评论
为什么被折叠?



