【学习笔记】自动机理论、语言和计算导论(一、二)

自动机理论的中心概念

有穷自动机 有穷自动机涉及一些状态和当响应输入时在状态之间的转移。用来构造许多不同种类的软件,例如包括编译器的词法分析部件以及电路与协议正确性的验证系统。
正则表达式 这是描述有穷自动机所表示的相同模式的结构记号。用在许多常见类型的软件中,例如包括查找文本模式或文件名模式的工具。
上下文无关文法 这是描述程序设计语言的结构以及相关的串集合的重要记号;用来构造编译器的语法分析部件。
图灵机 这是为真实计算机的能力建立模型的自动机。图灵机允许研究可判定性,即计算机能做什么或不能做什么的问题。也允许区分易解问题(即能在多项式时间内解决的问题)与难解问题(即不能在多项式时间内解决的问题)。

字母表 是符号的有穷非空集合,常用 Σ \Sigma Σ表示。
(单词) 是从某字母表中选择的有穷序列。出现0次符号的串称为空串,记作 ε \varepsilon ε。串的符号数称为长度,记作 ∣ w ∣ |w| w
字母表的幂 Σ k \Sigma^k Σk表示 Σ \Sigma Σ中长度为 k k k的串集合。 Σ ∗ \Sigma^* Σ表示 Σ \Sigma Σ中所有串集合。 Σ + \Sigma^+ Σ+表示 Σ \Sigma Σ中非空串集合。
串的连接 例: x = a 1 a 2 … a i , y = b 1 b 2 … b j , x y = a 1 a 2 … a i b 1 b 2 … b j x=a_1a_2\dots a_i, y=b_1b_2\dots b_j, xy=a_1a_2\dots a_ib_1b_2\dots b_j x=a1a2ai,y=b1b2bj,xy=a1a2aib1b2bj
语言 L ⊆ Σ ∗ L\subseteq\Sigma^* LΣ,则 L L L Σ \Sigma Σ上的语言。
问题 给定 Σ ∗ \Sigma^* Σ中的一个串 w w w,判定 w w w是否属于 L L L

有穷自动机

本章核心思想总结:
DFA是描述有穷自动机的基本方式,引入非确定型和空串转移扩展功能可以简化设计,但功能等价,可以用固定算法把( ε \varepsilon ε-)NFA编译成DFA再执行。

确定性有穷自动机

一个确定性有穷自动机DFA可表示成
A = ( Q , Σ , δ , q 0 , F ) A=(Q, \Sigma, \delta, q_0, F) A=(Q,Σ,δ,q0,F)其中

  1. Q Q Q是一个有穷的状态集合。
  2. Σ \Sigma Σ是一个有穷的输入符号集合。
  3. δ \delta δ是一个转移函数,以一个状态和一个输入符号作为变量,返回一个状态。在非形式化表示自动机的图中,用状态之间的箭弧和箭弧上的标记来表示 δ \delta δ。如果 q q q是一个状态, a a a是一个输入符号,则 δ ( q , a ) \delta(q,a) δ(q,a)是这样的状态 p p p,使得从 p p p q q q有带标记 a a a的箭弧。
  4. 一个初始状态 q 0 q_0 q0,是 Q Q Q中状态之一。
  5. 一个终结状态或接收状态的集合 F F F F ⊆ Q F\subseteq Q FQ

DFA如何处理串 DFA如何决定是否"接受"输入符号序列。DFA的"语言"是这个DFA接受的所有的串的集合。假设 a 1 a 2 … a n a_1a_2\dots a_n a1a2an是输入符号序列。让这个DFA从初始状态 q 0 q_0 q0开始运行。查询转移函数 δ \delta δ,比如说 δ ( q 0 , a 1 ) = q 1 \delta(q_0, a_1)=q_1 δ(q0,a1)=q1,以找出DFA A A A在处理了第一个输入符号 a 1 a_1 a1之后进入的状态。处理下一个输入符号 a 2 a_2 a2,求 δ ( q 1 , a 2 ) \delta(q_1,a_2) δ(q1a2)的值,假设这个状态是 q 2 q_2 q2。以这种方式继续下去,找出状态 q 3 , q 4 , … , q n q_3, q_4, \dots , q_n q3,q4,,qn,使得对每个 i i i δ ( q i − 1 , a 1 ) = q i \delta(q_{i-1},a_1)=q_i δ(qi1,a1)=qi。如果 q n q_n qn属于 F F F,则接受输入 a 1 a 2 … a n a_1a_2\dots a_n a1a2an, 否则就"拒绝"。

