计算理论导论| 正则语言(上)有穷自动机

第一部分-第二章 正则语言(上)

2.1.1 有穷自动机的形式定义:

有穷自动机 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 q0Q是起始状态。
5) F ∈ Q F\in Q FQ是接受状态集。(注意:接受状态集是允许为空的。)

  • 转移函数,可以用一个表格来表示。
    A A A是机器 M M M接受的全部字符串集,称 A A A是机器 M M M的语言,记作 L ( M ) = A L(M)=A L(M)=A。为了混淆,通常倾向于说识别语言
    一个机器可能接受若干字符串,但是永远只能识别一个语言。
    机器是可以识别空语言 ϕ \phi ϕ的。
    如果起始状态就是接受状态,那么就代表机器接受空串 ε \varepsilon ε

当状态图太大,或者其他情况导致不方便使用状态图时,选择使用形式描述来规定机器。(书P24)

定义2.7 如果一个语言被一台有穷自动机识别,则称它是正则语言。
2.1.4 设计有穷自动机
  • 读者即自动机
  • 因为是有穷,所以不需要记住所有信息,而是记住关键信息就行。
2.1.5 正则运算
  • 对象是语言,工具是3种运算,称为正则运算。
  • A ∪ B A\cup B AB、连接 A ∘ B A\circ B AB、星号 A ∗ A^* A
  • 并与连接是作用于两个语言,而星号运算是作用于一个语言。空串也属于 A ∗ A^* A
封闭

一般地说,如果把某种运算应用于一个对象集合的成员得到的对象仍在这个集合中,则称这个对象集合在该运算下封闭。

定理2.12 正则语言类在并运算下封闭。

证明 设 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 AB 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)r1Q1 r 2 ∈ Q 2 { r_2\in Q_2} r2Q2,集合 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)r1F1 r 2 ∈ F 1 r_2\in F_1 r2F1

D F A DFA DFA N F A NFA NFA比较:
  • 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】
2.2.1 N F A NFA NFA形式定义:

非确定型有穷自动机 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 q0Q是起始状态。
5) F ⊆ Q F\subseteq Q FQ是接受状态集。
注: N F A NFA NFA的状态图第一行是字母表(包含 ε \varepsilon ε),第一列是状态集。

2.2.2 如果两台机器识别相同的语言,则称他们是等价的。
定理2.19 每一台非确定型有穷自动机都有一台等价的确定型有穷自动机。

思路:设 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/

推论2.20 一个语言是正则的,当且仅当有一台非确定型有穷自动机识别它。

(注:当且仅当需要从两个方向进行证明。)

每一台 N F A NFA NFA都可以转换成一台等价的 D F A DFA DFA。【转换的例子见书P34-P35】

我来简单的整理一下步骤:

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、将没有箭头射入的状态删去。

定理2.22 正则语言类在并运算下封闭。

(用状态图表示,思路变得非常清晰。)

定理2.23 正则语言类在连接运算下封闭。

(由于不知道在输入的哪一个位置分开成两段,所以需要引入非确定型有穷自动机来证明。)

定理2.24 正则语言类在星号运算下封闭。

(注意,不能直接把原始的起始状态直接加到接受状态集中,因为虽然把 ε \varepsilon ε加进了被识别的语言中,但是也可能会加入一些其他不想要的字符。正确的做法是,添加一个新的状态做为起始状态,然后通过 ε \varepsilon ε指向原始的起始状态。)

你可能感兴趣的:(计算理论导论)