文章目录
NFA
- 在 NFA 中,对于一个状态节点(
q
0
q_0
q0) ,通过某个字符
1
1
1 可以到达另外的多种状态节点,
q
0
q_0
q0 通过
1
1
1 可以到达
q
1
,
q
2
q_1, q_2
q1,q2 所以说他是非确定性的 (non-determinism)
- 对同一个语言(language)NFA 往往表现的更加的智能
- 上图中的
w
w
w 如果用 DFA 表示,则如下:
NFA 的 ϵ \epsilon ϵ 转换状态(transition)
- NFA 同样支持一个状态通过空串
ϵ
\epsilon
ϵ 转换到另外一个状态(DFA不支持这种做法);如下:
- 这表示了两个 languages 的 union(并集) 操作;
NFA 的多初始状态(Multiple Start State)
- 这样只需要四个状态即可完成整幅图的描述
NFA 的一般性定义
- 与一般的 DFA 不同,NFA 的字符集包括空字符 ϵ \epsilon ϵ,即 Σ ϵ = Σ ∪ { ϵ } \Sigma_\epsilon=\Sigma\cup\{\epsilon\} Σϵ=Σ∪{ϵ}
- 除此之外,NFA 也是一个五元组
- Q Q Q 代表有限的状态集合,
- Σ \Sigma Σ 表示有限的字母表,也就是上图中线上的那些触发条件;通常选用那些数字 1 , 2 , 3... 1,~2,~3... 1, 2, 3... 或者小写字母 a , b , c . . . a,b,c... a,b,c...
- δ \delta δ 代表的是状态转移的矩阵(情况)即,一个状态 q ∈ Q q\in Q q∈Q 在一个 σ ∈ Σ \sigma\in \Sigma σ∈Σ 的情况下转移到另外一个状态 q q q;上图中所有的状态转移的全部记录就是 δ \delta δ
- I ⊆ Q I ⊆ Q I⊆Q 是开始状态集合;开始状态可以有多个,因此构成了一个集合(这一点和 DFA 也不同)
- F ⊆ Q F\subseteq Q F⊆Q 是接受状态, 即上图中用双圆圈表示的状态;当然 F F F 是一个集合,他里面可以有多个接受状态,也可以只有一个接受状态;
NFA 的“acceptance” 和 “recognition” (对语言的识别和对字符串的接收)
- N = ( Q , Σ , δ , I , F ) N = (Q, Σ, δ, I , F) N=(Q,Σ,δ,I,F) 是一个 NFA , 并且让 w = v 1 v 2 ⋅ ⋅ ⋅ v n w = v_1v_2 · · · v_n w=v1v2⋅⋅⋅vn 其中每一个 v i v_i vi 都是 Σ ϵ Σ_\epsilon Σϵ 的一个成员
- 如果
N
N
N 可以接受字符串
w
w
w 那么
w
w
w 必须满足当且仅当:有一串状态
r
0
,
r
1
,
.
.
.
r
n
r_0,r_1,...r_n
r0,r1,...rn 且
r
i
∈
Q
r_i\in Q
ri∈Q 满足:
- r 0 ∈ I r_0 ∈ I r0∈I
- r i + 1 ∈ δ ( r i , v i + 1 ) f o r i = 0 , . . . , n − 1 r_{i+1} ∈ δ(r_i, v_{i+1}) ~for ~i = 0, . . . , n − 1 ri+1∈δ(ri,vi+1) for i=0,...,n−1
- r n ∈ F r_n ∈ F rn∈F
- N N N recognises language A A A iff A = { w ∣ N a c c e p t s w } A = \{w | N ~accepts ~w\} A={w∣N accepts w}.
NFA 与正则语言和 DFA 的关系
等价关系
- NFA 和正则语言也是等价的,一个正则语言一定能表示成一个 NFA 或者一个 DFA
- 每个 NFA 都对应一个等价的 DFA
- 可以通过 子集构造(subset construction) 来通过 NFA 得到 DFA
- 一个 DFA 的状态是一个 NFA 状态的子集;即一个 NFA 的状态中可以包含一到多个 DFA 的状态节点
NFA 转换成 DFA 实例
-
现在有一个 NFA 的表示,要把它转换成 DFA 遵循以下步骤
-
起始状态为 1 1 1,并且由于 ϵ \epsilon ϵ 的原因,起始状态是 A = { 1 , 3 } A=\{1,3\} A={1,3}
-
接着在集合 A A A 中的每一个状态通过 a a a 可以到达的状态我们进行分析:
- 1 → a 2 1 \rightarrow^{a}2 1→a2
- 1 → ϵ 3 → a 1 1 \rightarrow^{\epsilon}3\rightarrow^{a}1 1→ϵ3→a1
- 3 → a 1 → ϵ 3 3 \rightarrow^{a}1\rightarrow^{\epsilon}3 3→a1→ϵ3
- 所以集合 A A A 通过 a a a 可以到达的状态节点为 { 1 , 2 , 3 } \{1,2,3\} {1,2,3} 我们把它写在表格中第一行第二列( B ∗ B^* B∗)的位置
-
同样的,当集合 A A A 通过字符 b b b ,哪里也去不了,所以我们用空集表示,即 − - − 或者 ∅ \empty ∅
-
由于 { 1 , 2 , 3 } \{1,2,3\} {1,2,3} 相对于 { 1 , 3 } \{1,3\} {1,3} 是一个新状态,因此,我们在第二行的起始状态中使用 { 1 , 2 , 3 } \{1,2,3\} {1,2,3} 作为开始;重复上面的步骤;第二行的 b b b 列我们又得到了新状态 { 2 , 3 } \{2,3\} {2,3},因此我们在第三行重复这个步骤,直到整张表中不出现新的状态。
-
因此,如果把上述的 NFA 看做一个 DFA 的话,那么 { 1 , 2 , 3 } , { 1 , 3 } , { 2 , 3 } \{1,2,3\},\{1,3\},\{2,3\} {1,2,3},{1,3},{2,3} 都相当于 DFA 中一个单独的状态节点;因此我们说 NFA 的每个状态相当于 DFA 中的几个状态的集合。
-
最终我们根据上面的 NFA 中的各个状态得到等价的 DFA 的图。
-
其中 D D D 状态就是那个空集,我们最后在写状态的时候也要单独考虑这种情况(完备);而最后得到的状态转移矩阵也如图所示。
更加正式的定义
- 对于
N
=
(
Q
,
Σ
,
δ
,
I
,
F
)
N=(Q,Σ,δ,I,F)
N=(Q,Σ,δ,I,F);让
→
ϵ
∗
\rightarrow^*_\epsilon
→ϵ∗ 作为
→
ϵ
\rightarrow_\epsilon
→ϵ 的自反传递闭包