1 / 50

第三章 有穷自动机

第三章 有穷自动机. 本章介绍有关有穷自动机的基本概念和理论以及正规文法、正规表达式与有穷自动机之间的相互关系。. 3.1 概述 —— 有穷自动机的意义. 有穷状态自动机 (Finite-state Automata FSA) 或简称 FA 是具有离散的输入 输出系统的数学模型。系统内部具有有穷个状态,系统的状态概括了对过去输入状况的处理信息,系统只需根据当前所处的状态和面临的输入就可以决定系统的后继行为,系统处理了当前的输入后,系统的内部状态也将发生变化。电梯控制装置、文本编辑程序、编译技术中的词法分析程序,计算机以及人脑都是有穷状态系统。.

jodie
Download Presentation

第三章 有穷自动机

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第三章 有穷自动机 本章介绍有关有穷自动机的基本概念和理论以及正规文法、正规表达式与有穷自动机之间的相互关系。

  2. 3.1 概述——有穷自动机的意义 有穷状态自动机(Finite-state Automata FSA)或简称FA是具有离散的输入\输出系统的数学模型。系统内部具有有穷个状态,系统的状态概括了对过去输入状况的处理信息,系统只需根据当前所处的状态和面临的输入就可以决定系统的后继行为,系统处理了当前的输入后,系统的内部状态也将发生变化。电梯控制装置、文本编辑程序、编译技术中的词法分析程序,计算机以及人脑都是有穷状态系统。

  3. 3.1 概述——有穷自动机的模型 输入带 1 0 4 3 9 7 有穷控制器 读头 1-9 1,3,5,7,9 0-9 T S A 1,3,5,7,9

  4. 3.2 有穷自动机的形式定义 定义3.1一个确定有穷自动机DFSA是一个五元组 M=(Q, , t, q0, F) 其中, Q:是非空有穷状态集,其中的每个元素称为一个状态; :是有穷输入字母表,它的每一个元素称为一个输入 符号; t :是一个单值映射QQ,也称状态转换函数,t(q,x)=q意指:当现行状态为q,面临的输入符号为x时,将转到下一状态q,q称为q的一个后继状态; q0Q称之为开始状态; FQ称为终止状态集,至少由一个终止状态组成。

  5. 3.2.1 状态转换表(矩阵) DFA转换矩阵: 该矩阵行表示状态集; 列表示输入字母表; 矩阵元素表示 t(q,a)的值。即某行状态面临某列输入字符所唯一转向的下一个状态。  该矩阵称为状态转换矩阵

  6. 符号 状态 + - · d S A A G B A G B H B G H H 3.2.1 状态转换表(矩阵) 例3.1 有穷自动机A=(Q, , t, q0,F) 其中,Q={ S,A,B,G,H},={+,-,·,d},S是开始状态,终止状态集F={B,H},映射t:QQ由下表所示的状态转换表给出。

  7. 3.2.2 状态转换图(1) 一个DFA也可表示成一张状态转换图。 DFA状态:用圆圈节点表示; 初始状态节点:用“右向双(单)箭头”表示; 终止状态节点:用“双圈”表示; 状态变迁:用单向弧线表示,上面必须标记激励变迁的符号。

  8. 3.2.2 状态转换图 例3.2 有穷自动机A(记为DFSA A), A=(Q, , t, q0,F) 其中,Q={ q0, q1, q2, q3},={a, b},q0是开始状态,终止状态集F={q0},映射t:QQ由下图所示的状态转换图给出。 在图中,状态q0用双 圆圈标记,表明它是终止 状态;同时,用一个箭头 标记,表明它是开始状态。

  9. 3.2.3 构形和移动(1) • 对于一个给定的输入串,假定一个DFSA 已经完成了若干次移动,为了预测它的进一步行为,只需要知道”当前状态”和”尚待扫描的输入串”,这两类信息对于在某一次的特定应用中,位于某个特定时刻的DFSA提供了一种完整的描述,这种描述就称为构形。

  10. 3.2.3 构形和移动(2) 构形(q0,ω)称为初始构形,其中q0是初始状态,ω是由该自动机可接收或拒绝的任何输入串。构形(q, )称为终止构形,其中是空串,qF(终态集)。 自动机的移动(记为├)是从一种构形到另一种构形的转换。 DFSA的工作过程就是一系列的移动过程。 记号├+称为├的传递闭包;├*称为├的自反闭包。 ├*表示“0次或多次移动”;├+表示“一次或多次移动”。

  11. 3.2.3 构形和移动(3) • DFSA M 所识别的语言L(M)可表示为: L(M)={ω*︱(q0,ω)├*(q,)&q F}

  12. 自动机接受(识别)字符串 • 1)自动机所接收字符 如果对某一自动机M=( Q, , t, q0, F) x∈ ,有t( q0,x)=P,且P∈ F,则称字符x被自动机所接收。 • 2)自动机所接收输入串 自动机从开始状态读完全部输入串后,自动机恰好到达终止状态,则称输入串被自动机所接收。

  13. 自动机接受(收)字符串 • 3)自动机接收语言 自动机M所能接收的串组成一个集合,则称该集合为自动机M所能接收(识别)的语言。 用L(M)表示: L(M)={ω ∣ t(q0, ω)∈ F , ω ∈ *}

  14. 3.2.4 自动机的等价性 定义3.2 M和M是等价的,当且仅当对每一个串x,M接收x当且仅当M接收x。 定义3.3 如果M仅通过重新标记它的状态就能转换称M,则M和M称为同构的(Isomorphic)。 FSA的一个基本定理是:对每一个自动机M,存在一个等价的具有最少状态个数的自动机M,而且对于每一个其状态个数与M相同且等价于M的自动机M″,必是与M同构的。换句话说,M在结构上是唯一的。

  15. 3.2.5 非确定有穷状态自动机 定义3.4一个非确定有穷自动机NDFSA是一个五元组 NDFSA=(Q, , t, q0, F) 其中,Q是一个非空有穷状态集, 是一个非空有穷输入字母集, 映射t为QQ的子集(即t是一个多值映射), Q0Q是开始状态集, FQ是终止状态集。 同样的,NDFSA也可以用状态转换表和状态转换图表示。

  16. 3.2.5 非有穷状态自动机 非确定有穷自动机与确定有穷自动机的主要区别有三: 1.NDFSA有一个开始状态集,而DFSA只有一个开始状态。 2.NDFSA的映射是QQ的子集,是一个多值映射,而DFSA的映射是QQ,是一个单值映射。 3.NDFSA在没有扫描任何输入符号的情况下,也可以进行移动,这种移动称为空移。我们用表示法: t(q, )={某些状态的集合}将这种情况包括在状态转换函数中。注意,甚至当输入串已经完全扫描完之后还可能需要空移。

  17. 3.3 NDFSA到DFSA的转换 3.3.1 NFA 的确定化 NFA确定化的定义 NFA的确定化是指对任意给定的NFA都能相应地构造一DFA,使它们接受相同的语言。

  18. NDFSA到DFSA的转换 • NFA确定化为DFA的方法——子集法 对于一个NFA ,由于状态转换函数t是一个多值函数,因此总存在一些状态q,对于它们有t(q,a)={q1,q2,q3,…qn}, 它们是NFA状态集合的一个子集,为了NFA转化为DFA,把状态集合 {q1,q2,q3,…qn}看作一个状态A,也就是说让DFA 的每一个状态代表NFA状态集合的某个子集,这个DFA使用它的状态去记录在NFA读入输入符号之后可能到达的所有状态的集合,这样就可以把NFA转化为DFA了。这种构造方法称为子集法。

  19. NDFSA到DFSA的转换 利用构造-closure的方法将NFA确定化为DFA • 定义3.5:设NDFSA M=(Q, ∪{}, t, Q0, F),假定I是M中状态集的一个子集,定义-closure(I)如下: • ① 若qI,则q–closure(I); • ② 若q-closure(I),q是由q出发经多条弧所到达的状态,则q-closure(I)。 • 定义3.6假定I是NDFSA M中状态集的一个子集,a,定义 Ia=-closure(J) • 其中J是所有那些可从子集I中的任一状态出发,经过一条a连线(跳过a连线前的ε连线)而到达的状态(结)的全体。

  20. NDFSA到DFSA的转换 NFA N=(Q, ∑,T,S,Z) DFA M =(Q′, ∑, T′,S′,Z′) • (1)首先将从 NFA N的初态S出发经过任意条ε弧所能到达的状态组成的集合作为确定化后的 DFA M的初态S′。 • (2)从S′出发,经过对任意输入符号a∈∑的状态转移所能到达的状态(包括读入输入符号a之后所有可能的ε转移所能到达的状态)所组成的集合作为M的新状态。

  21. NDFSA到DFSA的转换 • (3)如此重复,直到不在有新的状态出现为止。 • (4)在所产生的状态中,含有原NFA终态的子集作DFA的终态。

  22. 消除不可达状态 在自动机中,从开始状态没有任何一条路径能达到的状态称为不可达状态。由于不可达状态事实上是无用的,因此也称多余的状态,可以删除它们。下面给出识别可达状态的算法。当该算法终止时,每一个未标记的状态就是不可达状态。 识别DFSA中可达状态的算法。 ①标记开始状态S; ②给定任意标记过的状态P,如果对某个输入符号存在从状态P到Q的转换,则标记每一个这样的状态Q; 重复步骤②,直到不再有可标记的状态为止。

  23. 3.3.2 DFA的化简 (最小化) DFA的化简 所谓DFA的化简是指寻找一个状态数比M少的确定的有穷自动机M,使得L(M)= L(M)。 化简后的DFA M′应满足两个条件: (1)没有多余状态;(不可达状态) (2)它的状态集合中,没有两个状态是相互等价的。 定义3.7 假定q1和q2是M中的两个不同状态,称q1和q2是等价的当且仅当如果从状态q1出发能扫描任意串w而停止于终态,那么从状态q2出发也能扫描同一个串w而停止于终态; 定义3.8 如果两个状态q1和q2不等价,则称这两个状态是可区分的。

  24. 3.3.2 DFA的化简 (最小化) • 化简方法 DFA M 最小化的方法是把M的状态集合Q划分成一些不相交的子集,使得每个子集中的任何两个状态是等价的,而任何两个属于不同子集的状态都是可区分的;然后在每个子集中任取一个状态作为代表,而删去子集中其余状态,并把射向其余状态的弧都改为射向作为“代表”的状态中。

  25. 3.3.2 DFA的化简 (最小化) 化简的具体步骤: (1)将DFA M的状态集Q分成两个子集:终态集F和非终态集Q-F,形成初始分划П。 (2)对П建立新的分划ПNew,对П的每个状态子集G,进行如下变换: ①把G分划成新的子集,使得G的两个状态s 和t属于同一子集,当且仅当对任何输入符号a,状态s和t转换到的状态都属于П的同一子集。 ②用G分划出的所有新子集替换G,形成新的分划ПNew。

  26. 3.3.2 DFA的化简 (最小化) • ( 3)如果ПNew=П,则执行第(4)步;否则令П= ПNew,重复第(2)步。 • (4)分划结束后,对分划中的每个状态子集,选出一个状态作代表,而删去其他一切等价的状态,并把射向其他状态的箭弧改为射向这个作为代表的状态。这样得到的DFA M′是与DFA M等价的一切DFA中状态数最少的DFA。 • 举例.

  27. 3.3.3从化简后的DFA到程序表示 识别标识符的DFSA1(见图 (a))需改为图 (b)所示状态,其中,l代表字母,d代表数字。 图 (a) 图(b) 如果赋予状态q0、q1与q2一定的操作,则可得识别单词标识符的程序流程图(见下图)。

  28. 3.4 正规文法与有穷自动机 正规文法与有穷自动机FA有着特殊的关系。可以证明:对任何正规文法G,可以构造一个FSA,它能而且只能识别语言L(G);反过来,对任何FSA,可以构造一个相应的正规文法G,它能生成由该FSA所识别的语言。

  29. 3.4.1从正规文法到FSA 设正规文法G有形如U→aV(aVT, VVN或V=)的产生式。由正规文法G可以直接构造一个有穷自动机A(简称自动机A),使L(A)=L(G)。构造步骤如下: ① 令正规文法G的终结符号集作为有穷自动机A的字母表; ② 文法G的每一个非终结符都作为自动机A的一个状态,特别是文法G的开始符作为自动机A的开始状态; ③ 在自动机A中增加一个新状态z作为自动机的终止状态; ④ 对于文法G的形如U→aV(aVT或a=,VVN)的产生式,在自动机A中构造形如t(U, a)=V的映射; ⑤ 对于文法G的形如U→a(aVT)的产生式,在自动机A中构造形如t(U,a)=z的映射。

  30. 3.4.2 从FA到正规文法 从正规文法可直接构造其自动机,反之,由自动机也可直接构造其正规文法。构造步骤如下: ① 自动机每一个状态的标记,均作为正规文法的非终结符,其中,自动机开始状态的标记将作为正规文法的开始符号。自动机的输入字母表中的所有符号,作为正规文法的终结符。 ② 对于自动机的映射t(U, a)=V(其中,U、V为自动机的状态标记;a为输入符号),构造文法的一条产生式 U→aV U、V为文法的非终结符,a为终结符。 ③ 对于自动机的终止状态Z,在正规文法中增加一条产生式 Z→

  31. 3.5 正规表达式与FA 3.5.1正规表达式的定义 正规语言又称正规集。正规表达式简称正规式是正规文法更紧凑的表示方法,是用来描述正规语言的。 以下是正规表达式的一些相关定义 。

  32. 3.5.1正规表达式的定义 定义3.9字母表上的正规表达式和正规集递归定义如下: ① a,a是上的一个正规表达式,它所表示的正规集为{a}。 ② 空串是上的一个正规表达式,它所表示的正规集为{}。 ③ 空集是上的一个正规表达式,它所表示的正规集为。 ④ 设e1与e2都是上的正规表达式,它们所表示的正规集分别为 L(e1)与L(e2),则 i) e1e2也是正规表达式,它所表示的正规集为 L(e1e2)=L(e1)∪L(e2); ii) e1 e2也是正规表达式,它所表示的正规集为 L(e1 e2)=L(e1)L(e2); iii) (e1)*也是正规表达式,它所表示的正规表达式为 L((e1)*)=(L(e1))*。 举例:

  33. 3.5.1正规表达式的定义 • 例:设有字母表 ∑={a,b},根据正规式与正规集的定义,有以下的正规式和正规集 正规式 正规集 a {a} a∣b {a,b} ab {ab} ( a∣b)( a∣b) {aa,ab,ba,bb} a* {ε,a,aa,aaa,…,任意个a的串}(a∣b)* {ε,a,b,aa,ab,ba,bb,…所有 a,b组成的串} (a︱b)*(aa︱bb) (a︱b)* ∑*上所有含两个连续的a 或两个连续的b组成的串

  34. 3.5.1正规表达式的定义 • 例:Σ={d,·,e,+,-} 则Σ上的正规式 d*(·dd*∣ε)(e(+∣- ∣ε)dd*∣ε)表示的是实数。其中d为0~9中的数字。比如:2,12.59,3.6e2和471.88e-1等等都是该正规集所表示集合中的元素。 • 例:Σ={字母,数字}上的正规式e1=字母(字母︱数字)*表示的是所有标识符的集合,或者用l代表字母,d代表数字,则Σ={l,d},则e1=l(l︱d)*,e2=dd*则定义了无符号整数。

  35. 3.5.1正规表达式的定义 • 例:设Σ={a,b,c},则aa*bb*cc*是Σ上的一个正规式,它所表示的正规集 L={abc,aabc,abbc,abcc,aaabc,...}={ambncl∣m,n,l≥1} • 例:设程序设计语言字母表是键盘字符集合,则程序设计语言部分单词符号可用如下正规式定义: 关键字 if |else |while |do 标识符 l(l|d)* l代表字母,d代表数字 整常数 dd* 关系运算符 <|<=|>|>=|<>

  36. 3.5.1正规表达式的等价性 定义3.10设e1与e2是上的两个正规表达式,若L(e1)=L(e2),则称e1与e2等价,记为e1=e2,如 a(ba)*=(ba)*a

  37. 3.5.1正规表达式的运算性质 定理3.1 设e1、e2和e3都是上的正规表达式,则 ① e1e2= e2e1 (交换律) ② (e1 e2) e3=e1(e2 e3), (e1e2)e3= e1(e2e3) (结合律) ③ e1(e2e3)= e1 e2e1 e3, (e1e2) e3= e1 e3 e2 e3(分配律) ④ e1= e1= e1 ⑤ ()*= (空集的闭包是空串) ⑥ e1=e1= ⑦ e1*= e1|e1* ⑧ (e1*)*=e1* ⑨ e1|=e1

  38. 3.5.2 正规表达式的文法描述 正规表达式是由下面的CFG GR=(N,,P,R)描述的。其中, N={R,C,L} ={|,(,),*,a, } 产生式集合P为: R→R|C (选择) R→C C→CL (连结) C→L L→(R) (括号) L→R* (闭包) L→a (正规语言中的任何符号) L→ (空串) 该文法描述了操作符:连结,选择和闭包的优先级以及形成正规表达式的结构规则。 运算符的优先级从高到低:闭包、连结、选择

  39. 3.5.3正规表达式与FSA的对应性 正规表达式和FSA是定义语言(符号串集)的两种不同形式。同一个语言,既可用FSA描述,也可用正规表达式描述。

  40. 3.5.4正规表达式到NDFSA的转换 对于字母表上任意一个正规表达式e,一定可以构造一个NDFSAM,使L(M)=L(e)。 先构造一个NDFSA M的一个广义转换图,其中,只有S与Z两个状态,S是开始状态,Z是终止状态,弧上是正规表达式e。然后,按照下图所示的替换规则对正规表达式e逐步进行分解,直到转换图中所有的弧上都是中的单个符号或为止。

  41. 3.5.4正规表达式到NDFSA的转换 (1) 替换成 (2) 替换成 (3) 替换成

  42. 3.5.5 NDFSA M到正规表达式的转换 对于一个具有输入字母表的NDFSAM,在上也可以构造一个正规表达式e,使L(e)=L(M)。具体操作如下: 首先,对NDFSA M进行拓广,在M的状态转换图中,新设置一个唯一的开始状态S和唯一的终止状态Z,并允许状态转换图中弧上可以为正规表达式。 然后,从开始状态S到原来所有的开始状态连接弧,再从原来所有的终止状态到Z状态也连接弧。修改后,构成了一个新的NDFSA,它只有一个初态结点S和一个终态结点Z,这个新的NDFSA M′显然和原NDFSA M等价。 接着,利用下图所示的替换规则,逐步消去M′中属于M的所有结点和有关连线,直到状态转换图中只剩下状态S和Z为止(这个过程称为消结)。在消结过程中,用相应的正规表达式标记连线。

  43. 3.5.5 NDFSA M到正规表达式的转换 (1) 替换成 (2) 替换成 (3) 替换成

  44. 3.5.6正规文法和正规式间的转换 正规文法到正规式的转换方法: (1)将正规文法中的每一个非终结符表示成关于它的一个正规式方程,获得一个联立方程组。从文法的规则到正规式方程的变换规则: 若A→a,则有A=a。 若A→aB∣β,则有A=aB+β。 (2)依照求解规则: 若x=ax︱β(或x=ax+β),则解为x=a*β。 若x=xa︱β(或x=xa+β),则解为x=βa*。 和正规式的分配率、交换率和结合率求关于文法开始符号的正规式方程组的解。 这个解就是关于文法开始符号S 的一个正规式,显然它表示了由该正规文法所描述的语言。 举例.

  45. 正规文法到正规式的转换 设有正规文法G[Z]: Z→0A A→0A∣0B B→1A∣ε 试给出该文法生成语言的正规式。 Z=0A (1) A=0A+0B (2) B=1A+ε (3) 将(3)代入(2)得 A=0A+01A+0 (4) 对(4)式利用分配律 A=(0+01)A+0 (5) 对(5)式使用求解规则得 A= (0+01)*0 (6) 将(6)式代入(1)式得 Z=0(0+01)*0 即正规文法G[Z]所生成语言的正规式是0(0∣01)*0。

  46. 3.5.6正规文法和正规式间的转换 字母表Σ上的正规式到正规文法G=(VN,VT,P,S)的转换方法如下: (1)令VT=Σ; (2)对任意正规式R选择一个非终结符Z生成规则 Z→R,并令S=Z; (3)若a和b都是正规式,对形如A→ab的规则转换成A→aB和B→b两个规则,其中B是新增的非终结符; (4)在已转换的文法中,将形如A→a*b的规则进一步转换成A→aA∣b; (5)不断利用规则(3)和(4)进行变换,直到每条规则最多含有一个终结符为止。

  47. 正规式到正规文法的转换 • 将描述标识符的正规式R=l(l∣d)*转换成相应的正规文法。 • 令S为文法的开始符号,根据规则(2) 有 • S→l(l∣d)* • 根据规则(3)变换为: • S→lA • A→(l∣d)* • 根据规则(4)变换为: • S→lA • A→(l∣d)A∣ε • 进一步变换为: • S→lA • A→lA∣dA∣ε • 去掉ε规则: • S→l∣lA • A→l∣d∣lA∣dA • 即为标识符的文法。

  48. 3.6 DFSA在计算机中的表示 对于一个DFSA=(Q, , t, q0, F),如果给出了它的映射t:QQ,那么,这个DFSA实际上也就确定了。因此,要在计算机中表示一个DFSA,只需在计算机中表示它的映射。 3.6.1 矩阵表示法 3.6.2 表结构 3.6.3 程序表示法 :我们也可以用程序来表示DFSA 。

  49. 3.6.1 矩阵表示法 DFSA的映射t:QQ,可表示成t(q, a)=q,其中,q,qQ,a。映射t(q, a)=q,在计算机中自然可用矩阵来表示,其中,状态q作为矩阵的行,输入字母a作为矩阵的列,映象q作为矩阵元素t(q, a)的值。将状态集Q中的所有状态排一个序:q0, q1, q2,…, qn;输入字母表中的所有字母也排一个序:a1, a2,…, am。设M是一个二维数组,若t(qi, qj)=qk,则令M[i ,j]=k,其中,i,k=0,1,2,…, n;j=1, 2,…, m。

  50. 3.6.2 表结构 DFSA的映射t:QQ,在计算机中可表示成一种表结构。在这个表结构中,每一个状态对应一个表,表中包括该状态的状态名、从该状态发出的弧数、每条弧上的标记(输入字母)以及弧达到的状态所在表的首地址。 若给定一个状态和输入符号,则可以直接在表中先查找到该状态所在的表项,进而在该表项中找到输入符号,按照其对应的(语义)动作的链接,前进到下一个状态。

More Related