DFA表示方法

  1. 转移图
    a) 对 Q Q Q中每个状态, 存在一个顶点.
    b) 对 Q Q Q中每个状态 q q q Σ \Sigma Σ中每个输入符号 a a a, 设 δ ( q , a ) = p \delta(q, a)=p δ(q,a)=p. 于是转移图有从顶点 q q q到顶点 p p p的带 a a a标记的箭弧. 如果有几个输入符号都导致从 q q q p p p的转移, 则转移图有一个由这些符号列表标记的箭弧.
    c) 有一个进入初始状态 q 0 q_0 q0的带Start标记的箭弧. 这个箭弧没有任何出发顶点.
    d) 对应于接受状态(属于 F F F的那些状态)的顶点用双圆圈标记. 不属于 F F F的状态用单圆圈.
    1
  2. 转移表
    转移表是习惯上对像 δ \delta δ这样有两个变量和一个返回值的函数的表格表示。这个表的各行对应着状态,各列对应着输入。在状态 q q q对应的行和输入 a a a对应的列这个位置上的项是状态 δ ( q , a ) \delta(q, a) δ(q,a)
    在这里插入图片描述
    把转移函数扩展到串
    扩展转移函数描述从任何状态开始读任何序列时所发生的事情。由 δ \delta δ扩展出 δ ^ \hat{\delta} δ^:接收状态 q q q和串 w w w,返回状态 p p p p p p是当自动机从 q q q开始处理输入序列 w w w时所到达的状态。通过对输入串的长度进行归纳来定义 δ ^ \hat{\delta} δ^如下:
    基础: δ ^ ( q , ε ) = q \hat{\delta}(q, \varepsilon)=q δ^(q,ε)=q
    归纳:假设 w w w是形如 x a xa xa的串,也就是说, a a a w w w的结尾符号。于是 δ ^ ( q , w ) = δ ( δ ^ ( q , x ) , a ) \hat{\delta}(q, w)=\delta(\hat{\delta}(q, x), a) δ^(q,w)=δ(δ^(q,x),a)

例子:设计一个DFA以接受语言 L = { w 丨 w 同 时 有 偶 数 个 0 和 偶 数 个 1 } L=\{w丨w同时有偶数个0和偶数个1\} L={ww01}
这个DFA的状态的任务是同时数0和1的个数,但是需要模2来计数。因此有4个状态,这4个状态可以给出下列解释∶
q 0 q_0 q0∶ 迄今为止看到的0的个数和1的个数都是偶数。
q 1 q_1 q1∶ 迄今为止看到的0的个数是偶数而1的个数是奇数。
q 2 q_2 q2∶ 迄今为止看到的1的个数是偶数而0的个数是奇数。
q 3 q_3 q3∶ 迄今为止看到的0的个数和1的个数都是奇数。
状态 q 0 q_0 q0既是初始状态也是惟一的接受状态。
L的DFA是 A = ( { q 0 , q 1 , q 2 , q 3 } , { 0 , 1 } , δ , q 0 , { q 0 } ) A =(\{q_0,q_1,q_2,q_3\}, \{0,1\}, \delta, q_0, \{q_0\}) A=({q0,q1,q2,q3},{0,1},δ,q0,{q0})
1在这里插入图片描述

DFA的语言 L ( A ) = { w ∣ δ ^ ( q 0 , w ) ∈ F } L(A)=\{w | \hat{\delta}(q_0, w)\in F\} L(A)={wδ^(q0,w)F},即语言 L ( A ) L(A) L(A)是让初始状态 q 0 q_0 q0通向接收状态之一的串 w w w的集合。如果对某个DFA A A A来说 L L L L ( A ) L(A) L(A),称 L L L为正则语言。

非确定型有穷自动机

一个非确定性有穷自动机NFA可表示成
A = ( Q , Σ , δ , q 0 , F ) A=(Q, \Sigma, \delta, q_0, F) A=(Q,Σ,δ,q0,F)其中

  1. Q Q Q是一个有穷的状态集合。
  2. Σ \Sigma Σ是一个有穷的输入符号集合。
  3. δ \delta δ是一个转移函数,以一个状态和一个输入符号作为变量,返回一个 Q Q Q中状态的子集合。
  4. 一个初始状态 q 0 q_0 q0,是 Q Q Q中状态之一。
  5. 一个终结状态或接收状态的集合 F F F F ⊆ Q F\subseteq Q FQ

在这里插入图片描述
在这里插入图片描述

