0%

形式语言与自动机理论(1)有穷自动机

课程介绍

计算理论

  • 对计算本质的探索
  • 计算:非纯粹的算数,是一种以计算为有效的方式,获取答案的过程
  • 计算理论促进了计算机的发展,并随着计算机的诞生将重心转移到计算科学

核心问题:计算机的基本能力限制是什么?
包含了两个方面:

  • 可计算性理论:有哪些问题可以通过计算来解决?计算这种能力是否有边界?如果不是,为什么不是?对于严谨的机械而有效的过程的研究,我们需要严格定义的概念(算法)去描述它,需要严谨的模型(自动机理论)去分析它。
  • 计算复杂性理论:利用计算去解决可计算的问题,需要消耗多少资源

自动机理论:研究抽象机器及其所能解决的问题的理论,主要包括:

  • 图灵机
  • 有限状态机
  • 文法,下推自动机

自动机是研究语言的模型,语言则是具体的实例。自动机以语言为处理对象,语言以自动机为形式定义,两者密不可分。

形式语言:经数学定义的语言
语言:字符,单词,句子,语法

课程内容:

  • 正则语言
    • 有穷自动机
    • 正则表达式
    • 正则语言的性质
  • 上下文无关语言
    • 上下文无关文法
    • 下推自动机
    • 上下文无关语言的性质
  • 计算导论
    • 图灵机及其扩展
    • 不可判定性

基本概念

字母表:字符的非空有穷
$\Sigma_1=\lbrace 0,1 \rbrace $可以构建全部的二进制数,$\Sigma_2=\lbrace a,b,…,z \rbrace$可以构建出各种英语字母组成的语言,$\Sigma_3= \lbrace x|x是汉字 \rbrace$可以定义汉语。

字符串:由字母表中某些符号组成的有穷序列

空串:记为$\epsilon$,有0个字符的字符串,对任何字母表,$\epsilon\notin\Sigma$
$0,1,00,110100,…$称为字母表$\Sigma_1=\lbrace 0,1 \rbrace $上的字符串

符号约定:

  • 字母表:$\Sigma,\Gamma,…$
  • 字符:$a,b,c…$
  • 字符串:$…,w,x,y,z$
  • 集合:$A,B,C,…$

字符串的长度:字符串$w$中符号所占位置的个数,计为$|w|$,递归定义:

例:

字符串的连接:将首尾相接得到新字符串的运算,记为$x·y$或$xy$,递归定义:

其中

,且$x,y,z$都是字符串
例:$x=01,y=ab$

满足结合律:$x·y·z=(x·y)·z=x·(y·z)$,不满足交换律:$x·y\not=y·x$

字符串$x$的$n$次幂$(n\ge0)$,递归定义:

例1:

例2:

集合$A$和集合$B$的连接,计为$A·B$或$AB$,定义为:$A·B=\lbrace w | w = x·y, x \in A \text{且} y \in B \rbrace$
例:$A = \lbrace 0,11 \rbrace, B = \lbrace ab,ba \rbrace$

集合运算不满足交换律$AB\not=BA$

集合$A$的$n$次幂$(n\ge0)$,递归定义:

例:$A=\lbrace \epsilon \rbrace$,

即:若$\Sigma$为字母表,则$\Sigma^n$为$\Sigma$上长度为$n$的字符串集合。
若$\Sigma=\lbrace 0,1 \rbrace$,有:

克林闭包(Kleene Closure)

正闭包(Positive Closure)

显然:

语言:
定义:若$\Sigma$为字母表且$\forall L \subseteq \Sigma^{\ast}$,则$L$称为字母表$\Sigma$上的语言。

  • 自然语言,程序设计语言等
  • 二进制01语言:$\lbrace 0^n 1^n | n \le 0 \rbrace = \lbrace \epsilon,0,1,00,11,0101,… \rbrace$
  • $\emptyset$, $\lbrace \epsilon \rbrace$, 和$\Sigma^{\ast}$分别都是任意字母表$\Sigma$上的语言,但是注意!:$\emptyset \not = \lbrace \epsilon \rbrace$

语言的唯一要求是:字母表是有穷的

自动机器理论中的典型问题:判断给定的字符串$w$是否属于某个具体语言$L$,($w \in L?$)

