课程名:形式语言与自动机

作者:Lupinus_Linn

许可证:CC-BY-NC-SA 3.0 创作共用-署名-非商业性-相同方式共享

  • 署名(英语:Attribution,BY):您(用户)可以复制、发行、展览、表演、放映、广播或通过信息网络传播本作品;您必须按照作者或者许可人指定的方式对作品进行署名。
  • 非商业性使用(英语:Noncommercial,NC):您可以自由复制、散布、展示及演出本作品;您不得为商业目的而使用本作品。
  • 相同方式共享(英语:Sharealike,SA):您可以自由复制、散布、展示及演出本作品;若您改变、转变或更改本作品,仅在遵守与本作品相同的许可条款下,您才能散布由本作品产生的派生作品。(参见copyleft。)

引用:

  • 本文中部分文字与图片引用自北京邮电大学计算机学院王柏教授的《形式语言与自动机》课程课件。
  • 绪论中的证明方法部分引自清华大学王生原老师课件。
  • 部分题目插图引用自北京邮电大学出版社《形式语言与自动机 第二版》教材。

在此一并表示感谢,并不做商业用途。

本笔记所有内容的传送门

Part.1绪论, Part.2 语言与文法
Part 3.有限自动机
Part.4 正则语言,2DFA,Mealy&Moore机
Part.5 上下文无关语言与下推自动机(PDA)
Part.6 图灵机

Part 3.有限自动机

  • 具有离散输入输出系统的一种数学模型 (可以没有输出,比较特殊的也可以没有输入).
  • 有限的状态
  • 状态+输入→状态转移
  • 每次转换的后继状态都唯一 → DFA,每次转换的后继状态不唯一→NFA

3.1 五要素

  • 有限状态集QQ
  • 有限输入符号集TT
  • 转移函数δ:Q×TQ\delta:Q×T \rarr Q:
  • 一个开始状态q0,q0Qq_0,q_0\in Q
  • 一个终态集合F,FQF,F\subseteq Q

3.2 一个DFA的定义

  • M=(Q,T,δ,q0,F)M= (Q, T, δ, q0 , F)
  • Q={q0,q1,q2,q3}Q = \{q0 , q1 , q2 , q3 \}
  • T={0,1}T = \{0, 1 \}
  • δ(q0,0)=q2,δ(q0,1)=q1\delta(q0 ,0) = q2 , \delta(q0 ,1) = q1
    δ(q1,0)=q3,δ(q1,1)=q0\delta(q1 ,0) = q3 , \delta(q1 ,1) = q0
    δ(q2,0)=q0,δ(q2,1)=q3\delta(q2 ,0) = q0 , \delta(q2 ,1) = q3
    δ(q3,0)=q1,δ(q3,1)=q2\delta(q3 ,0) = q1 , \delta(q3 ,1) = q2
  • q0q0
  • F={q0,q3}F = \{q0 , q3 \}

3.3 状态转移图

形式语言与自动机 Part 3.有限自动机

3.4 状态转移表

形式语言与自动机 Part 3.有限自动机

3.5 字符串转移函数δ\delta'

δ:Q×TQ\delta' :Q\times T^*\rarr Q
对于任何qQq\in Q,定义

  1. δ(q,ϵ)=q\delta'(q,\epsilon)=q。即空串转移到本状态。
  2. 如果ωT,aT\omega \in T^*,a\in T,定义δ(q,ωa)=δ(δ(q,ω),a)\delta'(q,\omega a)=\delta(\delta'(q,\omega),a)。即非空字符串ωa\omega a|可以看作是其前长度为ω|\omega|的前缀$\omega $和长度为11的字符aa组成。

对于DFA,单个字符使用δ\delta或者δ\delta'进行转移的结果相同。

3.6 DFA接受的语言

被DFA接收的字符串: 输入结束后使DFA的状态到达终 止状态。否则该字符串不能被DFA接收.

