Yin的笔记本

vuePress-theme-reco Howard Yin    2021 - 2025
Yin的笔记本 Yin的笔记本

Choose mode

  • dark
  • auto
  • light
Home
Category
  • CNCF
  • Docker
  • namespaces
  • Kubernetes
  • Kubernetes对象
  • Linux
  • MyIdeas
  • Revolution
  • WebRTC
  • 云计算
  • 人工智能
  • 分布式
  • 图像处理
  • 图形学
  • 微服务
  • 数学
  • OJ笔记
  • 博弈论
  • 形式语言与自动机
  • 数据库
  • 服务器运维
  • 编程语言
  • C
  • Git
  • Go
  • Java
  • JavaScript
  • Python
  • Nvidia
  • Rust
  • Tex
  • Shell
  • Vue
  • 视频编解码
  • 计算机网络
  • SDN
  • 论文笔记
  • 讨论
  • 边缘计算
  • 量子信息技术
Tag
TimeLine
About
查看源码
author-avatar

Howard Yin

303

Article

153

Tag

Home
Category
  • CNCF
  • Docker
  • namespaces
  • Kubernetes
  • Kubernetes对象
  • Linux
  • MyIdeas
  • Revolution
  • WebRTC
  • 云计算
  • 人工智能
  • 分布式
  • 图像处理
  • 图形学
  • 微服务
  • 数学
  • OJ笔记
  • 博弈论
  • 形式语言与自动机
  • 数据库
  • 服务器运维
  • 编程语言
  • C
  • Git
  • Go
  • Java
  • JavaScript
  • Python
  • Nvidia
  • Rust
  • Tex
  • Shell
  • Vue
  • 视频编解码
  • 计算机网络
  • SDN
  • 论文笔记
  • 讨论
  • 边缘计算
  • 量子信息技术
Tag
TimeLine
About
查看源码
  • 有穷自动机(Finite Automation, FA)/有限状态机(Finite State Machine, FSM)

    • 确定的有穷自动机(Deterministic Finite Automation, DFA)
      • 含义(DFA的使用方法)
      • 扩展状态转移函数δ^\hat{\delta}δ^:让状态转移函数直接处理字符串
      • 证明:(∀q∈Q)(∀x∈Σ)(∀y∈Σ)δ^(q,xy)=δ^(δ^(q,x),y)(\forall q\in Q)(\forall x\in\Sigma^)(\forall y\in\Sigma^)\hat\delta(q,xy)=\hat\delta(\hat\delta(q,x),y)(∀q∈Q)(∀x∈Σ)(∀y∈Σ)δ^(q,xy)=δ^(δ^(q,x),y)
      • DFA的语言
      • 示例:设计一个DFA使其接受全部以01结尾的语言L(D)={w∣w以01结尾}\bm L(D)=\{w|w\text{以01结尾}\}L(D)={w∣w以01结尾}
    • 非确定的有穷自动机(Nondeterministic Finite Automation, NFA)
      • 扩展状态转移函数δ^\hat{\delta}δ^:让状态转移函数直接处理字符串
      • NFA的语言
      • 示例:设计一个NFA使其接受全部以01结尾的语言L(N)={w∣w以01结尾}\bm L(N)=\{w|w\text{以01结尾}\}L(N)={w∣w以01结尾}
      • 示例:设计一个NFA使其接受全部以01开头或以01结尾的语言L(N)={w∣w以01开头}∪{w∣w以01结尾}\bm L(N)=\{w|w\text{以01开头}\}\cup \{w|w\text{以01结尾}\}L(N)={w∣w以01开头}∪{w∣w以01结尾}
    • DFA、NFA等价性:(∃一个NFA N=(Q,Σ,δ,q0,F))(L=L(N))⇔(∃一个DFA D=(Q,Σ,δ,q0,F))(L=L(D))(\exist \text{一个NFA }N=(Q,\Sigma,\delta,q0,F))(L=\bm L(N))\Leftrightarrow(\exist \text{一个DFA }D=(Q,\Sigma,\delta,q0,F))(L=\bm L(D))(∃一个NFA N=(Q,Σ,δ,q0,F))(L=L(N))⇔(∃一个DFA D=(Q,Σ,δ,q0,F))(L=L(D))
      • (∃一个NFA N=(Q,Σ,δ,q0,F))(L=L(N))⇒(∃一个DFA D=(Q,Σ,δ,q0,F))(L=L(D))(\exist \text{一个NFA }N=(Q,\Sigma,\delta,q0,F))(L=\bm L(N))\Rightarrow(\exist \text{一个DFA }D=(Q,\Sigma,\delta,q0,F))(L=\bm L(D))(∃一个NFA N=(Q,Σ,δ,q0,F))(L=L(N))⇒(∃一个DFA D=(Q,Σ,δ,q0,F))(L=L(D))
      • (∃一个NFA N=(Q,Σ,δ,q0,F))(L=L(N))⇐(∃一个DFA D=(Q,Σ,δ,q0,F))(L=L(D))(\exist \text{一个NFA }N=(Q,\Sigma,\delta,q0,F))(L=\bm L(N))\Leftarrow(\exist \text{一个DFA }D=(Q,\Sigma,\delta,q0,F))(L=\bm L(D))(∃一个NFA N=(Q,Σ,δ,q0,F))(L=L(N))⇐(∃一个DFA D=(Q,Σ,δ,q0,F))(L=L(D)):子集构造法(分支状态广度优先遍历)
      • 非确定性不能增加有穷自动机的能力
    • 带有空转移的有穷自动机(ε\varepsilonε-NFA)
      • 示例:设计L={w∈{0,1}∗∣w最后三个字符至少有一个是1}L=\{w\in\{0,1\}^*|w\text{最后三个字符至少有一个是1}\}L={w∈{0,1}∗∣w最后三个字符至少有一个是1}

