有穷自动机 M M M是一个5元组 ( Q , Σ , δ , q 0 , F ) (Q,\Sigma,\delta,q_0,F) (Q,Σ,δ,q0,F),其中
1) Q Q Q是一个有穷集合,叫做状态集。
2) Σ \Sigma Σ是一个有穷集合,叫做字母集。
3) δ \delta δ: Q × Σ → Q Q\times\Sigma \rightarrow Q Q×Σ→Q是转移函数(使用转移函数定义动作规则)。
4) q 0 ∈ Q q_0 \in Q q0∈Q是起始状态。
5) F ∈ Q F\in Q F∈Q是接受状态集。(注意:接受状态集是允许为空的。)
当状态图太大,或者其他情况导致不方便使用状态图时,选择使用形式描述来规定机器。(书P24)
- 读者即自动机
- 因为是有穷,所以不需要记住所有信息,而是记住关键信息就行。
- 对象是语言,工具是3种运算,称为正则运算。
- 并 A ∪ B A\cup B A∪B、连接 A ∘ B A\circ B A∘B、星号 A ∗ A^* A∗。
- 并与连接是作用于两个语言,而星号运算是作用于一个语言。空串也属于 A ∗ A^* A∗。
一般地说,如果把某种运算应用于一个对象集合的成员得到的对象仍在这个集合中,则称这个对象集合在该运算下封闭。
证明 设 M 1 M_1 M1识别 A 1 A_1 A1,设 M 2 M_2 M2识别 A 2 A_2 A2,其中
M 1 = ( Q 1 , Σ , δ 1 , q 1 , F 1 ) M1=(Q_1,\Sigma,\delta_1,q_1,F_1) M1=(Q1,Σ,δ1,q1,F1), M 2 = ( Q 2 , Σ , δ 2 , q 2 , F 2 ) M2=(Q_2,\Sigma,\delta_2,q_2,F_2) M2=(Q2,Σ,δ2,q2,F2)
构造识别 A ∪ B A\cup B A∪B的 M M M,这里 M = ( Q , Σ , δ , q 0 , F ) M=(Q,\Sigma,\delta,q_0,F) M=(Q,Σ,δ,q0,F)。
1) Q = ( r 1 , r 2 ) ∣ r 1 ∈ Q 1 Q={(r1,r2)|r_1\in Q_1} Q=(r1,r2)∣r1∈Q1 且 r 2 ∈ Q 2 { r_2\in Q_2} r2∈Q2,集合 Q Q Q是 Q 1 Q_1 Q1和 Q 2 Q_2 Q2的笛卡尔积 Q 1 × Q 2 Q_1\times Q_2 Q1×Q2.
2)字母表 Σ \Sigma Σ与 M 1 , M 2 M_1,M_2 M1,M2相同。
3)转移函数,令
δ ( ( r 1 , r 2 ) , a ) = ( δ 1 ( r 1 , a ) , δ 2 ( r 2 , a ) ) \delta((r_1,r_2),a)=(\delta_1(r_1,a),\delta_2(r_2,a)) δ((r1,r2),a)=(δ1(r1,a),δ2(r2,a))
4) q 0 q_0 q0是有序对 ( q 2 , q 2 ) (q_2,q_2) (q2,q2)。
5) F F F是接受状态的有序对集合, F = ( r 1 , r 2 ) ∣ r 1 ∈ F 1 F = (r_1,r_2)|r_1\in F_1 F=(r1,r2)∣r1∈F1 或 r 2 ∈ F 1 r_2\in F_1 r2∈F1
- D F A DFA DFA的每一个状态对于字母表中的每一个符号总是恰好有一个转移箭头射出。而 N F A NFA NFA对于字母表中的每一个符号可以有0个、1个或多个箭头射出。
- 在 D F A DFA DFA中,转移箭头上的标号是取自字母表的符号。 N F A NFA NFA的箭头可以标记字母表的符号或 ε \varepsilon ε。从一个状态可能射出0个、1个或者多个带有 ε \varepsilon ε的箭头。
- 每一台 N F A NFA NFA都可以转换成一台等价的 D F A DFA DFA。【转换的例子见书P34-P35】
非确定型有穷自动机 N N N是一个5元组 ( Q , Σ , δ , q 0 , F ) (Q,\Sigma,\delta,q_0,F) (Q,Σ,δ,q0,F),其中
1) Q Q Q是一个有穷集合,叫做状态集。
2) Σ \Sigma Σ是一个有穷集合,叫做字母集。
3) δ \delta δ: Q × Σ ε → P ( Q ) Q\times\Sigma_\varepsilon \rightarrow P(Q) Q×Σε→P(Q)是转移函数(使用转移函数定义动作规则)。
4) q 0 ∈ Q q_0 \in Q q0∈Q是起始状态。
5) F ⊆ Q F\subseteq Q F⊆Q是接受状态集。
注: N F A NFA NFA的状态图第一行是字母表(包含 ε \varepsilon ε),第一列是状态集。
思路:设 k k k是 N F A NFA NFA的状态数,它有 2 k 2^k 2k个子状态集,所以 D F A DFA DFA将会有 2 k 2^k 2k个状态。
证明可参考下面的链接,使用了二进制来代表状态,启发思考。https://zhouyifan.net/2019/06/23/Theory-of-Computation-Review1/
(注:当且仅当需要从两个方向进行证明。)
我来简单的整理一下步骤:
1、写出 D F A DFA DFA状态集。根据 N F A NFA NFA的状态集数量 k k k写出 D F A DFA DFA状态集数量 2 k 2^k 2k。
2、标出 D F A DFA DFA的接受状态集。 D F A DFA DFA的接受状态集合为包含 N F A NFA NFA接受状态的状态集。
3、标出所有的符号与状态转换。根据 N F A NFA NFA的状态图对应的在 D F A DFA DFA标出。
4、将没有箭头射入的状态删去。
(用状态图表示,思路变得非常清晰。)
(由于不知道在输入的哪一个位置分开成两段,所以需要引入非确定型有穷自动机来证明。)
(注意,不能直接把原始的起始状态直接加到接受状态集中,因为虽然把 ε \varepsilon ε加进了被识别的语言中,但是也可能会加入一些其他不想要的字符。正确的做法是,添加一个新的状态做为起始状态,然后通过 ε \varepsilon ε指向原始的起始状态。)