目录

  • 前置知识
  • 有限状态机
    • 分类
    • 确定的有限状态机(DFA)
    • 正则语言(regular language)
    • 不确定的有限状态机(NFA)
    • εεε-NFA
    • Moore Machine
    • Mealy Machine
  • 正则表达式(regular expression)
  • 语法(grammar)
    • 正规文法(regular grammar)
    • 上下文无关文法(context free grammar)
  • 下推自动机(pushdown automata)
  • 图灵机(turing machine)

这是对Neso Academy课程Theory of Computation & Automata Theory的一个知识记录,不是很全面,但是能在系统分析与验证的学习中用到。

前置知识

符号(Symbol)
a,b,c,0,1,2

字母表(alphabet)
字母表Σ是符号的集合,例如{a,b},{0,1,2}

字符串(string)
符号的序列,如a,aa,bb,aba

语言(language)
字符串的集合,如{00,11,01,10}

字母表的(power)
如果字母表Σ={0,1}
Σ0Σ_{0}Σ0​=所有长度为0的字符串的集合:Σ0={ϵ}Σ_{0}=\{\epsilon\}Σ0​={ϵ}
Σ1Σ_{1}Σ1​=所有长度为1的字符串的集合:Σ1={0,1}Σ_{1}=\{\ 0,1\}Σ1​={ 0,1}
Σ2Σ_{2}Σ2​=所有长度为2的字符串的集合:Σ2={00,01,10,11}Σ_{2}=\{\ 00,01,10,11\}Σ2​={ 00,01,10,11}
ΣnΣ_{n}Σn​=所有长度为n的字符串的集合

ΣnΣ_{n}Σn​中元素的个数为2n2^n2n

Σ∗=Σ0∪Σ1∪Σ2∪Σ3...Σ^{*}=Σ_{0}\cup Σ_{1}\cup Σ_{2}\cup Σ_{3}...Σ∗=Σ0​∪Σ1​∪Σ2​∪Σ3​...=字母表可能组成的所有字符串的集合

有限状态机

分类

有限状态机(finite state machine)也被称为有限自动机(finite automata),可以根据有没有输出分为两类
有输出的有限状态机:Moore Machine,Mealy Machine
无输出的有限状态机:DFA,NFA,ϵ\epsilonϵ-NFA

确定的有限状态机(DFA)

这是一种最最简单的模型,并且存储非常有限

DFA由一个五元组(S,Σ,s0,F,δ)(S,Σ,s_{0},F,δ)(S,Σ,s0​,F,δ)构成:

  • SSS是一组状态的集合
  • ΣΣΣ是输入字母表
  • s0s_{0}s0​是初始状态
  • FFF是终止状态的集合
  • δδδ是转换函数:S×Σ→SS×Σ\rightarrow SS×Σ→S

有如下确定有限状态机,DFA表示为一个有向图,没有源的箭头指向的是初始状态,两个圆圈代表终止状态,状态又圆圈表示,转换函数由有向线段表示,由一个状态指向另一个状态,线段上的字符代表着输入字符,所以:

  • S={A,B,C,D}
  • Σ={0,1}
  • s0=As_{0}=As0​=A
  • F={D}
  • δ(A,1)=B,δ(B,1)=A,δ(B,0)=D,δ(D,0)=B,δ(D,1)=C,δ(C,1)=D,δ(C,0)=A,δ(A,0)=C

    如果一个字符串t能够使得一个DFA M从初始状态最终达到终止状态,那么我们称t可以被M所接受(accept,也可以叫做识别recognize)。对于上面的例子,一个可被接受的输入为10

正则语言(regular language)

如果一个语言能被称为正则语言,当且仅当它能被某些有限状态机接受。

我们已经知道了接受这个概念,那么有哪些语言不是正则语言呢?

  1. 不能被有限状态机识别
  2. 需要存储空间(memory)

因为有限状态机的存储空间非常小,所以它不能存储或者计数字符串。

反例

  1. abaababaab
    这个语言由abaab重复组成,因为有限状态机不能存储字符串,所以它不是一个正则语言。
  2. anbna^nb^nanbn
    这个语言化简出来就是n个a和n个b,假如n=4,那么就是aaaabbbb,所以需要对a和b的个数进行计数,但是我们知道有限状态机不能计数,所以它也不是一个正则语言。