有穷自动机(Finite Automation, FA)/有限状态机(Finite State Machine, FSM)

vuePress-theme-reco Howard Yin    2021 - 2025

有穷自动机(Finite Automation, FA)/有限状态机(Finite State Machine, FSM)


Howard Yin 2020-11-08 15:22:03 数学形式语言与自动机自动机计算理论

有穷自动机又称有限状态机。

有限状态机是描述有限状态系统的机器。

有限状态系统:

  • 电灯开关
  • 电梯门控制
  • 自动售货机
  • 自动取款机

有限状态机应用:

  • 数字电路设计
  • 电脑游戏AI
  • 通讯协议

# 确定的有穷自动机(Deterministic Finite Automation, DFA)

DFA为一个五元组AAA:

A=(Q,Σ,δ,q0,F)A=(Q, \Sigma, \delta, q_0, F) A=(Q,Σ,δ,q0​,F)

  • QQQ:有穷状态集
  • Σ\SigmaΣ:字母表(有穷输入符号集)
  • δ\deltaδ:状态转移函数,δ:Q×Σ→Q\delta:Q\times\Sigma\rightarrow Qδ:Q×Σ→Q
  • q0q_0q0​:初始状态,q0∈Qq_0\in Qq0​∈Q
  • FFF:终结状态集(接受状态集),F⊆QF\subseteq QF⊆Q

状态转移函数δ\deltaδ表示一个当前状态和输入符号的笛卡尔积到有穷状态集的映射:

Q×Σ→Q={(q,a)∣q∈Q∧a∈Σ}→QQ\times\Sigma\rightarrow Q=\{(q, a)|q\in Q\wedge a\in\Sigma\}\rightarrow Q Q×Σ→Q={(q,a)∣q∈Q∧a∈Σ}→Q

或者看成是一个输入状态和符号,输出状态的函数q′=δ(q,a)q'=\delta(q,a)q′=δ(q,a)。