扩展转移函数
基础: δ ^ ( q , ε ) = q \hat{\delta}(q, \varepsilon)=q δ^(q,ε)=q
归纳:假设 w w w是形如 x a xa xa的串, δ ^ ( q , x ) = { p 1 , p 2 , … , p k } \hat{\delta}(q, x)=\{p_1, p_2,\dots, p_k\} δ^(q,x)={p1,p2,,pk}。设 ⋃ i = 1 k δ ( p i , a ) = { r 1 , r 2 , … , r m } \bigcup_{i=1}^k \delta(p_i, a)=\{r_1, r_2,\dots, r_m\} i=1kδ(pi,a)={r1,r2,,rm} δ ^ ( q , w ) = { r 1 , r 2 , … , r m } \hat{\delta}(q, w)=\{r_1, r_2,\dots, r_m\} δ^(q,w)={r1,r2,,rm}

NFA的语言 L ( A ) = { w ∣ δ ^ ( q 0 , w ) ∩ F ≠ ∅ } L(A)=\{w | \hat{\delta}(q_0, w)\cap F\neq \varnothing \} L(A)={wδ^(q0,w)F=},即 L ( A ) L(A) L(A) Σ ∗ \Sigma^* Σ中使得 δ ^ ( q 0 , w ) \hat{\delta}(q_0, w) δ^(q0,w)至少包含一个接收状态的串 w w w的集合。

DFA和NFA的等价性 子集构造:用一个自动机的状态和转移来描述另一个自动机,却不知道前者的具体情况。 D D D的部件构造:
从一个NFA N = ( Q N , Σ , δ N , q 0 , F N ) N=(Q_N, \Sigma, \delta_N, q_0, F_N) N=(QN,Σ,δN,q0,FN)开始,目标是描述一个DFA D = ( Q D , Σ , δ D , { q 0 } , F D ) D=(Q_D, \Sigma, \delta_D, \{q_0\}, F_D) D=(QD,Σ,δD,{q0},FD),使得 L ( D ) = L ( N ) L(D)=L(N) L(D)=L(N)

  • Q D Q_D QD Q N Q_N QN的子集的集合(幂集),可以丢弃不可达状态,因此 D D D的状态数远小于 2 n 2^n 2n
  • F D F_D FD是使得 S ∪ F N ≠ ∅ S\cup F_N\neq\varnothing SFN= Q N Q_N QN的子集合 S S S的集合。即 F D F_D FD是所有至少含有一个 N N N的接收状态集合的集合。
  • 对于每个集合 S ⊆ Q N S\subseteq Q_N SQN以及 a ∈ Σ a\in\Sigma aΣ δ D ( S , a ) = ⋃ p ∈ S δ N ( p , a ) \delta_D(S, a)=\bigcup_{p\in S}\delta_N(p, a) δD(S,a)=pSδN(p,a)即为了计算 δ D ( S , a ) \delta_D(S, a) δD(S,a),检查 S S S中所有的状态 p p p,看看 N N N在输入 a a a上从 p p p进入哪些状态,取所有这些状态的并集。

在这里插入图片描述

构造的合理性的证明:对 w w w进行归纳。 δ ^ D ( { q 0 } , w ) = δ ^ N ( q 0 , w ) \hat\delta_D(\{q_0\}, w)=\hat\delta_N(q_0, w) δ^D({q0},w)=δ^N(q0,w)
基础∶设 l w l = 0 lwl=0 lwl=0,即 w = ε w=\varepsilon w=ε。由定义, δ ^ D ( { q 0 } , ε ) \hat\delta_D(\{q_0\}, \varepsilon) δ^D({q0},ε) δ ^ N ( q 0 , ε ) \hat\delta_N(q_0, \varepsilon) δ^N(q0,ε)都是 { q 0 } \{q_0\} {q0}
归纳:设 w w w长度为 n + 1 n +1 n+1,假设命题对长度 n n n成立。把 w w w分解成 w = x a w= xa w=xa,根据归纳假设, δ ^ D ( { q 0 } , x ) = δ ^ N ( q 0 , x ) \hat\delta_D(\{q_0\}, x)=\hat\delta_N(q_0, x) δ^D({q0},x)=δ^N(q0,x)。设这两个 N N N的状态集合都是 { p 1 , p 2 , … , p k } \{p_1, p_2,\dots, p_k\} {p1,p2,,pk}
NFA的 δ ^ \hat\delta δ^的定义的归纳部分说明: δ ^ N ( q 0 , w ) = ⋃ i = 1 k δ N ( p i , a ) \hat\delta_N(q_0, w)=\bigcup_{i=1}^k\delta_N(p_i, a) δ^N(q0,w)=i=1kδN(pi,a)另一方面,子集构造说明:
δ D ( { p 1 , p 2 , … , p k } , a ) = ⋃ i = 1 k δ N ( p i , a ) \delta_D(\{p_1, p_2,\dots, p_k\}, a)=\bigcup_{i=1}^k\delta_N(p_i, a) δD({p1,p2,,pk},a)=i=1kδN(pi,a)并由事实 δ ^ D ( { q 0 } , x ) = { p 1 , p 2 , … , p k } \hat{\delta}_D(\{q_0\}, x)=\{p_1, p_2,\dots, p_k\} δ^D({q0},x)={p1,p2,,pk}
δ ^ D ( { q 0 } , w ) = δ D ( δ ^ D ( { q 0 } , x ) , a ) = δ D ( { p 1 , p 2 , … , p k } , a ) = ⋃ i = 1 k δ N ( p i , a ) \hat{\delta}_D(\{q_0\}, w)=\delta_D(\hat{\delta}_D(\{q_0\}, x), a)=\delta_D(\{p_1, p_2,\dots, p_k\}, a)=\bigcup_{i=1}^k\delta_N(p_i, a) δ^D({q0},w)=δD(δ^D({q0},x),a)=δD({p1,p2,,pk},a)=i=1kδN(pi,a)由此原式得证。当注意到 D D D N N N都接受 w w w当且仅当 δ ^ D ( { q 0 } , w ) \hat\delta_D(\{q_0\}, w) δ^D({q0},w) δ ^ N ( q 0 , w ) \hat\delta_N(q_0, w) δ^N(q0,w)分别包含一个 F N F_N FN中的状态时,就得到了 L ( D ) = L ( N ) L(D)=L(N) L(D)=L(N)的完整证明。