正则语言的操作
Union: A∩B={x∣x∈AorX∈B}A\cap B=\{x|x∈A\; or\; X∈B\}A∩B={x∣x∈AorX∈B}
Concatenation: A∘B={xy∣x∈Aandy∈B}A\circ B=\{xy|x∈A\; and\; y∈B\}A∘B={xy∣x∈Aandy∈B}
Star: A∗={x1x2x3...xk∣k≥0andeachxi∈A}A^*=\{x_{1}x_{2}x_{3}...x_{k}|k\ge0 \; and\; each\; x_{i}∈A\}A∗={x1​x2​x3​...xk​∣k≥0andeachxi​∈A}

定理1:两个正则语言的交集(union)仍然是正则语言
定理2:两个正则语言的级联(concatenation)仍然是正则语言

不确定的有限状态机(NFA)

在DFA中,给定一个状态和一个输入,它的下一个状态只有唯一的一种情况,但是对于不确定的有限状态机(NFA)来说,给定状态和输入,它的下一个状态可能会有多种情况。

NFA的定义与DFA一样也是一个五元组(S,Σ,s0,F,δ)(S,Σ,s_{0},F,δ)(S,Σ,s0​,F,δ),含义与DFA的一样,不过转换函数δδδ定义为S×Σ→2SS×Σ\rightarrow 2^SS×Σ→2S,因为对于同一个输入来说,转换有多种可能。

对于上面的例子,表示为:

  • S={A,B}
  • Σ={0,1}
  • s0=As_{0}=As0​=A
  • F={B}
  • δ(A,1)={A},δ(A,0)={AB},δ(B,1)=∅,δ(B,0)=∅

εεε-NFA

我们看到它前面带了一个εεε,这个符号表示空字符,εεε-NFA与NFA的区别就是,接受空字符也能发生状态转换。对于一般状态机来说,接受空字符的结果仍然为当前状态,但是εεε-NFA接受空字符后可以转变为另一个状态,这就产生了一种不确定性(undetermined),是一种NFA。

εεε-NFA的定义与NFA一样,不过转换函数δδδ:S×Σ∪ϵ→2QS×Σ\cup \epsilon \rightarrow 2^QS×Σ∪ϵ→2Q,表示不同状态之间的转换允许提供空字符。

Moore Machine

前面讲了几种不带有输出的自动机,另外两种mealy machine和moore machine是带有输出的自动机

摩尔状态机由六元组组成:

  • SSS是一组状态的集合
  • ΣΣΣ是输入字母表
  • ΔΔΔ是输出字母表
  • s0s_{0}s0​是初始状态
  • FFF是终止状态的集合
  • δδδ是转换函数:S×Σ→SS×Σ\rightarrow SS×Σ→S
  • λλλ是输出函数:Q→ΔQ\rightarrow ΔQ→Δ


这是一个摩尔状态机的示例图,如果我们输入1010,它的输出将会是a,a,b,a,b,∣|∣左边大写的字母代表状态,右边小写的字母代表的是输出,因为初始状态是A,所以它先会输出一个a,然后按照1010的输入顺序,每访问一个状态就输出该状态下对应的输出。

Mealy Machine

Mealy Machine由六元组组成:

  • SSS是一组状态的集合
  • ΣΣΣ是输入字母表
  • ΔΔΔ是输出字母表
  • s0s_{0}s0​是初始状态
  • FFF是终止状态的集合
  • δδδ是转换函数:S×Σ→SS×Σ\rightarrow SS×Σ→S
  • λλλ是输出函数:Σ×Q→ΔΣ×Q\rightarrow ΔΣ×Q→Δ


这是一个Mealy Machine的示例图,如果我们输入1001,它的输出为b,a,a,b,可以看到,Mealy Machine的输出是在转换关系上的,∣|∣左边代表转换,右边代表输出,对于Mealy来说它的输出主要和转换有关,而对于Moore Machine来说,它的输出与状态和转换都有关。

正则表达式(regular expression)

正则表达式用于以代数方式表示某些字符串集

  1. 任何终结符号(terminal symbol)包括ε(代表空字符),ϕ\phiϕ(代表null)都属于正则表达式
    像什么a,b,c,ε,ϕ\phiϕ都是正则表达式
  2. 两个正则表达式的并集也是正则表达式
    a,b是正则表达式那么a+b(表示关系或)也是
  3. 两个正则表达式的级联也是正则表达式
    a,b是正则表达式那么ab也是
  4. 正则表达式的迭代(或闭包)也是正则表达式
    a是正则表达式,那么a*也是正则表达式,a*=^,a,aa,aaa,…
  5. 遵循上述规则组合在一起的表达式也是正则表达式