# 含义(DFA的使用方法)

  1. 给出一个由Σ\SigmaΣ中的字符所组成的字符串
  2. DFA按顺序读取此字符串
  3. DFA根据当前状态q∈Qq\in Qq∈Q和当前读取到的字符a∈Σa\in\Sigmaa∈Σ,根据状态转移函数δ\deltaδ改变状态到q′q'q′
  4. 重复3直到字符串尾,设此时状态变为qeq_eqe​
  5. 若qe∈Fq_e\in Fqe​∈F,则“接受”此字符串,否则“拒绝”此字符串

# 扩展状态转移函数δ^\hat{\delta}δ^:让状态转移函数直接处理字符串

δ^:Q×Σ∗→Q\hat\delta: Q\times\Sigma^*\rightarrow Q δ^:Q×Σ∗→Q

δ^(q,w)={qw=εδ(δ^(q,x),a)w=xa\hat\delta(q,w)=\left\{ \begin{aligned} q&&w=\varepsilon\\ \delta(\hat\delta(q, x), a)&\quad&w=xa\\ \end{aligned} \right. δ^(q,w)={qδ(δ^(q,x),a)​​w=εw=xa​

含义:扩展状态转移函数δ^\hat{\delta}δ^的输出状态是状态转移函数δ\deltaδ按顺序处理了一个字符串后最终输出的状态。

δ^(q,a1a2a3...an)=δ(δ^(q,a1a2a3...an−1),an)=δ(δ(δ^(q,a1a2a3...an−2),an−1),an)=......=δ(δ(...δ(δ^(q,a1),a2)...,an−1),an)=δ(δ(...δ(δ(δ^(q,ε),a1),a2)...,an−1),an)=δ(δ(...δ(δ(q,a1),a2)...,an−1),an)\begin{aligned} \hat\delta(q, a_1a_2a_3...a_n)&=\delta(\hat\delta(q, a_1a_2a_3...a_{n-1}),a_n)\\ &=\delta(\delta(\hat\delta(q, a_1a_2a_3...a_{n-2}),a_{n-1}),a_n)\\ &=......\\ &=\delta(\delta(...\delta(\hat\delta(q, a_1),a_2)...,a_{n-1}),a_n)\\ &=\delta(\delta(...\delta(\delta(\hat\delta(q, \varepsilon), a_1),a_2)...,a_{n-1}),a_n)\\ &=\delta(\delta(...\delta(\delta(q, a_1),a_2)...,a_{n-1}),a_n)\\ \end{aligned} δ^(q,a1​a2​a3​...an​)​=δ(δ^(q,a1​a2​a3​...an−1​),an​)=δ(δ(δ^(q,a1​a2​a3​...an−2​),an−1​),an​)=......=δ(δ(...δ(δ^(q,a1​),a2​)...,an−1​),an​)=δ(δ(...δ(δ(δ^(q,ε),a1​),a2​)...,an−1​),an​)=δ(δ(...δ(δ(q,a1​),a2​)...,an−1​),an​)​

# 性质

  • 扩展转移函数可以从任意状态qqq开始处理字符串
  • 对于任意的串,扩展转移函数能保证一定跳转到某个状态

# 证明:(∀q∈Q)(∀x∈Σ∗)(∀y∈Σ∗)δ^(q,xy)=δ^(δ^(q,x),y)(\forall q\in Q)(\forall x\in\Sigma^*)(\forall y\in\Sigma^*)\hat\delta(q,xy)=\hat\delta(\hat\delta(q,x),y)(∀q∈Q)(∀x∈Σ∗)(∀y∈Σ∗)δ^(q,xy)=δ^(δ^(q,x),y)

证:

  • 当y=εy=\varepsilony=ε时,由定义可得

δ^(δ^(q,x),ε)=δ^(q,x)=δ^(q,xε)\hat\delta(\hat\delta(q,x),\varepsilon)=\hat\delta(q,x)=\hat\delta(q,x\varepsilon) δ^(δ^(q,x),ε)=δ^(q,x)=δ^(q,xε)

  • 假设y=wy=wy=w时成立,当y=way=way=wa时

δ^(δ^(q,x),wa)=δ(δ^(δ^(q,x),w),a)由δ^的定义=δ(δ^(q,xw),a)由假设y=w时成立=δ^(q,xwa)由δ^的定义=δ^(q,xy)由字符串连接的定义\begin{aligned} \hat\delta(\hat\delta(q,x),wa)&=\delta(\hat\delta(\hat\delta(q,x),w),a)&\text{由$\hat\delta$的定义}\\ &=\delta(\hat\delta(q,xw),a)&\text{由假设$y=w$时成立}\\ &=\hat\delta(q,xwa)&\text{由$\hat\delta$的定义}\\ &=\hat\delta(q,xy)&\text{由字符串连接的定义} \end{aligned} δ^(δ^(q,x),wa)​=δ(δ^(δ^(q,x),w),a)=δ(δ^(q,xw),a)=δ^(q,xwa)=δ^(q,xy)​由δ^的定义由假设y=w时成立由δ^的定义由字符串连接的定义​

# DFA的语言

某个DFA定义为D=(Q,Σ,δ,q0,F)D=(Q,\Sigma,\delta,q_0,F)D=(Q,Σ,δ,q0​,F),则DDD的所有接受的字符串的集合,称为DFADDD的 语言:

L(D)={w∈Σ∗∣δ^(q0,w)∈F}\bm L(D)=\{w\in\Sigma^*|\hat\delta(q_0,w)\in F\} L(D)={w∈Σ∗∣δ^(q0​,w)∈F}

# 示例:设计一个DFA使其接受全部以01结尾的语言L(D)={w∣w以01结尾}\bm L(D)=\{w|w\text{以01结尾}\}L(D)={w∣w以01结尾}

思路:

  1. 要识别以01结尾的串至少得有3个状态→q0→0q1→1q2→\rightarrow q_0\rightarrow^0q_1\rightarrow^1q_2\rightarrow→q0​→0q1​→1q2​→:
    • 开始q0q_0q0​、识别了一个0之后到q1q_1q1​、识别了一个1之后到q2q_2q2​
    • q2q_2q2​为接受状态,可以接受的字符串在识别完01之后就应该结束
  2. 如果q2q_2q2​之后还有输入明说明字符串没结束,需要再加几个状态转移过程
  3. q2→0q1q_2\rightarrow^0q_1q2​→0q1​:如果接受状态q2q_2q2​之后输入了0,我们应该期待再下一个输入为1,因此这时状态转移到q1q_1q1​
  4. q2→1q0q_2\rightarrow^1q_0q2​→1q0​:如果接受状态q2q_2q2​之后输入了1,之后应该重新输入01才有可能接受,因此这时状态应该转移到q0q_0q0​
  5. q1→0q1q_1\rightarrow^0q_1q1​→0q1​:如果q1q_1q1​之后又输入了0,我们应该期待再下一个输入为1,因此这时状态还是转移到q1q_1q1​
  6. q0→1q0q_0\rightarrow^1q_0q0​→1q0​:如果开始状态q0q_0q0​之后的输入就是1,那么应该等待0的出现,因此这时它应该等待,状态应该转移到q0q_0q0​

识别00101的过程:δ^(q0,00101)=q2\hat\delta(q_0,00101)=q_2δ^(q0​,00101)=q2​

# 非确定的有穷自动机(Nondeterministic Finite Automation, NFA)

NFA为一个五元组NNN:

N=(Q,Σ,δ,q0,F)N=(Q, \Sigma, \delta, q_0, F) N=(Q,Σ,δ,q0​,F)

  • QQQ:有穷状态集
  • Σ\SigmaΣ:字母表(有穷输入符号集)
  • δ\deltaδ:状态转移函数,δ:Q×Σ→2Q\delta:Q\times\Sigma\rightarrow 2^Qδ:Q×Σ→2Q
  • q0q_0q0​:初始状态,q0∈Qq_0\in Qq0​∈Q
  • FFF:终结状态集(接受状态集),F⊆QF\subseteq QF⊆Q

NFA和DFA的区别只在于状态转移函数的值域:2Q2^Q2Q指QQQ的幂集,即2Q2^Q2Q是QQQ的所有子集的集合。

2Q={S∣S⊆Q}2^Q=\{S|S\subseteq Q\} 2Q={S∣S⊆Q}

这意味着NFA状态转移函数的输出为一个状态集合而不是一个状态:{q′}=δ(q,a)\{q'\}=\delta(q,a){q′}=δ(q,a)。在每一个状态处,如果状态转移函数输出的状态集合中有多个状态,那么这个NFA每一个状态都要走到,对某个确定字符串的状态转移过程会呈现树状。

和DFA对于任意串都能保证转移到某个状态不同,NFA是可以卡住的:状态转移函数δ:Q×Σ→2Q\delta:Q\times\Sigma\rightarrow 2^Qδ:Q×Σ→2Q并不是对每一个(q,a)∈Q×Σ(q,a)\in Q\times\Sigma(q,a)∈Q×Σ都有输出,对于没有输出的情形,视为NFA卡住,不接受字符串。

# 扩展状态转移函数δ^\hat{\delta}δ^:让状态转移函数直接处理字符串

δ^:Q×Σ∗→2Q\hat\delta: Q\times\Sigma^*\rightarrow 2^Q δ^:Q×Σ∗→2Q

δ^(q,w)={{q}w=ε⋃p∈δ^(q,x)δ(p,a)w=xa\hat\delta(q,w)=\left\{ \begin{aligned} \{q\}&&w=\varepsilon\\ \bigcup_{p\in\hat\delta(q, x)}\delta(p, a)&\quad&w=xa\\ \end{aligned} \right. δ^(q,w)=⎩⎪⎪⎨⎪⎪⎧​{q}p∈δ^(q,x)⋃​δ(p,a)​​w=εw=xa​

与DFA扩展转移函数的不同之处在于:

  • 输出为集合
  • 扩展转移函数输出的集合为转移函数输出集合的并集

# NFA的语言

某个NFA定义为N=(Q,Σ,δ,q0,F)N=(Q,\Sigma,\delta,q_0,F)N=(Q,Σ,δ,q0​,F),则NNN的所有接受的字符串的集合,称为NFANNN的 语言:

L(N)={w∈Σ∗∣δ^(q0,w)∩F≠∅}\bm L(N)=\{w\in\Sigma^*|\hat\delta(q_0,w)\cap F\not ={\emptyset}\} L(N)={w∈Σ∗∣δ^(q0​,w)∩F​=∅}

# 示例:设计一个NFA使其接受全部以01结尾的语言L(N)={w∣w以01结尾}\bm L(N)=\{w|w\text{以01结尾}\}L(N)={w∣w以01结尾}

思路:

  1. 同DFA解法,要识别以01结尾的串至少得有3个状态→q0→0q1→1q2→\rightarrow q_0\rightarrow^0q_1\rightarrow^1q_2\rightarrow→q0​→0q1​→1q2​→
  2. 如果在q2q_2q2​还有输入,说明没有到字符串结尾,直接不定义状态转移让NFA卡住
  3. 如果在q1q_1q1​输入了0,则说明没有到字符串结尾或是不可接受的字符串,直接不定义状态转移让NFA卡住
  4. q0→01q0q_0\rightarrow^{01}q_0q0​→01q0​:字符串长度大于2时,→q0→0q1→1q2→\rightarrow q_0\rightarrow^0q_1\rightarrow^1q_2\rightarrow→q0​→0q1​→1q2​→不管怎么样都会卡住,需要定义一个“等待”以让NFA在到结尾前不要全部卡住,使之在q0q_0q0​等待

识别00101的过程:δ^(q0,00101)={q0,q2}\hat\delta(q_0,00101)=\{q_0,q_2\}δ^(q0​,00101)={q0​,q2​}

# 示例:设计一个NFA使其接受全部以01开头或以01结尾的语言L(N)={w∣w以01开头}∪{w∣w以01结尾}\bm L(N)=\{w|w\text{以01开头}\}\cup \{w|w\text{以01结尾}\}L(N)={w∣w以01开头}∪{w∣w以01结尾}

思路:

  1. 设计一个接受以01开头的字符串的NFA:
  1. 设计一个接受以01结尾的字符串的NFA:上题已设计
  2. 将这两个NFA连接起来:

# DFA、NFA等价性:(∃一个NFA N=(Q,Σ,δ,q0,F))(L=L(N))⇔(∃一个DFA D=(Q,Σ,δ,q0,F))(L=L(D))(\exist \text{一个NFA }N=(Q,\Sigma,\delta,q_0,F))(L=\bm L(N))\Leftrightarrow(\exist \text{一个DFA }D=(Q,\Sigma,\delta,q_0,F))(L=\bm L(D))(∃一个NFA N=(Q,Σ,δ,q0​,F))(L=L(N))⇔(∃一个DFA D=(Q,Σ,δ,q0​,F))(L=L(D))

# (∃一个NFA N=(Q,Σ,δ,q0,F))(L=L(N))⇒(∃一个DFA D=(Q,Σ,δ,q0,F))(L=L(D))(\exist \text{一个NFA }N=(Q,\Sigma,\delta,q_0,F))(L=\bm L(N))\Rightarrow(\exist \text{一个DFA }D=(Q,\Sigma,\delta,q_0,F))(L=\bm L(D))(∃一个NFA N=(Q,Σ,δ,q0​,F))(L=L(N))⇒(∃一个DFA D=(Q,Σ,δ,q0​,F))(L=L(D))

显然,DFA可以看作是一个状态转移函数输出的集合始终只有一个元素∣δ(p,a)∣≡1,p∈2Q|\delta(p,a)|\equiv1,p\in2^Q∣δ(p,a)∣≡1,p∈2Q的NFA。

# (∃一个NFA N=(Q,Σ,δ,q0,F))(L=L(N))⇐(∃一个DFA D=(Q,Σ,δ,q0,F))(L=L(D))(\exist \text{一个NFA }N=(Q,\Sigma,\delta,q_0,F))(L=\bm L(N))\Leftarrow(\exist \text{一个DFA }D=(Q,\Sigma,\delta,q_0,F))(L=\bm L(D))(∃一个NFA N=(Q,Σ,δ,q0​,F))(L=L(N))⇐(∃一个DFA D=(Q,Σ,δ,q0​,F))(L=L(D)):子集构造法(分支状态广度优先遍历)

假定有任意NFA:

N=(QN,Σ,δN,q0,FN)N=(Q_N,\Sigma,\delta_N,q_0,F_N) N=(QN​,Σ,δN​,q0​,FN​)

构造一个DFA:

D=(QD,Σ,δD,{q0},FD)D=(Q_D,\Sigma,\delta_D,\{q_0\},F_D) D=(QD​,Σ,δD​,{q0​},FD​)

其中:

  • QD=2QNQ_D=2^{Q_N}QD​=2QN​:DFA的状态集是NFA状态集的幂集
    • NFA一步可以取多个值,判断过程为树形,输入不同的值生成不同的树,DFA的状态就是由某个树的某一层的多个值所组成的集合
    • NFA中的每一种可能同时存在的状态组合(树的一层)都是DFA中的一个状态(相当于DFA的状态由NFA中的状态组合而成)
  • FD={S∣S⊆QN∧S∩FN≠∅}F_D=\{S|S\subseteq Q_N\wedge S\cap F_N\not ={\emptyset}\}FD​={S∣S⊆QN​∧S∩FN​​=∅}:DFA的接受状态是DFA的状态集2QN2^{Q_N}2QN​中与NFA接受状态集相交的状态集合的集合
    • NFA只要有一个分支输出了接受状态就接受,反映到DFA中就是结束时输出的状态集合中包含接受状态
  • δD(q,a)=⋃p∈qδN(p,a)\delta_D(q,a)=\bigcup_{p\in q}\delta_N(p,a)δD​(q,a)=⋃p∈q​δN​(p,a):DFA的状态转移函数输出为NFA状态转移函数对树中当前层状态输入下的输出状态集所组成的并集
    • 就是由树的上一层状态集合推导出树的下一层状态集合

那么,L(D)=L(N)\bm L(D)=\bm L(N)L(D)=L(N)。

# 证明子集构造法的正确性

思路:要证L(D)=L(N)\bm L(D)=\bm L(N)L(D)=L(N),即证它们对于任意输入字符串,最终状态都相等(∀w∈Σ∗)(δ^D({q0},w)=δ^N(q0,w))(\forall w\in\Sigma^*)(\hat\delta_D(\{q_0\},w)=\hat\delta_N(q_0,w))(∀w∈Σ∗)(δ^D​({q0​},w)=δ^N​(q0​,w))

证明:

用数学归纳法:

  1. w=εw=\varepsilonw=ε时,由DFA和NFA扩展转移函数的定义有δ^D({q0},ε)={q0}=δ^(q0,ε)\hat\delta_D(\{q_0\},\varepsilon)=\{q_0\}=\hat\delta(q_0,\varepsilon)δ^D​({q0​},ε)={q0​}=δ^(q0​,ε)成立
  2. 若x∈Σ∗x\in\Sigma^*x∈Σ∗时δ^D({q0},x)=δ^N(q0,x)\hat\delta_D(\{q_0\},x)=\hat\delta_N(q_0,x)δ^D​({q0​},x)=δ^N​(q0​,x)成立,那么对于w=xaw=xaw=xa:

δ^N(q0,w)=δ^N(q0,xa)由假设=⋃p∈δ^N(q0,x)δN(p,a)由NFA的定义=⋃p∈δ^D({q0},x)δN(p,a)由归纳假设=δD(δ^D({q0},x),a)由子集构造法的定义=δ^D({q0},xa)由DFA扩展转移函数的定义=δ^D({q0},w)由归纳假设\begin{aligned} \hat\delta_N(q_0,w)&=\hat\delta_N(q_0,xa)&\text{由假设}\\ &=\bigcup_{p\in\hat\delta_N(q_0, x)}\delta_N(p, a)&\text{由NFA的定义}\\ &=\bigcup_{p\in\hat\delta_D(\{q_0\},x)}\delta_N(p, a)&\text{由归纳假设}\\ &=\delta_D(\hat\delta_D(\{q_0\},x),a)&\text{由子集构造法的定义}\\ &=\hat\delta_D(\{q_0\},xa)&\text{由DFA扩展转移函数的定义}\\ &=\hat\delta_D(\{q_0\},w)&\text{由归纳假设}\\ \end{aligned} δ^N​(q0​,w)​=δ^N​(q0​,xa)=p∈δ^N​(q0​,x)⋃​δN​(p,a)=p∈δ^D​({q0​},x)⋃​δN​(p,a)=δD​(δ^D​({q0​},x),a)=δ^D​({q0​},xa)=δ^D​({q0​},w)​由假设由NFA的定义由归纳假设由子集构造法的定义由DFA扩展转移函数的定义由归纳假设​

因此有(∀w∈Σ∗)(δ^D({q0},w)=δ^N(q0,w))(\forall w\in\Sigma^*)(\hat\delta_D(\{q_0\},w)=\hat\delta_N(q_0,w))(∀w∈Σ∗)(δ^D​({q0​},w)=δ^N​(q0​,w)),进而:

w∈L(N)⇔δ^N(q0,w)∩FN≠∅由NFA语言的定义⇔δ^D({q0},w)∩FN≠∅由上已证⇔δ^D({q0},w)∩FD≠∅由子集构造法的定义⇔w∈L(D)由DFA语言的定义\begin{aligned} w\in\bm L(N)&\Leftrightarrow\hat\delta_N(q_0,w)\cap F_N\not =\emptyset&\text{由NFA语言的定义}\\ &\Leftrightarrow\hat\delta_D(\{q_0\},w)\cap F_N\not =\emptyset&\text{由上已证}\\ &\Leftrightarrow\hat\delta_D(\{q_0\},w)\cap F_D\not =\emptyset&\text{由子集构造法的定义}\\ &\Leftrightarrow w\in\bm L(D)&\text{由DFA语言的定义}\\ \end{aligned} w∈L(N)​⇔δ^N​(q0​,w)∩FN​​=∅⇔δ^D​({q0​},w)∩FN​​=∅⇔δ^D​({q0​},w)∩FD​​=∅⇔w∈L(D)​由NFA语言的定义由上已证由子集构造法的定义由DFA语言的定义​

所以L(D)=L(N)\bm L(D)=\bm L(N)L(D)=L(N)。

证毕。

# 非确定性不能增加有穷自动机的能力

因为有穷自动机能记住的状态是有限的,非确定性并不能让有穷自动机记住无限的状态。(可能需要其他知识才能理解)

# 带有空转移的有穷自动机(ε\varepsilonε-NFA)

ε\varepsilonε-NFA是可以在不读入字符串就进行状态转移的NFA。

ε\varepsilonε-NFA为一个五元组NNN:

N=(Q,Σ,δ,q0,F)N=(Q, \Sigma, \delta, q_0, F) N=(Q,Σ,δ,q0​,F)

  • QQQ:有穷状态集
  • Σ\SigmaΣ:字母表(有穷输入符号集)
  • δ\deltaδ:状态转移函数,δ:Q×(Σ×{ε})→2Q\delta:Q\times(\Sigma\times\{\varepsilon\})\rightarrow 2^Qδ:Q×(Σ×{ε})→2Q
  • q0q_0q0​:初始状态,q0∈Qq_0\in Qq0​∈Q
  • FFF:终结状态集(接受状态集),F⊆QF\subseteq QF⊆Q

# 示例:设计L={w∈{0,1}∗∣w最后三个字符至少有一个是1}L=\{w\in\{0,1\}^*|w\text{最后三个字符至少有一个是1}\}L={w∈{0,1}∗∣w最后三个字符至少有一个是1}

# 用NFA设计

# 方法1
  • 开始接收到1就跳转到全部状态,此后每接收到一个字符就往后跳一个状态。
  • 没有接收到1时永远停在q0q_0q0​。
  • 只要跳转到除q0q_0q0​外的任一状态,如果三步之内字符串不结束状态就卡住,从而达到“识别最后三个字符”的目的。
# 方法2
  • 开始接收到1就跳转到下一个状态,接收到1之后再跳转的任意状态都接受。
  • 没有接收到1时永远停在q0q_0q0​。
  • 只要跳转到除q0q_0q0​外的任一状态,如果三步之内字符串不结束状态就卡住,从而达到“识别最后三个字符”的目的。

# 用ε\varepsilonε-NFA设计

  • 开始接收到1就跳转到下一个状态。
  • 只要跳转到除q0q_0q0​外的状态,就自动跳转到q2q_2q2​和q3q_3q3​状态。
  • 没有接收到1时永远停在q0q_0q0​。
  • 只要跳转到除q0q_0q0​外的任一状态,如果三步之内字符串不结束状态就卡住,从而达到“识别最后三个字符”的目的。

Next-正则表达式

帮助我们改善此页面!
创建于: 2020-10-25 08:51:14

更新于: 2020-11-08 15:22:30