DFA接收的语言: 被DFA接收的字符串的集合.L(M)={ωδ(q0,ω)F}L(M) = \{ ω | \delta'( q0 , ω) \in F \}

3.7 格局

  • 有限自动机工作过程的瞬时描述,由当前状态q,待输入字符串ω构成的二元组(q,ω)表示,称为格局。
  • 初始格局:(q0, ω)
  • 终止格局: (q,ε), q∈F
  • 用格局描述的推导序列:(q0,001010)┝ (q2,01010) ┝ (q0,1010) ┝ (q1,010) ┝ (q3,10) ┝ (q2,0) ┝ (q0,ε)
  • 格局数量是无限的。
  • 有限状态自动机是无记忆的,其跳转到的状态只与当前状态和输入的字符有关,和以前输入的字符无关。

3.8 有限自动机的设计

3.8.1 识别所有由奇数个a和奇数个b组成的字符串

  • 不需要记住所看到的整个字符串,只需记住至此所看到 的a、b个数是偶数还是奇数。

形式语言与自动机 Part 3.有限自动机

3.8.2 识别包含000子串的语言

DFA

形式语言与自动机 Part 3.有限自动机
NFA

形式语言与自动机 Part 3.有限自动机

3.8.3 识别字符串代表的数字能被3整除的语言

  • 一个十进制数除以3,余数只能为0、1、2。将其设计为状态。
  • 状态q0表示已读入的数字和除3余0
  • 状态q1表示已读入的数字和除3余1
  • 状态q2表示已读入的数字和除3余2

形式语言与自动机 Part 3.有限自动机

3.8.4 长度为1-3 个字符且字母为首的语言

DFADFA

形式语言与自动机 Part 3.有限自动机
ϵNFA\epsilon-NFA

形式语言与自动机 Part 3.有限自动机

3.9 NFA的五要素

  • NFA是一个五元组,M=(Q,T,δ,q0,F)M=(Q,T,δ,q0,F). 其中δ:Q×T2Qδ:Q×T\rarr2^Q,其余与DFA相同.
  • NFA的一个状态接受一个字符后转移到一个状态集合,DFA仅仅转移到单个状态。
  • 如果接收一个字符串后NFA进入一个状态集, 而此集合中包含一个以上F中的状态, 则称NFA接收该字符串.

3.10 NFA的字符串转移函数δ\delta '

δ:Q×T2Q\delta':Q\times T\rarr 2^Q

  1. δ(q,ϵ)={q}\delta'(q,\epsilon)=\{q\},不允许空转移到别的状态。
  2. δ(q,ωa)=P,P={prδ(q,ω)δ(r,a)}\delta'(q,\omega a)=P,P=\{p | \exists r\in \delta'(q,\omega)∧ \delta(r,a)\},即先接受ω\omega进行转移,得到一个集合,然后将该集合内的状态再接受aa进行转移,将所得状态集并起来。