上述规则用符号定义为:
E::=∅| ε | A | E+E’ | E.E’ | E*E ::= \varnothing\text{ | ε | A | E+E' | E.E' | E*} E::=∅ | ε | A | E+E’ | E.E’ | E*

语法(grammar)

首先我们要知道什么是语法(grammar),语法就是适用于交流的一组规则,用在计算机领域,Noam Chomsky给出了一种语法的数学模型,用于有效地编写计算机语言。

他给出了四种类型的语法:

Grammar type Grammar Accept Language Accept Automaton
TYPE-0 Unrestricted Grammar Recursively Enumerable Language Turing Machine
TYPE-1 Context Sensitive Grammar Context Sensitive Language Linear Bounded Automaton
TYPE-2 Context Free Grammar Context Free Language Pushdown automaton
TYPE-3 Regular Grammar Regular Language Finite State Automaton

一个语法G,可以描述为一个四元组G=(V,T,S,P)

  • V:变量或者非终结符号(non-terminal symbol)的集合
  • T:终结符号(terminal symbol)的集合
  • S:初始符号
  • P:终结符合非终结符的生成规则(production rules)

生成规则P形如α→βα\rightarrow βα→β,α和β是V∪TV\cup TV∪T中的字符串,并且α中至少有一个字符属于V

举例:G=({S,A,B},{a,b},S,{S->AB,A->a,B->b})

展示由语法生成字符串的过程:
从开始符号开始S,看到生成规则S→ABS\rightarrow ABS→AB,又因为A→aA\rightarrow aA→a,并且B→bB\rightarrow bB→b,所以我们可以得出:
S→AB→abS\rightarrow AB\rightarrow ab S→AB→ab

由语法推导(derivation)出的字符串的集合,我们称之为语法生成的语言(language)
例如,上面的那个例子,生成的语言可以记为L(G)={ab}

正规文法(regular grammar)

正规文法可以分为两个类别,右线性文法(right linear grammar)和左线性文法(left linear grammar)

如果所有的生成规则具有如下形式,那么我们称这种文法为右线性文法
A→xBA→xA \rightarrow xB \\ A \rightarrow x A→xBA→x
A,B∈V,x∈TA,B∈V,x∈TA,B∈V,x∈T

左线性文法也就同样的定义为
A→BxA→xA \rightarrow Bx \\ A \rightarrow x A→BxA→x
A,B∈V,x∈TA,B∈V,x∈TA,B∈V,x∈T

上下文无关文法(context free grammar)

上下文无关文法还是由四元组G=(V,T,S,P)组成,含义也一样

生成规则P定义为A→aA\rightarrow aA→a,a={V∪T}∗a=\{V\cup T\}^*a={V∪T}∗且A∈V

举例G={(S,A),(a,b),(S→aAb,A→aAb∣ϵ)}G=\{(S,A),(a,b),(S\rightarrow aAb,A\rightarrow aAb|ϵ)\}G={(S,A),(a,b),(S→aAb,A→aAb∣ϵ)}

上面的|符号两边均可以生成,我们可以尝试看看会生成什么字符串
S→aAb→aaAbb→aaaAbbb→aaabbb=a3b3(最后一步A生成ϵ)S\rightarrow aAb\rightarrow aaAbb\rightarrow aaaAbbb\rightarrow aaabbb=a^3b^3(最后一步A生成ϵ)S→aAb→aaAbb→aaaAbbb→aaabbb=a3b3(最后一步A生成ϵ)

可以想见该上下文无关文法生成的是形如ab次幂形式的语言,记为L(G)=anbnL(G)=a^nb^nL(G)=anbn

下推自动机(pushdown automata)

下推自动机(PDA)是一种上下文无关文法的实现方式,类似于有限状态机与正则表达式

  • PDA比有限状态机更加强大
  • PDA拥有更多的存储空间
  • PDA=有限状态机+一个栈(stack)

PDA由三个部分组成

  1. an input tape(就当成输入字符串)
  2. 有限控制单元(a finite control unit)
  3. 无限空间栈(a stack with infinite size)

