形式语言与自动机学习day1(一)

159 阅读6分钟

[TOC]

形式语言与自动机学习(一)

挖坑待填(指本课程不含有但需要是由其自动过渡的知识或涉及的重要知识):

  • 计算理论:计算机的基本能力和限制是什么?

    • 可计算理论--哥德尔不完备:存在不可计算的问题
    • 计算复杂性理论--解决问题的占用资源及其原因?p与np?
  • 计算的形式化:

    • 图灵机
    • lamda理论

为了研究以上计算理论,我们需要建立一定的计算模型,于是诞生了形式语言与自动机。

  • 自动机理论:

    • 图灵机
    • 有限自动机
    • 文法?下推自动机
  • 形式语言:经过数学定义的语言。

在自然语言中,我们使用字符,即基本元,经过排列形成单词,单词形成句子,句子与句子,单词与单词的语法构建了一门自然语言。在化学分子式中也存在一套体系,在我们学习的高级程序设计语言,机器语言也同样如此,他们存在一定类似之处,我们试图将概念本身从中抽离出来,我们赋予一个名称,形式语言。

自动机的处理对象是形式语言,形式语言被自动机形式化的定义。

基本概念

为了描述好我们给出的名词,我们需要定义一些基本概念。基本概念里的概念在此不再被定义。

  • 字母表:符号(字符)的非空有穷集。例二进制字母表和英语字母表
1=0,1,{\sum}_1 = {0,1},
2=a,b,...,z{\sum}_2 = {a,b,...,z}
  • 字符串:由某字母表中符号组成的有穷序列
如果0,1,那么0100110011上的字符串如果\sum{0,1},那么0,1,00,11001是\sum_1上的字符串
  • 特别地,空串:表示有0个字符的字符串,记作

    ϵ,ϵ是一个任意的字母表\epsilon,\epsilon \notin\sum,\sum是一个任意的字母表
  • 基于递归定义基本运算:

    • 字符串的长度:字符串中符号所占1位置的个数。用||表示

      • 递归定义:

屏幕截图 2024-01-21 001727.png

  • 字符串的连接:若字符串x和字符串y进行连接,用xy表示连接。

    • 递归定义:

屏幕截图 2024-01-21 001936.png

  • 字符串幂运算:字符串x的n(n>=0)次幂

    • 递归定义:

屏幕截图 2024-01-21 002131.png 其中x的0次幂为0可以理解为一个重复0次x的字符串,显然字符串为0,理解上是很自然的。

  • 集合A的幂运算:集合A的n(n>=0)

    • 递归定义:

屏幕截图 2024-01-21 002502.png

  • 克林闭包(Kleene Closure):

    =Ui=0i.{\sum}^* = \mathbb{U}_{i = 0}^{∞}{\sum}^i.
  • 正闭包(Positive Closure):

    +=Ui=1i.{\sum}^+ = \mathbb{U}_{i = 1}^{∞}{\sum}^i.
=++{ϵ}{\sum}^* = {\sum}^+ + \{\epsilon\}

语言

定义

有了这些基本概念,我们可以很好的描述语言的定义。

为字母表,L,L称为上的语言若\sum 为字母表,∀L \subseteq {\sum}^*,则L称为\sum上的语言

可以感性的理解为字母表的幂运算的集合,这个集合包含一系列字符串。

在语言中,所有的字母表都是有穷的。

关于语言的典型问题

一些一般性问题可以转化为语言问题,利用语言的计算模型来求解。例如下面的

  • 语言成员性问题:判断某个数字是否为素数。我们关心的是这个一般性问题是否能转化为语言问题,通过语言的计算模型来解决,显然它是可以被回答的,我们仅需要判断这个数的因数的情况。我们可以将这种问题称为可判定问题,对于肯定的判断,例如xx是素数,我们能给出它的回答,但也存在一些问题是无法判断的,图灵停机问题。

形式化的证明

  • 演绎法

  • 归纳法:举例

  • 反证法

有穷自动机(有限状态机)

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

DFA可以看作是一个由一条输入带,一个读头, 一个有穷控制器(记录状态,FInite Control)组成的,分别从初始状态指向接受状态,于是可以抽象为由五个参数定义一个DFA。

于是DFA可以被定义为一个五元组:

A=Q,,δ,q0,FA = (Q,\sum,\delta,q_0,F)
Q:有穷状态集;Q:有穷状态集;
:有穷输入符号集或字母表;\sum:有穷输入符号集或字母表;
δ:Q×Q,状态转移函数;扩展的状态转移函数(接受一个字符串作为输入)Q×Q\delta:Q \times\sum \rightarrow Q,状态转移函数;扩展的状态转移函数(接受一个字符串作为输入):Q \times {\sum}^* \rightarrow Q
扩展到字符串的δ^:Q×Q扩展到字符串的\hat{\delta}:Q \times {\sum}^* \rightarrow Q

image-20240121093735329

FQ:接受状态集合;F \subseteq Q:接受状态集合;
q0Q:初始状态.q_0 \in Q:初始状态.

WHAT IS ”DETERMINSTIC“?

状态转移由输入和现有状态唯一确定:

δ(q,a)=p,q,pQ.\delta(q,a) = p,q,p\in Q.

e.q.请设计DFA,在任何由0和1构成的串中,接受含有01子串的全部串。

我们可以直接列出接收状态:

发现01

q3:当前的所有状态:

q1:刚刚读入1,但未发现01

q2:刚刚读入0,但未发现01

q3:发现01

于是可以定义为一个DFA A:

A=({q1,q2.q3},{0,1},δ,q1,{q3})A = (\{q_1,q_2.q_3\},\{0,1\},\delta,q_1,\{q_3\})

状态转移函数:

δ(q1,0)=q2,δ(q1,1)=q1,δ(q2,0)=q2,δ(q2,1)=q3,δ(q3,{0,1}=q3)\delta(q_1,0) = q2,\delta(q_1,1) = q1,\delta(q_2,0) =q_2,\delta(q_2,1) = q_3,\delta(q_3,\{0,1\} = q_3)

据此我们可以用状态转移图来描述这个状态转移函数:

屏幕截图 2024-01-21 091803.png

我们也可以用状态转移表来描述:

01
q1q2q1
q2q2q3
q3q3q3

DFA的语言与正则语言

前面我们提到语言可以被自动机形式定义,对于被DFA形式化定义的语言,我们称之为正则语言

D=(Q,,δ,q0,F)是一个DFA,则定义关于D接受的语言为:L(D)={wδ(q0,ω)F^}.D = (Q,\sum,\delta,q_0,F)是一个DFA,则定义关于D接受的语言为:L(D) = \{w \in {\sum}^* {|} \hat{\delta(q_0,\omega)\in F}\}.

如果语言L是一个DFA D的语言,即L = L(D),则称L是正则语言

e.q.设计DFA接受{0,1}上的字符串w,且w是3的倍数的二进制

我们可以直接得到状态转移表:

qn表示当前状态下的字符串w除3的余数为n

01
q0q0q1
q1q2q0
q2q1q2
qs(开始状态为空串)qiq1
qiqiqi

屏幕截图 2024-01-21 101626.png

非确定有穷自动机(Nonedeterminstic Finite Automanton)

  • 同一状态的相同输入可以有不同跳转;
  • 自动机可以同时处于多个状态.

由0和1构成的串中,接受全部以01结尾的串。

用DFA可以画出:image-20240123190116897

但是我们也可以使得自动机处于多种状态,比如读入q0状态读入{0,1}后续可能是01直接接受,也可能是不能接受但是能跳转,于是我们可以让自动机“分头行动”:image-20240123190523562

于是我们能得到NFA的定义:

定义一个五元组:

A=(Q,.δ,q0,F)A = (Q,\sum.\delta,q_0,F)

区别在于对delta的定义:

δ:Q×2Q,状态转移函数;扩展的状态转移函数(接受一个字符串作为输入)Q×2Q\delta:Q \times\sum \rightarrow 2^Q,状态转移函数;扩展的状态转移函数(接受一个字符串作为输入):Q \times {\sum}^* \rightarrow 2^Q
2Q是一个幂集,定义为:2Q={SSQ}2^Q是一个幂集,定义为:2^Q=\{S|S\subseteq Q\}

DFA与NFA的等价性

如果语言L被NFA接受,当且仅当L被DFA接受

使用子集构造法证明,因为NFA的跳转状态是所有DFA跳转状态的一个子集,那么利用子集构造法证明是自然的:

屏幕截图 2024-01-23 194359.png