一个语言 L L L被某个DFA接受,当且仅当 L L L被某个NFA接受。

例子:文本搜索的NFA

设计一个识别单词web和ebay的出现的NFA。
在这里插入图片描述
状态1是初始状态,符号 Σ \Sigma Σ表示所有可打印ASCII的字符,状态2-4识别web,5-8识别ebay。
NFA的实现有两种主要选择∶
1.写一个程序来模拟这个NFA,计算出读每个输入符号后所处的状态的集合。
2. 用子集构造把NFA转化成等价的DFA。然后直接模拟这个DFA。在这里插入图片描述

ε \varepsilon ε转移的有穷自动机

扩展功能:描述“可有可无”的输入。
在这里插入图片描述
一个扩展的非确定性有穷自动机 ε \varepsilon ε-NFA可表示成
A = ( Q , Σ , δ , q 0 , F ) A=(Q, \Sigma, \delta, q_0, F) A=(Q,Σ,δ,q0,F)其中 δ \delta δ现在是有下列变量的函数∶

1.Q中一个状态。

2.、 Σ ∪ { ε } \Sigma\cup\{\varepsilon\} Σ{ε}中一个元素,也就是说,要么是输入符号,要么是 ε \varepsilon ε符号。要求空串符号 ε \varepsilon ε不是字
母表 Σ \Sigma Σ中的元素,所以不会导致混乱。

ε \varepsilon ε闭包 顺着所有从状态 q q q出发带 ε \varepsilon ε标记的转移来求状态 q q q ε \varepsilon ε闭包。
递归地定义闭包 ECLOSE ( q ) \text{ECLOSE}(q) ECLOSE(q)
基础:状态q属于 ECLOSE ( q ) \text{ECLOSE}(q) ECLOSE(q)
归纳:如果p属于 ECLOSE ( q ) \text{ECLOSE}(q) ECLOSE(q),并且有从状态 p p p到状态 r r r ε \varepsilon ε标记的转移,则 r r r属于 ECLOSE ( q ) \text{ECLOSE}(q) ECLOSE(q)
更谁确地说,如果 δ \delta δ是所讨论的 ε \varepsilon ε-NFA的转移函数,且 p p p属于 ECLOSE ( q ) \text{ECLOSE}(q) ECLOSE(q),则 ECLOSE ( q ) \text{ECLOSE}(q) ECLOSE(q)也包含所有属于 δ ( p , ε ) \delta(p, \varepsilon) δ(p,ε)的状态。
状态集合 S S S ε \varepsilon ε闭包: ECLOSE ( S ) = ⋃ q ∈ S ECLOSE ( q ) \text{ECLOSE}(S)=\bigcup_{q\in S}\text{ECLOSE}(q) ECLOSE(S)=qSECLOSE(q)

