提示:以下是本篇文章正文内容,下面案例可供参考
NFA到DFA的转化
概念:不确定的有穷自动机(NFA)与确定的有穷自动机(DFA)从功能上来说是等价的,它们所接受的语言类相同。给定一个NFA M’,构造一个DFA M,使得L(M’) = L(M)。以下介绍两个状态子集的计算方法,转化过程需要用到。
1.状态集P的 ɛ 闭包
若P是NFA M’的状态集Q的一个子集,则ɛ - closure§称为状态集P的 ɛ 闭包。计算方法如下:
1.1 若q∈P,则q∈ɛ - closure§,即P的所有成员都是P的ɛ 闭包的成员;
1.2 若q∈P,那么从q出发经过任意条 ɛ 弧而能到达的任何状态都属于 ɛ - closure§。
举例说明:
设NFA M’如下图所示,试求P={1},P={2},P={1,2} 的 ɛ 闭包。
解:当P={1}时,有
∵〥(1, ɛ) = 3, 〥(3, ɛ) = 4, 〥(3, ɛ) = 6
∴ ɛ - closure({1}) = {1,3,4,6}
同理得,
ɛ - closure({2}) = {2,6}
ɛ - closure({1,2}) = {1,2,3,4,6}
2.状态集P的a弧线转换集
设P是NFA M’的状态集Q的一个子集,P={P1, P2, P3,…,Pn},a∈∑,则Pa弧转换集为:Pa= ɛ - closure(J)
其中,J = 〥(P1, ɛ) ∪〥(P2, ɛ) ∪…∪〥(Pn, ɛ)
以图一为例说明:设P={1},试求Pa
Pa = ɛ - closure(J) = ɛ - closure(〥(1, a) ) = ɛ - closure({2,4}) = {2,4,6}
NFA构造DFA:
- 求NFA M’开始状态q0’ 的ɛ闭包,确定DNF的开始状态q0;
- 求开始状态q0对每个输入字符的弧转换集,确定与开始状态q0有关的状态转换函数;
- 对新的状态计算相关的状态转换函数;
- 根据产生的各个状态确定结束状态集F={p|p ∩ F‘ ≠ ∅},p为M的每个状态子集;
- 得到确定的有穷自动机,画出状态图或状态转换矩阵。
举例说明:
设NFA M’=(Q’, ∑’∪{ ɛ }, q0’, F’, 〥),其中Q‘ = {1,2,3,4},∑’ = {a,b,c},q0’={1},F’={4};如下图:
解:①求NFA M’开始状态q0’ 的ɛ闭包,确定DNF的开始状态q0
q0= ɛ - closure({q0’}) = ɛ - closure({1}) = {1, 4};
②求开始状态q0对每个输入字符的弧转换集,确定与开始状态q0有关的状态转换函数
〥(q0, a) = q0a = ɛ - closure(〥(1, a) ∪ 〥(4, a)) = {2, 3}; ---->新状态q1={2, 3}
〥(q0, b) = q0b = ∅;
〥(q0, c) = q0c = ∅;
③对新的状态计算相关的状态转换函数
〥(q1, a) = q1a = {2}; ---->新状态q2={2}
〥(q1, b) = q1b = {4}; ---->新状态q3={4}
〥(q1, c) = q1c ={3, 4}; ---->新状态q4={3, 4}
q2 | q3 | q4 |
---|---|---|
〥(q2, a) = q2a = q2; | 〥(q3, a) = q3a = ∅; | 〥(q4, a) = q4a = ∅; |
〥(q2, b) = q2b = q3; | 〥(q3, b) = q3a = ∅; | 〥(q4, b) = q4c = ∅; |
〥(q2, c) = q2c = ∅; | 〥(q3, c) = q3b = ∅; | 〥(q4, c) = q4c = q4; |
④根据各个状态确定结束状态集F={p|p ∩ F‘ ≠ ∅},p为M的每个状态子集
∵q0={1, 4}, q1={2, 3}, q2= {2}, q3={4}, q4={3, 4} 与F‘={4} 相交不为空
∴F={q0,q3,q4}
⑤得到确定的有穷自动机,状态图或状态转换矩阵(读者可自行画出)
DFA M = ({q0, q1, q2, q3, q4}, {a, b, c}, {1, 4}, {q0, q3, q4}, 〥)
写在最后:
深入学习建议阅读《编译原理及实现》(第2版-清华大学出版社)作者 孙悦红