语言和问题是相同的东西,任何问题可以转化为语言成员性问题,例如:“判断一个数是否是素数”中,素数是语言,参数是串。又如“判断一个C程序是否能被编译”,C语言是语言,程序是串。一部分问题是可以证明的,而一部分问题是无法证明的,如“图灵停机问题”

形式化证明:
演绎法,归纳法和反证法
例1:若$x$和$y$是$\Sigma$是$\Sigma$上的字符串,请证明$|xy|=|x|+|y|$
证明:通过对$|y|$的归纳来证明(从$y$的长度归纳):
基础:当$|y|=0$时,即$y=\epsilon$,$|xy|=|x\epsilon|=|x|=|x|+|\epsilon|=|x|+|y|$
递推:假设$|y|=n (n \ge 0)$时命题成立,那么当$|y|=n+1$时,即$y=wa$,$|xy|=|x(wa)|=|(xw)a|=|xw|+1=|x|+|w|+1=|x|+|wa|=|x|+|y|$

也可通过对$y$的归纳来证明(从$y$的结构归纳):
基础:当$y=\epsilon$时,$|x\epsilon|=|x|=|x|+|\epsilon|=|x|+|y|$
地推:假设$y=w(w \in \Sigma^{\ast})$时命题成立,那么当$y=wa$时,$|xy|=|x(wa)|=|xw|+1=|x|+|w|+1=|x|+|y|$

有穷自动机

  • 确定的有穷自动机
    • 形式定义
    • DFA的设计举例
    • 扩展转移函数与DFA的语言
  • 非确定的有穷自动机
  • 带有空转移的非确定的有穷自动机

有限状态机器(FSM,Finite State Machine),常见两种变形:Moore Machine,Mealy Machine,应用于数字电路设计,AI设计,通讯协议设计,文本搜索与识别

确定的有穷自动机:

  • 一条输入带:每个空格存储一个字符
  • 一个读头:左右移动,每次移动读取一格
  • 一个有穷控制器:有限个状态,能存储当前状态,能根据当前的状态和读头读数进行状态的改变

起初读头在输入带第一个字符,从左向右读,并改变自己的状态,不断循环这一过程,直到读完最后一个字符串,完成这一过程。根据有穷控制器自身的状态对这个字符串判断,得到两种结果:接受或拒绝

例子:用有穷自动机识别$\lbrace w \in \lbrace 0,1 \rbrace^{\ast} | w \text{的长度} |w| \text{是偶数.} \rbrace$

确定的有穷自动机的形式(DFA,Deterministic Finite Automation)定义:
A为五元组:

  • $Q$:有穷状态集
  • $\Sigma$:有穷输入符号集/字母表
  • $\delta:Q × \Sigma → Q$,状态转移函数
  • $q_0 \in Q$:初始状态
  • $F \subseteq Q$:终结状态集或接受状态集
    对于某一状态$q$,此刻读头读取字符为$a$,下一刻跳转的状态$p$是确定的:$p=\delta(q,a)$

例:设计一个DFA,在任何由0和1构成从串中,接受含有01字串的全部串。

  • $q_1$:未发现01,即使0都没出现过
  • $q_2$:未发现01,但上一次读入字符是0
  • $q_3$:已经发现了01
    该DFA可以定义为:

其中$\delta$为:

状态转移图:

  • 每个状态$q$对应一个节点,用圆圈表示
  • 状态转移函数$\delta(q,a)=p$为一条从$q$到$p$且标记为字符$a$的有向边
  • 开始状态$q_0$用一个标有start的箭头表示
  • 接受状态的节点,用双圆圈表示

状态转移表:

  • 每个状态$q$对应一行,每个字符$a$对应一列
  • 若有$\delta(q,a)=p$,用第$q$行第$a$列中填入的$p$表示
  • 开始状态$q_0$前,标记箭头 → 表示
  • 接受状态$q \in F$前,标记星号*表示
0 1
$→q_1$ $q_2$ $q_1$
$q_2$ $q_2$ $q_3$
$*q_3$ $q_3$ $q_3$

例2:若$\Sigma=\lbrace 0,1 \rbrace$,给出接受全部含有奇数个1的串DFA。

有两个状态:偶数个1和奇数个1,首先画出状态转移图:

对应的形式化定义为:

其中$\delta$为:

例3:若$\Sigma=\lbrace 0,1 \rbrace$,给出接受全部含有偶数个0和偶数个1的串的DFA

首先画出“接受偶数个0的状态转移图”

