具有 e动作的NFA的确定化算法
算法:子集法
- 与不存在e的NFA不一样,开始状态在查找过程中,因为e的存在,递归进行a/b时会产生n个不确定的状态链,需要对这些多个e组成的状态链,在转化为DFA过程中,转换,去除。从而达到可以转化成为DFA。也是必要条件。
算法解析:
![ab2c596724bcb0ae34c3e596ee17ffdc.png](https://i-blog.csdnimg.cn/blog_migrate/45de7615ebd1fdd8cf0cfed791a632cb.jpeg)
- 初始C={};
- e-closure(0)的意思是:从位于0的开始状态,经由任意条e弧而能到达的状态的集合。所以 e-closure(0)={0,1,2,4,7},{0,1,2,4,7}是新的唯一的状态,加入到C集合中,用T0表示。T0=e-e-closure(0)={0,1,2,4,7}。
- 不能标识的意思:因为它是一个新的状态,我们在转化为DFA时,不能识别出它是已具有的与a,b前驱后继的状态,那么DFA在转化过程中,这个状态没办法与a,b建立关系,这样的后果是,a,b和这个状态没什么连接关系。所以,针对新的不能识别的状态,我们让它参与到a,b的路径定位运算。使得它可以成为一个能被DFA在转化过程中所接受的一个状态。
- Move(T0,a)意思是:在T0状态集中,查找与a路径相关的状态的集合。
- 即:e-closure(move(T0,a)={0,1,2,3,4,6,7,8},先查找C集合中,有没有对应的状态,明显没有,所以再定义一个T1,T1=e-closure(move(T0,a)={0,1,2,3,4,6,7,8},(以e弧相关状态为基础求与a弧相关状态的集合)。
- 参与完到a,的路径定位运算后,接着b.
- e-closure(move(T0,b)={1,2,4,5,6,7}先查找C集合中,有没有对应的状态,明显没有,所以再定义一个T2,
- 此时C集合为{T0,T1,T2}
- T0参与完 a,b的路径定位运算后。该T1。
- 所以接着让T1也执行T0的操作,即T1查找与a弧相关的状态集。
- e-closure(move(T1,a)={1,2,3,4,6,7,8},先查找C集合中,有没有对应的状态,发现对应于C集合中T1,即在DFA转化过程中,可以找到与a,b弧对应的状态标识。所以不需要再定义新的Ti,(i->1,2,3 ……)
- T1执行b
- e-closure(move(T1,b)={1,2,4,5,6,7,9},先查找C集合中,有没有对应的状态,明显没有,所以再定义一个T3,C={T0,T1,T2,T3};
- 接着让T2执行操作,即T2查找与a,b弧相关的状态集。
- e-closure(move(T2,a)={1,2,3,4,6,7,8},先查找C集合中,有没有对应的状态,发现对应于C集合的T1.
- T2执行b
- e-closure(move(T2,b)={1,2,4,5,6,7},查找C集合中, 发现对应于C集合的T2.
- 接着让T3执行操作,即T3查找与a,b弧相关的状态集。
- e-closure(move(T3,a)={1,2,3,4,6,7,8},查找C集合中, 发现对应于C集合的T1.
- e-closure(move(T3,b)={1,2,3,5,6,7,10},查找C集合中,有没有对应的状态,明显没有,所以再定义一个T4,C={T0,T1,T2,T3,T4};
- 接着让T4执行操作,即T4查找与a,b弧相关的状态集。
- e-closure(move(T4,a)={1,2,3,4,6,7,8},查找C集合中, 发现对应于C集合的T1.
- e-closure(move(T4,b)={1,2,4,5,6,7},查找C集合中, 发现对应于C集合的T2.
C集合查找新状态对应完毕。
综上信息归纳:M={S,E,D,S0,St}
T0={0,1,2,4,7}
T1={1,2,3,4,6,7,8}
T2={1,2,4,5,6,7}
T3={1,2,4,5,6,7,9}
T4={1,2,4,5,6,7,10}
S={[T0],[T1],[T2],[T3],T[4]}
E={a,b}
D([T0],a)= [T1]
D([T0],b)= [T2]
D([T1],a)= [T1]
D([T1],b)= [T3]
D([T2],a)= [T1]
D([T2],b)= [T2]
D([T3],a)= [T1]
D([T3],b)= [T4]
D([T4],a)= [T1]
D([T4],a)= [T2]
S0=[T0]
St=[T4]
- 由上面推导的内容,就可以将NFA有e符号的弧,转化为无符号的DFA。