将Epsilon-NFA转换为NFA--python实现

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

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.结果

输入:

在这里插入图片描述

输出:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还是少年呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值