再画出“接受偶数个1的状态转移图”

将两个DFA的两种状态分别记为$a,b$和$m,n$,然后做笛卡尔积

两个状态的DFA与两个状态的DFA做笛卡尔积,有四个状态,新的DFA如下

其中$q_0=am$,$q_1=bm$,$q_2=an$,$q_3=bn$

扩展转移函数:
扩展$\delta$到字符串,定义扩展转移函数:$\hat \delta : Q × \Sigma^{\ast} → Q $为:

其中$a \in \Sigma, \ w,x \in \Sigma^{\ast}$,那么,当$w=a_0 a_1 … a_n$,则有:

例:接受全部含有01子串的DFA,$\hat\delta$处理串0101的过程:
状态转移图如下:

DFA的扩展转移函数$\hat\delta$在任意特定状态$q$接受特定字符串$w$结束状态都是确定

例:对任何状态$q$及字符串$x$和$y$,证明$\hat\delta(q,xy)=\hat\delta(\hat\delta(q,x),y)$
证明:对$y$使用归纳法:
当$y=\epsilon$,$\hat\delta(\hat\delta(q,x),\epsilon) = \hat\delta(q,x) = \hat\delta(q,x\epsilon)$
当$y=wa$时,$\hat\delta(q,xwa)=\delta(\hat\delta(q,xw),a)=\delta(\hat\delta(\hat\delta(q,x),w),a) = \hat\delta(\hat\delta(q,x),wa)$

若$D = (Q, \Sigma, \delta, q_0, F)$是一个DFA,则$D$接受的语言为:

DFA可以作为语言的识别器,也可以用来定义语言。如果语言$L$是某个DFA $D$的语言,即$L = L(D)$,则称$L$是正则语言。

  • $\emptyset$和$\lbrace \epsilon \rbrace$都是正则语言
  • 若$\Sigma$是字母表,$\Sigma^n$,$\Sigma^{\ast}$都是$\Sigma$上的正则语言。

例:设计DFA接受$\lbrace 0,1 \rbrace$上的字符串$w$,且$w$是3的倍数的二进制数
分析:读入一个0,相当于乘2;读入一个1,相当于乘2加1。根据除3取余结果有三种状态:$q_0=3k,q_1=3k+1,q_2=2k+2 (k \in N)$,根据此画出状态转移表:

0 1
$q_0$ $q_0$ $q_1$
$q_1$ $q_2$ $q_0$
$q_2$ $q_1$ $q_2$

如果把开始状态设为$q_0$,终结状态也是$q_0$,那么该DFA会接受$\epsilon$,而且该DFA还会接受0开头的非零二进制数。为了防止这两种情况,引入开始状态$q_s$和为串以0开头的状态,一旦串以0开头,在接受字符,它将被“stuck”。对应的状态转移图如下:

非确定的有穷自动机

  • 确定的有穷自动机
  • 非确定的有穷自动机
  • 形式语言
  • 扩展转移函数与NFA的语言
  • DFA与NFA的等价性
  • 带有空转移的非确定的有穷自动机

例:由0和1构成的串中,接受全部以01结尾的串,如何设计DFA
DFA如下

但是,这样的设计,实际上过于繁琐。

状态的非确定性转移:

  • 同一个状态在相同输入下,可以有多个转移状态
  • 自动机可以处在多个当前状态
  • 使得自动机的设计更容易

上述问题对应的非确定性状态转移图如下:

非确定性有穷自动机(Nondeterministic Finite Automation,NFA)A为五元组:

  • $Q$:有穷状态集
  • $\Sigma$:有穷输入符号集/字母表
  • $\delta:Q × \Sigma → 2^Q$,状态转移函数 $(2^Q=\lbrace S | S \subseteq Q \rbrace)$ 从一个状态可以跳转到多个状态
  • $q_0 \in Q$:初始状态
  • $F \subseteq Q$:终结状态集或接受状态集

例:由0和1构成的串中,接受全部以01结尾的串,设计NFA

五元组为$A=(\lbrace q_0,q_1,q_2 \rbrace. \lbrace 0,1 \rbrace. \epsilon. q_0, \lbrace q_2 \rbrace)$,转移函数

在DFA中,$\delta$函数 的返回值不再是一个状态,而是一个集合:$\delta(q_1,0)=\lbrace q_2 \rbrace $