PDA可以表示为一个七元组(S,Σ,Γ,δ,s0,z0,F)(S,Σ,Γ,δ,s_{0},z_{0},F)(S,Σ,Γ,δ,s0​,z0​,F)

  • SSS是一组状态的集合
  • ΣΣΣ是输入字母表
  • ΓΓΓ栈的字母表
  • δδδ是转换函数
  • s0s_{0}s0​是初始状态
  • z0z_{0}z0​是初始栈符号
  • FFF是终止状态的集合

δδδ有三个参数δ(s,a,X)

  • s是S中的一个状态
  • a是输入字母表中的字符或者是空字符(ε)
  • X是栈字母表中的字符

δδδ的输出是(p,γ)的集合

  • p是新状态
  • γ是字符串,用来代替栈顶的元素

如果γ=ε,说明栈是空的
如果γ=X,说明栈没有改变,因为我们输入的栈元素就是X,如果输出还是为X,说明栈没有改变
如果y=YZ,代表X被替换成了Z,并且Y被压入栈中(这个我个人理解就是把一个字符串按照字符从左到右一个个压入栈中,Z代表字符串最后一位,位于栈顶)

上图就是一个PDA,转换上的三个字符分别为a,b,c,a代表输入数字,可以为空(ε),b代表栈顶中要被pop的字符,当b为空时,代表没有元素会被pop,c代表被push入栈的字符,可以为空,代表没有字符压入栈。相比较于NFA,PDA会在状态转换的过程中处理额外的一个栈。

图灵机(turing machine)

图灵机是一种比下推自动机更为强大的自动机,在上面我们看到下推自动机在状态转换过程中操作一个栈,而图灵机会在状态转换过程中操作一个无限的tape


tape里面包含字符,其中后面那个两竖一横的符号是blank的意思,它是一个特殊的字符,用来填满无限的tape

tape head指向当前tape上的字符

tape上的操作

  • 可以对tape head指向的字符进行读/扫描操作
  • 可以对tape head指向的字符进行写/更新操作
  • 将tape head左移一格
  • 将tape head右移一格

操作规则:
1、
每一步操作都要执行一下操作

  • 读取当前的字符
  • 更新当前格子中的字符
  • 左移一格或者右移一格

如果当前tape指向最左边的格子,那么执行左移操作将不会发生移动

如果你不想更改当前格的字符,那么执行更新操作的时候只要让它更新为和当前字符一样即可

2、
操作行为类似于有限状态机

有初始状态

终止状态有两种:

  • accept state
  • reject state

计算结束后状态会变成下列三种中的一种:

  • 终止并且接受(accept)
  • 终止并且拒绝(reject)
  • 循环(loop,就是说没有终止)

Turing Machine可以表示为一个七元组(S,Σ,Γ,δ,s0,b,F)(S,Σ,Γ,δ,s_{0},b,F)(S,Σ,Γ,δ,s0​,b,F)

  • S是一组状态的集合
  • ΣΣΣ是输入字母表
  • ΓΓΓ是tape的字母表
  • δδδ是转换函数
  • s0s_{0}s0​是初始状态
  • bbb是空符号
  • FFF是终止状态的集合(accept or reject)

转换函数 δδδ定义为:
S×Σ→Γ×(R/L)×SS×Σ\rightarrow Γ×(R/L)×S S×Σ→Γ×(R/L)×S

这里的(R/L)就是执行左移或者右移操作

以下面这张图为例,在状态A时接收字符0,那么将会转变为状态B,并且在当前磁头位置写下1这个字符,然后磁头向右移动一格

Turing’s Thesis
1、任何能被数字计算机执行的事情,Turing Machine同样也能够完成(从这里可以看出Turing Machine能力相当强大)
2、如果你能写出一个算法来解决某个问题,那么同样可以写出一个图灵机程序来解决相同的问题

最后,在上面的那张表里面我们知道,图灵机能接受的语言是Recursively Enumerable Language