3.11 NFA接受的语言

  • L(A)={ωδ(q0,ω)F}L(A)=\{\omega | \delta'(q_0,\omega)\cap F\ne \empty\}
  • 即NFA接受字符串后转移到的状态集合包含F中的状态。

3.12 NFA与DFA的等价性

等价性:接受的语言相相同

  1. DFA与NFA等价:显然,因为DFA⊂NFA
  2. NFA于NFA等价:使用子集构造法

3.13 子集构造法

精髓:将NFA的状态集合看做DFA的单个状态

方法:设 L 是某个 NFA N=(QN,T,δN,q0,FN)NFA\ N = (Q_N, T, \delta_N , q_0 , F_N) 的语言, 则 存在一个DFA M=(QD,T,δD,{q0},FD)DFA\ M =(Q_D, T, \delta_D , \{q0 \}, F_D ), 满足L(M)=L(N)=LL(M) = L(N) = L.
其中

  • QD=2QN={RRQN}Q_D=2^{Q_N}=\{R|R\subseteq Q_N\},即DFA的状态集合是NFA的状态的幂集(可以去掉无用状态)。
  • δD(R,a)=qR δN(q,a)\delta_D(R,a)=\cup_{q\in R}\ \delta_N(q,a),即DFA的转移是NFA转移的并集。
  • FD={RRQNRFN}F_D=\{R|R\subseteq Q_N ∧ R\cap F_N\ne \empty\},即新的DFA的可接受状态集是包含至少一个NFA可接受状态的集合的集合。

例子

形式语言与自动机 Part 3.有限自动机

3.14 ϵNFA\epsilon-NFA的五要素

ϵNFA\epsilon-NFA是一个五元组A=(Q,T,δ,q0,F)A=(Q,T,δ,q0,F)

  • 与NFA的区别:δ:Q×(T{ϵ})2Q\delta:Q\times(T\cup \{\epsilon\})\rarr 2^Q,即可以使用空串转移。

3.15 ϵCLOSURE\epsilon-CLOSURE

状态 q 的ε - 闭包,记为 ε - CLOSURE 或 ECLOSE ,定义为从q 经所有的ε路径可以到达 的状态(包括q自身)。

即从q开始,经过零次或多次空转移可以到达的状态集合。

形式语言与自动机 Part 3.有限自动机

3.16 ϵNFA\epsilon-NFA的字符串转移函数δ\delta'

δ:Q×(T×{ϵ}2Q)\delta':Q\times (T\times\{\epsilon\}\rarr 2^Q)

  1. δ(q,ϵ)=ϵCLOSURE(q)\delta'(q,\epsilon)=\epsilon-CLOSURE(q),允许空转移到一个状态集合
  2. δ(q,ωa)=ϵCLOSURE(δ(δ(q0,ω),a)\delta'(q,\omega a)=\epsilon-CLOSURE(\delta(\delta'(q_0,\omega),a),即先按接受ω\omega进行δ\delta'转移,得到一个集合,然后将该集合内的状态再接受字符aa进行转移,将所得状态集并起来,再求其空闭包.

3.17 ϵNFA\epsilon-NFANFANFA的等价性

  1. NFA与ε-NFA等价:显然,因为NFA⊂ε-NFA
  2. ϵNFA\epsilon-NFA于NFA等价:消空

3.18 ϵNFA\epsilon-NFA的消空

精髓:把qxq_x接受由字符aa和若干个空串ε能转移到的所有状态找出来,视为qxq_x接受aa转移到这些状态的集合。此时空转移是冗余的,可以全部删掉。

方法:遍历原ϵNFA\epsilon-NFA的非空转移(qxq_x接收字符aa转移到某个状态集合),做以下操作:(实际上在求δϵNFA(qx,a)\delta_{\epsilon-NFA}'(q_x,a)

  1. qxq_x的空闭包ϵCLOSURE(qx)\epsilon-CLOSURE(q_x)
  2. 遍历ϵCLOSURE(qx)\epsilon-CLOSURE(q_x)的每个状态qiq_i,找出qiq_i接收字符aa(不含空转移)后所能到达的状态集合。遍历完成后,将得到的状态集合取并集。
  3. 寻找取并集后的集合的空闭包,认为qxq_x接受aa后直接到达该空闭包代表的集合,删去所有用到的空转移。

最后,还要对接受状态集合进行修改
FNFA={ FϵNFA{q0},ϵCLOSURE(q0)FFϵNFA,otherwise F_{NFA}=\begin{cases}\ F_{\epsilon-NFA}\cup \{q_0\},\epsilon-CLOSURE(q_0)\cap F\ne \empty\\F_{\epsilon-NFA},otherwise\end{cases}

例子

形式语言与自动机 Part 3.有限自动机

3.19 自动机的求补

精髓:自动机求补其实是语言求补,有的语言正面设计自动机比较麻烦,可以考虑其补语言后,再对该自动机求补。
方法:对于L1L_1,构造Lˉ\bar L的自动机M=(Q,T,δ,q0,F)M=(Q,T,\delta,q_0,F)的步骤如下

  1. Q=Q1{γ}Q=Q_1\cup \{\gamma\}γ\gamma用于使得原先自动机中会被卡住的转移在求补后被接受。

  2. δ\delta:

    1. 继承已有转移。
    2. 被卡死的转移,现在转到γ\gamma状态被接受。
    3. γ\gamma状态接受任何字符都在原地转圈。

    δ1(q,a)=δ(q,a)δ1(q,a)=δ(q,a)=γδ(γ,T)=γ \delta_1(q,a)=\delta(q,a)\\ \delta_1(q,a)=\empty\to\delta(q,a)=\gamma\\ \delta(\gamma,T)=\gamma

  3. F=(Q1F1){γ}F=(Q_1-F_1)\cup \{\gamma\}。原自动机不被接受的状态被接收,增加γ\gamma被接受。

例子T={a,b}T=\{a,b\},L中的任意三个连续符号中最多包含2个a,设计接受它的自动机。
分析:
可以先构造L的补语言Lˉ\bar L的自动机。
Lˉ\bar L的描述是:存在连续的三个字符,其包含大于2个a。
这句话可以转述为:存在aaa子串。
Lˉ\bar L的自动机很容易画出。
(注:区分连续的字符和累积的字符:连续的字符失败后要回到开始,累积的字符失败后在原地转圈。如果是后缀匹配的话,要找到最长后缀匹配的上一个状态。)
Lˉ\bar L的自动机

b
a
a
a
a,b
q1
q2
q3
q4

再对其求补,得LL的自动机为

b
a
b
a
b
a
a,b
q1
q2
q3
q4
γ

相关文章:

  • 2021-05-04
  • 2021-08-20
  • 2022-12-23
  • 2022-12-23
  • 2021-12-21
  • 2022-12-23
  • 2021-08-28
  • 2021-11-25
猜你喜欢
  • 2022-01-06
  • 2021-07-15
  • 2021-10-15
  • 2021-10-26
相关资源
相似解决方案