当一个未定义的动作发送,返回也不再是$\epsilon$而是$\emptyset$:$\delta(q_2,0)=\emptyset$

对于NFA,只要有一条路径可以接受串,就可以接受该串:

也可将NFA的执行过程理解成操作系统中的 fork()

NFA的状态转移表:

0 1
$\to q_0$ $\lbrace q_0,q_1 \rbrace$ $\lbrace q_0 \rbrace$
$q_1$ $\emptyset$ $\lbrace q_2 \rbrace $
$* q_2$ $\emptyset$ $\emptyset$

NFA的扩展转移函数:

定义:扩展$\delta$到字符串,定义扩展转移函数$\hat\delta : Q × \Sigma^{\ast} → 2^Q$为:

其中$a \in \Sigma, \ w,x \in \Sigma^{\ast}$

NFA接受的语言:

定义:若$N = (Q, \Sigma, \delta, q_0, F)$是一个NFA,那么$N$接受的语言为

例:$L=\lbrace w \in \lbrace 0,1 \rbrace^{\ast} | w \text{的首尾字符相同} \rbrace$的NFA

开头为0则结尾是0,开头是1则结尾也是1。特殊考虑空串的情况下,接受$\epsilon$,可以轻易的画出对应的NFA状态转移图:

例:$L=\lbrace w \in \lbrace 0,1 \rbrace^{\ast} | w \text{ either begin or ends with 01} \rbrace $的NFA

DFA与NFA的等价性:

定理1:如果语言$L$被NFA接受,当且仅当$L$被DFA接受

一个DFA的语言,构造识别他的NFA,把转移函数改为返回单值集合的对应DFA转移函数即可;

一个NFA语言,要构造识别他的DFA,使用子集构造法:

如果NFA $N = (Q_N, \Sigma, \delta_N, q_0, F_N)$,构造DFA:$D = (Q_D, \Sigma, \delta_D, \lbrace q_0 \rbrace, F_D)$:

  • $Q_D = 2^{Q_N}$,即$\lbrace S | S \in Q_N \rbrace $
  • $F_D = \lbrace S | S \subseteq Q_N, S \cap F_N \not= \emptyset \rbrace$
  • $\forall S \subseteq Q_N, \ \forall a \in \Sigma$:

那么有$L(D)= L(N)$

证明:对$|w|$用归纳法,往证:$\hat\delta_D( \lbrace q_0 \rbrace,w) = \hat\delta_N(q_0,w)$

  • 归纳基础:当$|w|=0$,即$w=\epsilon$:
  • 归纳假设:假设$|w|=n$,命题成立
  • 归纳地推:当$|w|=n+1$则$w=xa (a \in \Sigma)$

因为$\hat\delta_D(\lbrace q_0 \rbrace, w) = \hat\delta_N(q_0, w)$,所以:

所以$L(D) = L(N)$

NFA和DFA的读头只能向一侧移动,如果读头可以向两侧移动,那就是一个图灵机。DFA和NFA在识别语言的能力上是等价的,在识别语言的效率上是否一致还是位置的($P=NP$)

子集构造法:

例:接受全部以01结尾的串的NFA

状态转移图和状态转移表如下:

0 1
$\to q_0$ $\lbrace q_0,q_1 \rbrace$ $\lbrace q_0 \rbrace$
$q_1$ $\emptyset$ $\lbrace q_2 \rbrace $
$* q_2$ $\emptyset$ $\emptyset$

转化为DFA,先构造对应DFA状态转移表,过程如下:首先把第一行初始状态$\q_0$写成集合$\lbrace q_0 \rbrace$,对应右侧状态不变。此时DFA的状态集为:$\lbrace \lbrace q_0 \rbrace, \lbrace q_0,q_1 \rbrace \rbrace$,此时产生了新的状态$\lbrace q_0,q_1 \rbrace$。把新状态$\lbrace q_0,q_1 \rbrace$对应的转移规则写入第二列,分别为$\lbrace q_0,q_1 \rbrace$和$\lbrace q_0,q_2 \rbrace $,此时产生了新的状态$\lbrace q_0,q_2 \rbrace $。把新的状态$\lbrace q_0,q_2 \rbrace $写入第三行,对应的转移状态是$\lbrace q_0,q_1 \rbrace$和$\lbrace q_0 \rbrace$,此时不再出现新的状态,完成。完整转移状态表如下:

0 1
$\to \lbrace q_0 \rbrace$ $\lbrace q_0,q_1 \rbrace$ $\lbrace q_0 \rbrace$
$\lbrace q_0, q_1 \rbrace$ $\lbrace q_0,q_1 \rbrace$ $\lbrace q_0,q_2 \rbrace $
$* \lbrace q_0,q_2 \rbrace$ $\lbrace q_0,q_1 \rbrace$ $\lbrace q_0 \rbrace$

画出对应的状态转移图如下:

例:设计DFA识别$L=\lbrace w \in \lbrace 0,1 \rbrace ^ * | w \text{倒数第3个字符是1} \rbrace$

要写出对应的DFA很困难,但是先写出对应的NFA则很简单,NFA的确可以起到简化有限状态机的设计的作用。先画出的NFA状态如下:

再写出对应的NFA状态转移表

0 1
$\to q_0 $ $\lbrace q_0 \rbrace$ $\lbrace q_0,q_1 \rbrace$
$ q_1 $ $\lbrace q_2 \rbrace$ $\lbrace q_2 \rbrace $
$ q_2 $ $\lbrace q_3 \rbrace$ $\lbrace q_3 \rbrace$
$* q_3 $ $\emptyset$ $\emptyset$

然后写出NFA转DFA的状态转移图

  • 带有空转移的非确定有穷自动机
  • $\epsilon-$闭包
  • 扩展转移函数与$\epsilon-$NFA的语言
  • $\epsilon-$NFA与DFA等价性

  • 允许状态因空串$\epsilon$而转移,即不消耗输入字符串就发生状态的改变
  • 进一步简化自动机的设w计

定义:带空转移非确定有穷自动机($\epsilon$-NFA),A为五元组:

  • $Q$:有穷状态集
  • $\Sigma$:有穷输入符号集/字母表
  • $\delta:Q × (\Sigma \cup \lbrace \epsilon \rbrace)\to 2^Q$,状态转移函数
  • $q_0 \in Q$:初始状态
  • $F \subseteq Q$:终结状态集或接受状态集

例:设计$L=\lbrace w \in \lbrace 0,1 \rbrace^{\ast} | \text{$w$倒数3个字符至少有一个是1} \rbrace$的NFA

可以利用之前的例子,增加几个接收状态即可:

也可以利用NFA多转移的特性,画出这样的转移状态图:

使用空转移可以进一步简化设计:

对应的状态转移表:

0 1 $\epsilon$
$\to q_0$ $\lbrace q_0 \rbrace$ $\lbrace q_0,q_1 \rbrace$ $\emptyset$
$q_1$ $\lbrace q_2 \rbrace$ $\lbrace q_2 \rbrace$ $\lbrace q_2 \rbrace$
$q_2$ $\lbrace q_3 \rbrace$ $\lbrace q_3 \rbrace$ $\lbrace q_3 \rbrace$
$*q_3$ $\emptyset$ $\emptyset$ $\emptyset$

自动机在某个状态,当读入某个字符,NFA和$\epsilon$-NFA可能有多个转移,NFA,$\epsilon$-NFA,DFA也可能都没有转移;当不读入字符时候就发生了转移,就一定是$\epsilon$-NFA。

$\epsilon$-NFA是一种特殊的NFA,后续的NFA,一般指的都是$\epsilon$-NFA

当输入字符串是011时,$\epsilon$-NFA的状态变化如下:

当某个状态有空转移的时候,需要考虑通过空转移能到的所有状态。这种对于当前状态,补充和扩展所有空转移到达的状态的,数学上定义就是闭包

状态的闭包
定义:状态$q$的$\epsilon-\text{闭包}$($\epsilon-Closure$)记为:$E_{CLOSE}(q)$,表示从$q$经过$\epsilon\epsilon…\epsilon$序列可达的全部状态集合,递归定义为:

  • $q \in E_{CLOSE}(q)$
  • $\forall p \in E{CLOSE}(q)$,若$r \in \delta(p,\epsilon)$,则$r \in E{CLOSE}(q)$

对与如下状态转移图,求闭包:

$E_{CLOSE}(p)$
1 $\lbrace 1,2,3,4,5 \rbrace $
2 $\lbrace 2,3,4 \rbrace $
3 $\lbrace 3,4 \rbrace $
4 $\lbrace 4 \rbrace $
5 $\lbrace 5 \rbrace $
6 $\lbrace 6,7 \rbrace $
7 $\lbrace 7 \rbrace $