计算理论和自动机理论学习笔记相关推荐

  1. 【计算理论】计算理论总结 ( 自动机设计 ) ★★

    文章目录 一.自动机设计 二.自动机设计 1 三.自动机设计 2 四.自动机设计 3 五.自动机设计技巧 一.自动机设计 设计自动机 : 之前是根据给定的自动机 , 找到自动机所能识别的语言 ; 现在 ...

  2. 【计算理论】自动机 示例 ( 自动机示例 | 自动机表示方式 | 自动机计算流程简介 )

    文章目录 I . 自动机 简单 示例 ( 单向自动门 ) II . 简单自动机示例 及 描述方式 ( 二进制数据处理 自动机 ) III . 简单自动机示例 及 运行 ( 二进制数据处理 自动机 ) ...

  3. 【计算理论】自动机设计 ( 设计自动机 | 确定性自动机设计示例 | 确定性与非确定性 | 自动机中的不确定性 )

    文章目录 一. 设计自动机 ( 语言要求 ) 二. 设计自动机 ( 1 ) 开始状态 三. 设计自动机 ( 2 ) 状态 SSS 状态类型确定 四. 设计自动机 ( 3 ) 状态 SSS 输入输出分析 ...

  4. 【计算理论】确定性有穷自动机 ( 自动机组成 | 自动机语言 | 自动机等价 )

    文章目录 一.确定性有穷自动机组成 二.确定性有穷自动机计算过程 三.确定性有穷自动机定义 四.自动机 语言 与 等价 五.自动机语言 示例 一.确定性有穷自动机组成 DFA , 全称为 Determ ...

  5. 计算理论 形式语言与自动机_下推式自动机(PDA)| 计算理论

    计算理论 形式语言与自动机 Pushdown Automaton (PDA) is a kind of Automaton which comes under the theory of Comput ...

  6. 计算机理论导引第三版答案第四章,《计算理论导引》第四章:可判定性-学习笔记 | 诟屍...

    第四章:可判定性 4 Decidability 关于其他章节的内容,请点这:<计算理论导引>学习笔记 4.1 Decidable Languages 几个可判定的语言 acceptance ...

  7. 【计算理论】Pumping 引理 ( 四个等价概念 | 自动机界限 | Pumping 引理简介 | Pumping 引理证明正则表达式 | Pumping 引理示例分析 )

    文章目录 一.四个等价概念 二.自动机界限 三.Pumping 引理 四.Pumping 引理 示例 五.证明 语言 不是正则语言 步骤 六.证明 语言 不是正则语言 示例 一.四个等价概念 1 . ...

  8. 《视觉计算理论》阅读笔记——第一章

    注:<视觉计算理论>翻译自Marr的<Vision> Vison: A computational investigation into the human represent ...

  9. 计算理论2--可计算理论

    计算理论2--可计算理论 图灵机 博主正在学习INTRODUCTION TO THE THEORY OF COMPUTATION (Second Edition) --Michal Sipser,以及 ...

最新文章

  1. 分析460万份数据发现,女警比男警检查汽车几率少2倍,但发现违禁品还多10%
  2. eclipse+maven+jetty环境下修改了文件需要重启才能修改成功
  3. JAVA字符串前补零和后补零的快速方法
  4. 2.1.5 线程概念和多线程模型
  5. 【数据竞赛】Kaggle实战之单类别变量特征工程总结!
  6. Java9发布回顾Java 8的十大新特性
  7. winform窗口关闭提示
  8. C#.NET高级面试题
  9. JDK 中的证书生成和管理工具 keytool
  10. openNLP--Sentence Detector
  11. 大数据科学相关岗位,我们需要具备哪些数学基础?
  12. 迅为IMX6ULL开发板Linux下电容触摸屏实验-实验程序编写
  13. 国二office计算机基础知识,国二office计算机基础知识选择题
  14. 【源码】基于MPPT的光伏(PV)系统仿真
  15. 温控PLC三菱风机程序设计多路多路风机,温度控制,时间控制
  16. 除了秀米,微信排版还有什么好用的? ---短网址
  17. java8 lambda 处理分类和子分类的技巧
  18. 鸡啄米:C++编程入门系列之一(进制数)
  19. 怎么在多层循环中直接跳出循环
  20. 一些关于ROS的讨论 Robot Operating System – A flexible framework for writing robot software (ros.org)

热门文章

  1. java利用子类求正方形_Java 作业 重写正方形周长方法
  2. Acrgis实例操作11--计算整个栅格区域值的总和、人口密度分布趋势图、点数据批量生成面数据
  3. 车削加工参数优化切削参数 ( 切削速度、进给量、背吃刀量) 对表面粗糙度的影响
  4. JVM垃圾回收算法与原理详解
  5. 《教练型管理者》读书笔记-第4篇【教练实践】
  6. nginx-host绕过实例复现
  7. NewH3C—IP路由原理(静态路由)
  8. 解决虚拟光驱导致物理光驱丢失问题
  9. CF1492A - Three swimmers
  10. 也谈零基础学编程,需要学什么