扩展转移函数
基础: δ ^ ( q , ε ) = ECLOSE ( q ) \hat{\delta}(q, \varepsilon)=\text{ECLOSE}(q) δ^(q,ε)=ECLOSE(q)
归纳∶设 w w w形如 x a xa xa。注意, a a a属于 Σ \Sigma Σ a a a不能是 ε \varepsilon ε ε \varepsilon ε不属于 Σ \Sigma Σ。计算 δ ^ ( q , w ) \hat\delta(q, w) δ^(q,w)如下∶

  1. δ ^ ( q , x ) \hat\delta(q, x) δ^(q,x) { p 1 , p 2 , … , p k } \{p_1, p_2,\dots, p_k\} {p1,p2,,pk}。也就是说,这些 p i p_i pi是从 q q q顺着标记为 x x x的路径可达的所有状态。
这条路径可能以一个或多个带 ε \varepsilon ε标记的转移来结尾,也可能有其他的 ε \varepsilon ε转移。
  2. ⋃ i = 1 k δ ( p i , a ) \bigcup_{i=1}^k \delta(p_i, a) i=1kδ(pi,a) { r 1 , r 2 , … , r m } \{r_1, r_2,\dots,r_m\} {r1,r2,,rm}。也就是说,顺着带 x x x标记的路径从 q q q到达一些状态,遵循
所有带 a a a标记的从这些状态发出的转移。这些 r j r_j rj是顺着带 w w w标记的路径从 q q q可达的一些状态。顺着下面步骤(3)中的标记 ε \varepsilon ε的箭弧,从这些 r j r_j rj求出其他的可达的状态。
  3. δ ^ ( q , w ) = ⋃ j = 1 m ECLOSE ( r j ) \hat\delta(q, w)=\bigcup_{j=1}^m \text{ECLOSE}(r_j) δ^(q,w)=j=1mECLOSE(rj)。这个附加的闭包步骤包含了所有从 q q q出发带 w w w标记的路径,考虑到了在最后的"实"符号 a a a上转移后,存在其他带 ε \varepsilon ε标记的箭弧可以遵循的可能性。

消除 ε \varepsilon ε转移 (转化成DFA)
给定 ε \varepsilon ε-NFA E = ( Q E , Σ , δ E , q 0 , F E ) E=(Q_E, \Sigma, \delta_E, q_0, F_E) E=(QE,Σ,δE,q0,FE)开始,等价DFA D = ( Q D , Σ , δ D , { q 0 } , F D ) D=(Q_D, \Sigma, \delta_D, \{q_0\}, F_D) D=(QD,Σ,δD,{q0},FD),使得 L ( D ) = L ( E ) L(D)=L(E) L(D)=L(E)

  • Q D Q_D QD Q E Q_E QE的幂集。D的所有可达状态都是 Q E Q_E QE ε \varepsilon ε闭子
集,也就是说,这些集合 S ⊆ Q E S\subseteq Q_E SQE使得 S = ECLOSE ( S ) S= \text{ECLOSE}(S) S=ECLOSE(S)。换句话说,状态 S S S ε \varepsilon ε闭集就是使得从 S S S中状态之一出发的任意 ε \varepsilon ε转移都导向还是属于 S S S的状态的集合。注意, ∅ \varnothing ε \varepsilon ε闭集。
  • δ D = ECLOSE ( q 0 ) \delta_D= \text{ECLOSE}(q_0) δD=ECLOSE(q0),即 D D D的初始状态是对仅由 E E E的初始状态构成的集合求闭包得到的。
  • F D F_D FD是使得 S ∪ F E ≠ ∅ S\cup F_E\neq\varnothing SFE= Q N Q_N QN的子集合 S S S的集合。即 F D F_D FD是所有至少含有一个 E E E的接收状态集合的集合。
  • 对于每个集合 S ⊆ Q N S\subseteq Q_N SQN以及 a ∈ Σ a\in\Sigma aΣ,计算 δ D ( S , a ) \delta_D(S, a) δD(S,a)的方法如下:
    • S = { p 1 , p 2 , … , p k } S=\{p_1, p_2,\dots, p_k\} S={p1,p2,,pk}
    • 计算 ⋃ i = 1 k δ E ( p i , a ) \bigcup_{i=1}^k \delta_E(p_i, a) i=1kδE(pi,a),设为 { r 1 , r 2 , … , r m } \{r_1, r_2,\dots,r_m\} {r1,r2,,rm}
    • δ D ( S , a ) = ⋃ j = 1 m ECLOSE ( r j ) \delta_D(S, a)=\bigcup_{j=1}^m \text{ECLOSE}(r_j) δD(S,a)=j=1mECLOSE(rj)

在这里插入图片描述

一个语言 L L L被某个 ε \varepsilon ε-NFA接受,当且仅当 L L L被某个DFA接受。
证明类似NFA,略

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值