需要注意状态的闭包一定包含自身!

集合的闭包:
定义:状态集$S$的$\epsilon$-闭包为:

即状态集中状态闭包的并集。

$\epsilon$-NFA的扩展转移函数:
定义:扩展$\delta$到字符串,定义扩展转移函数$\hat\delta:Q × \Sigma^{\ast} → 2^Q$为:

其中$a \in \Sigma$,$w,x \in \Sigma*$

续例:例:$L=\lbrace w \in \lbrace 0,1 \rbrace^{\ast} | \text{$w$倒数3个字符至少有一个是1} \rbrace$的NFA下,求$\hat\delta(q_0,10)$=?

根据扩展转移函数的定义:

若$E = (Q, \Sigma, \delta, q_0, F)$是一个$\epsilon$-NFA,则$E$接受的语言为:

构造与$\epsilon-$NFA等价的DFA:
子集构造法($\epsilon-$NFA消除空转移)
如果$\epsilon-$NFA $E = (Q_E, \Sigma, \delta_E, q_E, F_E)$,构造DFA

  • $ QD = 2^{Q_E} $,或 $ Q_D = \lbrace S \vert S \subseteq Q_E | S = E{CLOSE}(S) \rbrace $
  • $ qD = E{CLOSE}(q_E) $
  • $ F_D = \lbrace S | S \in Q_D, S \cap F_E \not= \emptyset \rbrace$
  • $ \forall S \in Q_D, \forall a \in \Sigma $

那么$L(D)=L(E)$

求上例$\epsilon-$NFA对应的DFA,先列出NFA的状态转移表和闭包:

0 1 $\epsilon$ $E_{CLOSE}$
$\to q_0$ $\lbrace q_0 \rbrace $ $\lbrace q_0,q_1 \rbrace $ $\emptyset$ $\lbrace q_0 \rbrace $
$q_1$ $\lbrace q_2 \rbrace $ $\lbrace q_2 \rbrace $ $\lbrace q_2 \rbrace$ $\lbrace q_1,q_2,q_3 \rbrace $
$q_2$ $\lbrace q_3 \rbrace $ $\lbrace q_3 \rbrace $ $\lbrace q_3 \rbrace$ $\lbrace q_2,q_3 \rbrace $
$*q_3$ $\emptyset$ $\emptyset$ $\emptyset$ $\lbrace q_3 \rbrace$

求对应$\epsilon$-NFA状态转移表过程和求NFA的状态转移表过程类似。从开始状态起,把$q_0$写成|$\lbrace q_0 \rbrace$,区别的是,对于返回状态还需求一次闭包。从上至下,从左至右求,最后因为$q_3$是接受状态,所以把带有$q_3$的都标记为接收状态。结果如下:

0 1
$\to \lbrace q_0 \rbrace$ $\lbrace q_0 \rbrace $ $\lbrace q_0,q_1,q_2,q_3 \rbrace $
$*\lbrace q_0,q_1,q_2,q_3 \rbrace $ $\lbrace q_0,q_2,q_3 \rbrace $ $\lbrace q_0,q_1,q_2,q_3 \rbrace $
$*\lbrace q_0,q_2,q_3 \rbrace $ $\lbrace q_0,q_3 \rbrace $ $\lbrace q_0,q_1,q_2,q_3q_2,q_3 \rbrace $
$*\lbrace q_0,q_3 \rbrace $ $\lbrace q_0 \rbrace $ $\lbrace q_0,q_1,q_2,q_3 \rbrace $

定理:如果语言$L$被$\epsilon$-NFA接受,当且仅当$L$被DFA接受。
证明:必要性显然成立,因为任何DFA都是$\epsilon-$NFA。下面证明充分性,对$w$归纳,往证$\hat\delta_E(q_E,w) = \hat\delta_D(q_D,w)$

  • 当$w = \epsilon$时
  • 当$w = xa$时

例:设计一个$\epsilon-$NFA,接受语言:$\lbrace 0^k | k是2或3的倍数$

即设计一个$\epsilon-$NFA接受长度为2或3的倍数的’0’串,对于这种两个或条件的,可以分别设计接受2的倍数0串的$\epsilon-$NFA和接受3的倍数0串的$\epsilon-$NFA,再用空转移的特性把他们合并起来:

Disqus评论区没有正常加载,请使用科学上网