形式语言与自动机

形式语言与自动机

第一讲:绪论&数学基础

一. 数学基础

1. 幂集合、关系、半群的概念
  • 幂集合:S的幂集是S所有子集的集合

    例如:S={a,b,c} 则S的幂集为2S2^S={\emptyset,{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}}

  • 笛卡尔积:A×B是有序数对

    例如:A = { 2, 4 } , B = { 2, 3, 5 }

    A X B = { (2, 2), (2, 3), (2, 5), ( 4, 2), (4, 3), (4, 5) }

  • 关系:R⊂A×B , A和B的笛卡尔积的任何子集都叫做A和B的一个关系

  • 等价关系

    要求:自反、传递、对称

    等价类:对集合A上等价关系R, 定义元素 x 的等价类:[x]~R~ = {y | x R y }

  • 半群

    半群是一个数学概念,它是一个集合,其上定义了一个封闭的二元运算,这个运算满足结合律。【重点就是封闭且结合律
    封闭:即对于集合中的任意两个元素进行这个运算后,结果仍然属于该集合
    结合律:即运算的顺序不影响最终结果
    具体地说,一个半群可以用符号表示为(S*)其中S是集合,*是定义在S上的二元运算。

2. 同构与同态
  • 同构映射:

    • 定义:
      若存在一个从半群(S, ∗)到半群(T, ◦)的一一对应函数f : S→T,且满足一定条件,那么我们称半群(S, ∗)与半群(T, ◦)是同构的。
      这个函数f被称为半群(S, ∗)到半群(T, ◦)的同构映射。

    • 同构条件:
      条件是对于S中的任意元素a和b,函数f满足f(a∗b) = f(a) ◦ f(b)
      换句话说,同构映射保持了半群之间的运算结构,即两个半群上的运算在同构映射下保持一致。

    • 证明同构的步骤:

      • Step 1 定义一个函数 f: S→T, 使得 Dom(f)=S;
      • Step 2 证明 f 是单射;
      • Step 3 证明 f 是满射;
      • Step 4 证明 f(a∗b)=f(a)◦f(b)
  • 同态映射:

    • 定义:

      给定两个半群(S, ∗)和(T, ◦),一个函数f:S→T被称为从半群(S, ∗)到半群(T, ◦)的同态映射。
      同态映射的定义要求对于S中的所有元素a和b,满足f(a∗b) = f(a) ◦ f(b)
      换句话说,同态映射保持了半群上的运算结构,即在映射下,两个半群中的元素进行运算后,结果的映射等于各自元素的映射再进行相应的运算。

    • 同态映像
      如果同态映射f是满射的(即映射到T上的每一个元素都有对应的原像),则称T是S的同态映像。
      同态不要求满射单射,同态映像要求了满射

3. 群:

在一个半群S中,若满足以下两个条件,则称S为一个群:

  • 存在一个元素𝑒 ∈ S,对于S中的任意元素a,都有𝑒 ∗ a = a ∗ 𝑒 = a 这个元素𝑒被称为单位元或幺元。
  • 对于S中的任意元素a,存在一个元素b ∈ S,使得a ∗ b = b ∗ a = 𝑒 这个元素b被称为a的逆元,记作a⁻¹。

二. 图

  • 有向图:G=<V,E> 节点V,边E,边是顶点集合上的一个关系
  • 标记图
  • 通路:相邻的边尾首连接的序列
  • 路径:没有重复边的通路
  • 简单路径:没有重复顶点的路径
  • 回路:从某顶点到自身的一条通路
  • 简单回路:只有开始顶点重复的回路
  • 树:根节点、父节点、子节点、叶节点,树里面没有环,树的高度为总层数-1

三. 证明方法

  • 演绎证明
    演绎法:前提→结论
    证明方法1:If-Then If 部分作为已知的命题,Then部分作为结论.
    证明方法2:If-and-only-if (当且仅当)

  • 数学归纳法

    • 形式1:数学归纳法是从有限到有限或无限的证明方法,包括归纳基础、归纳假设、归纳推导三个步骤。
    • 形式2:证明对任意自然数n,P(n)成立,证明P(0)成立,对于k<n,P(k)成立,证明P(n)成立。
    • 形式3(互归纳法):证明一个新的性质H(n),它等价于P1(n)与P2(n),…,Pm(n)的合取,并且证明H(n)比证明P1(n)更容易,那么通过证明H(n),我们也就证明了性质P1(n)。
    • 形式4(结构归纳法):
      由归纳定义的具有结构 f 的集合 S, 欲证: 对∀x∈S, 满足性质 P(x).
      基础:证明存在 a ∈ S,满足性质 P(a)
      归纳:若 a1, a2, …, an ∈ S, P(a1), P(a2), …, P(an), 证明 f (a1, a2, …, an) ∈ S, P(f (a1, a2, …, an))
  • 反证法
    原命题与逆否命题等价。
    欲证 若 A, 则 B, 可证明如下命题:若 非 B, 则 非 A

四. 形式语言基础

  • 字母表:一些表示字母的集合
  • 字符串:例如:Σ={a,b}\Sigma=\{a,b\},字符串可以有a ab abab aaaaabbbbbbaaba
  • 字符串的运算:连接wvwv 反转wRw^R
  • 空串:空串ε\varepsilon是不含任何字符的串,ε=0|\varepsilon|=0,空串是连接运算的单位元
  • 子串:字符串中部分连续字符构成的字符串 前缀+后缀(一一对应)
  • 字符串的幂运算:w0=εw^0=\varepsilon
  • 字母表的*闭包运算:字母表中所有有限字符构成串的集合
    例:Σ={a,b}\Sigma=\{a,b\} Σ={ε,a,b,aa,ab,ba,bb,aaa,bbb,}\Sigma^*=\{\varepsilon,a,b,aa,ab,ba,bb,aaa,bbb,……\}
  • 字母表的+闭包运算:Σ\Sigma^*中去除空串的集合
    例:Σ={a,b}\Sigma=\{a,b\} Σ+={a,b,aa,ab,ba,bb,aaa,bbb,}\Sigma^+=\{a,b,aa,ab,ba,bb,aaa,bbb,……\}

五. 语言运算

  • 形式语言:是用精确的数学或机器可处理的公式定义的语言

    而形式语言理论学科中所研究的形式语言,则是一个字母表上的某些有限长字符串的集合。一个形式语言可以包含无限多个字符串。

  • 语言:当字母表为Σ\SigmaLΣL\subseteq\Sigma^*成为Σ\Sigma上的一个语言

  • 空集与空串:空集是一个语言,空串是语言的一个元素

  • 语言的运算:集合运算、补运算、语言的反转、语言的链接

  • 语言的幂 Ln=LLLLL^n=LL……LL
    例:{a,b}3=aaa,aab,aba,abb,baa,bab,bba,bbb\{a,b\}^3={aaa,aab,aba,abb,baa,bab,bba,bbb}
    例:L={anbnn0}L=\{a^nb^n | n\ge 0\}L2={anbnambmn,m0}L^2=\{a^nb^na^mb^m|n,m\ge0\}aaabbaaabbbL2aaabbaaabbb\in L^2

  • 语言的*闭包:L=L0L1L2L^*=L^0\cup L^1\cup L^2\cup…

  • 语言的+闭包:L+=L{ε}L^+=L^*-\{\varepsilon\}

  • 自然语言:所有合法句子所构成的集合


第二讲:确定有限自动机

一. 确定有限自动机的概念

  1. 有限自动机:输入字符串—输出AcceptReject
  2. 状态转移图的构成:1个初始状态 + 输入 + 转移 + 状态(非终态)reject + 终态accept 0n0 \sim n
    状态转移图中:一个圈表示reject,两个表示accept。不同的圈用于区分。

二. 确定有限自动机的定义

  1. 确定有限自动机DFA(deterministic  finite  automata)DFA(deterministic\; finite\; automata)是五元组 A=(Q,Σ,δ,q0,F)A=(Q,\Sigma,\delta,q_0,F)

    • QQ :有限状态集
    • Σ\Sigma:输入符号集(输入字母表)
    • δ\delta: 转移函数
    • q0q_0: 开始状态
    • FF: 终态集合
  2. 相关公式和关系:

    q0QFQδ:Q×ΣQq_0 \in Q\quad F \subseteq Q\quad \delta : Q \times \Sigma \to Q

  3. 转移函数表:列了个表,表述了每个状态在不同的输入再去往哪一个状态。并且第一列中,如果加上\rightarrow则是初态,如果加上*则是终态accept

三. 扩展转移函数

  1. 扩展转移函数:

    δ:Q×ΣQ\delta^* : Q \times \Sigma^* \to Q

    表述案例:

δ(q0,ab)=q2δ(q0,aa)=q5δ(q0,abba)=q4 \begin{aligned} \delta^*(q_0,ab)&=&q_2\\ \delta^*(q_0,aa)&=&q_5\\ \delta^*(q_0,abba)&=&q_4 \end{aligned}

  1. 显然:存在一条从qqqq'的且标记为ww的路径

    δ(q,w)=q w=σ1σ2σ3  σk\delta^*(q,w)=q~`\\w=\sigma_1\sigma_2\sigma_3~\cdot\cdot~\cdot\sigma_k

  2. 递归的定义

    • 基础:δ(q,ε)=q\delta^*(q,\varepsilon)=q
    • 递归:δ(q,wσ)=δ(δ(q,w),σ)\delta^*(q,w\sigma)=\delta(\delta^*(q,w),\sigma)

四. 正则语言

  1. L(M)L(M)的定义:设DFADFAMM,由MM接受的所有字符串构成的集合称为MM的语言,记为L(M)L(M),即:

    L(M)={M中从初态到终态的串}L(M)=\{M\text{中从初态到终态的串}\}

  2. 正则语言:DFADFA接受的语言称为正则语言,即:

    正则语言构成的集合={L(M)MDFA}\text{正则语言构成的集合}=\{L(M)|M\text{是}DFA\}

  3. 对于DFA:M=(Q,Σ,δ,q0,F)DFA:M=(Q,\Sigma,\delta,q_0,F)

    • MM接受的语言为:L(M)={wΣ δ(q0,w)F}L(M)=\{w\in\Sigma^*|~\delta^*(q_0,w)\in F\}
    • MM不接受的语言:L(M)={wΣ δ(q0,w)F}\overline{L(M)}=\{w\in\Sigma^*|~\delta^*(q_0,w)\notin F\}

五. DFA的构造


第三讲:非确定有限自动机

一. 非确定有限自动机的概念

  • NFA存在的一些特殊行为

    • Σ={a}\Sigma=\{a\}存在一个状态有两个变迁选择
    • 存在状态没有迁移(停机)
  • NFA接受

    • 字符串NFA路径接受
      NFA的一条路径中,字符串w输入完,且处于NFA的终态。
    • 字符串FNA接受
      NFA至少存在一条接受字符串w的路径
  • 字符串NFA拒绝

    • 字符串w被一条路径拒绝
      • 字符串输完但是不在终态
      • 字符串无法输完(脱机)
    • 字符串w被NFA拒绝
      NFA中没有一条路径可以接受字符串w
  • NFA的语言:NFA接受字符串的集合

二. ε\varepsilon-转移

  • ε\varepsilon符号不出现在的带符号
  • (可以把它视为一个微小变量可以直接过去)

三. 非确定有限自动机的定义

  • 非确定有限自动机是五元组A=(Q,Σ,δ,q0,F)A=(Q,\Sigma,\delta,q_0,F)
    • QQ:有限状态集
    • Σ\Sigma:输入符号集
    • δ\delta:转移函数
    • q0q_0:开始状态
    • FF:终态集合
  • DFADFA不同:δQ×Σ{ε}2Q\delta\text{:}Q\times\Sigma\cup\{\varepsilon\}\rightarrow2^Q
  • ε\varepsilon-闭包
    • 状态qqε\varepsilon-闭包是qq(包括qq自身)的ε\varepsilon路径到达的所有状态,记为EC(q)EC(q)
    • 递归定义:设NFA A=(Q,Σ,δ,q0,F),qQ,EC(q)NFA~A=(Q,\Sigma,\delta,q_0,F),q\in Q,EC(q)满足如下条件:
      • qEC(q)q\in EC(q)
      • pEC(q)p\in EC(q)rδ(p,ε)r\in\delta(p,\varepsilon),则rEC(q)r\in EC(q)
    • 集合SSε\varepsilon-闭包EC(S)EC(S)定义为EC(S)=EC(q)EC(S)=\cup EC(q)

四. 扩展转移函数

  • NFANFA状态转移函数 δ:Q×Σ{ε}2Q\delta:Q\times\Sigma\cup\{\varepsilon\}\rightarrow2^Q
    • δ\delta扩展之一: δ:Q×Σ2Q\delta ^*:Q\times\Sigma ^*\rightarrow2^Q
    • δ\delta扩展之二: 从ε\varepsilon-闭包,到ε\varepsilon-闭包
  • δ(q,ε)=EC(q)\delta^*(q,\varepsilon) = EC(q)的归纳
    xΣ,aΣ(εa),\forall x \in \Sigma^*, a \in \Sigma(\varepsilon \neq a),
    δ(q,xa)=EC(pδ(q,x)δ(p,a))\delta^*(q, xa) = EC \left( \bigcup_{p \in \delta^*(q, x)} \delta(p, a) \right)
    说明: 对 δ(q,x)\delta^*(q, x) 中的每个状态,都可以从 δ\delta 函数中一个状态跳转;将这些状态集合取并集后,对结果中的每一个元素求 ε\varepsilon-闭包,再将结果一起。

五. 等价性证明

  • 自动机M1M_1和自动机M2M_2成为等价,如果两自动机接受的语言相同,即L(M1)=L(M2)L(M_1)=L(M_2)
  • NFANFA接受的语言=正则语言
  • NFANFA转换DFADFA的算法:子集构造法
    • NFANFA的初始状态是q0q_0。则DFADFA的初始状态是[EC(q0)][EC(q_0)]
    • 对DFA中的部分状态qi,qj,...,qmq_i, q_j, ..., q_m
      如果定义NFA中存在如下迁移: δ(qi,a),δ(qj,a),\bigcup\delta^*(q_i, a), \delta^*(q_j, a), \dots = {qi,qj,...,qm}\{q_i', q_j', ..., q_m'\}
      则在DFA中添加相应移动: δ([qiqj...qm],a)=[qiqj...qm]\delta([q_i q_j ... q_m], a) = [q_i' q_j' ... q_m']
    • DFADFA接受状态:若状态qjq_jNFANFA中的终态,则DFADFA中的状态[qiqjqm][q_iq_j\dots q_m]DFADFA中的终态。
  • 定理:对于NFA MNFA ~M,通过上述构造过程得到的DFA MDFA~M\prime。同时,DFA可以视为NFA的特例于是有,即:L(M)=L(M)L(M)=L(M^\prime)

第四讲:正则语言与正则表示

一. 单一终结状态的NFA

  • 任何一个NFA都可以等价于只有一个终态的NFA,构造方法为:新建一个终态qfq_f,并将原来的所有终态都指向qfq_fε\varepsilon转移),并且将原来的终态都变为非终态。

二. 正则语言的运算性质

  • 正则语言对于以下运算封闭
    • 并:L1L2L_1\cup L_2
      L1L2={anbn0}{ba}L_1\cup L_2=\{a^nb|n\ge0\}\cup\{ba\}
    • 连接:L1L2L_1L_2
      L1L2={anbn0}{ba}={anbban0}L_1L_2=\{a^nb|n\ge0\}\{ba\}=\{a^nbba|n\ge0\}
    • 星运算:L1L_1^*
      表示一个状态集合的任意次重复,包括零次。
    • 反转:L1RL_1^R
      反转所有的迁移,将初态变为终态,反之亦然
    • 补:L1\overline {L_1}
      L1={a,b}{anb}\overline {L_1}=\{a,b\}^*-\{a^nb\}
    • 交:L1L2L_1 \cap L_2

上面的性质可以用构造能接受上面语言的NFA证明。
对于语言的反转,先转换为只有一个终态的NFA,然后将所有的迁移反转,初态终态调换。
对于语言的补运算,设计接受语言的DFA,然后将所有的终态修改为非终态,非终态修改为终态。

  • 空集是正则语言
  • 在NFA中删除除初态外的一部分,得到的自动机表达能力一定更弱

三. 正则表示和语言

  • 正则表示也可以表示语言。如:(a+bc)(a+b\cdot c)^*
    描述了如下的语言
    {a,bc}={ε,a,bc,aa,abc,bca,}\{a,bc\}^*=\{\varepsilon,a,bc,aa,abc,bca,\cdots\}

  • 递归定义:

    • 基础:,ε,a\varnothing,\varepsilon,a
    • 规则:给定两个正则表示r1,r2r_1,r_2r1+r2,r1r2,r1,(r1)r_1+r_2,r_1\cdot r_2,r_1^*,(r_1)都是正则表示
  • 正则表示运算符的优先级:

    • *(星闭包)
    • \cdot(连接)
    • ++(并)
  • 正则表示的语言:正则表示rr的语言记为 L(r)L(r)

对于基本的正则表示:特别注意

L()=L(ε)={ε}L(a)={a}\begin{aligned} L(\varnothing)&=\emptyset\\ L(\varepsilon)&=\{\varepsilon\}\\ L(a)&=\{a\} \end{aligned}

由上面的基本表示能递归定义正则表示式。

  • 等价正则表示:对于正则表示r1r2r_1\text{、}r_2,如果有L(r1)=L(r2)L(r_1)=L(r_2),则称r1r_1r2r_2是等价的,记为:r1=r2r_1=r_2

四. 正则表示和正则语言

  • 定理:正则表示的语言是正则语言

    • 一方面:由正则表达式的定义过程和正则语言的性质可以证明
  • 状态消去法

    • 思想:设正则语言对应NFA  MNFA~~ M
      • 扩展自动机M,将正则表示作为转移的输入.
      • 消去某一中间状态:
        • 与其相关的转移弧同时消去;
        • 通过修改每一个前趋状态及后继状态的转移弧标记,弥补消去的转移弧

    • 步骤:
      1. 每一终态qq,依次消去除qq和初态q0q_0之外的其它状态:
      2. qq0q \neq q_0,得到对应的正则表示为RT(U+SRT)R^*T(U+SR^*T)^*(R+TUS)TU(R+TU^*S)^*TU^*
      3. q=q0q = q_0,得到对应的正则表示为RR^*
      4. 最终的正则表示为每一终态对应的正则表示之和(并).
  • 路径迭代法,类似于图中的WarshallWarshall算法

    • 思想:设正则语言对应的DFA  ADFA ~~A
      • AA的状态集用{1,2,,n}\{1,2,\cdots,n\}表示,且初态为1

      • Rij(k)R_{ij}^{(k)}为表示如下语言的正则表示:
        wL(Rij(k))w\in L(R_{ij}^{(k)}) if 从iijj有一条标记为ww的路径,且这条路径除了iji\text{、}j之外,所有其他状态的编号不大于kk
        对所有的ijk=1,2,ni\text{、}j\text{、}k=1,2,\cdots\text{,}n迭代计算Rij(k)R_{ij}^{(k)}
        Rij(k)=Rij(k1)+Rik(k1)(Rkk(k1))Rkj(k1)R_{ij}^{(k)}=R_{ij}^{(k-1)}+R_{ik}^{(k-1)}(R_{kk}^{(k-1)})^*R_{kj}^{(k-1)}

      • 通过(2)的迭代过程最终可以计算出Rij(n)(i,j=1,2,3,,n)R_{ij}^{(n)}\text{,}(i,j=1,2,3,\cdots,n)

      • 将所有的R1j(n)R_{1j}^{(n)}相"+"(jj为任一终态)

五. 正则语言的同态

  • 同态(homomorphism)(homomorphism)的定义
    设映射:h:ΣTh:\Sigma \rightarrow T^*,对w=a1a2anΣw=a_1a_2\cdots a_n\in\Sigma^*,定义h(w)=h(a1)h(a2)h(an)h(w)=h(a_1)h(a_2)\cdots h(a_n),则映射hhΣ\Sigma一个同态。

  • 对语言LΣL\subseteq\Sigma^*,定义LL的同态h(L)={h(w)  wL}h(L)=\{h(w)~|~w\in L\}

  • 同态的作用为将语言放在较小的字母表上进行操作

  • 定理:若LL为正则语言,h:ΣTh:\Sigma \rightarrow T^*h(L)h(L)也是正则语言

  • EE的结构进行归纳

    • 基础:为EEε\varepsilon\varnothing,有h(E)=Eh(E)=E,则为正则表示,且显然L(h(E))=h(L(E))L(h(E))=h(L(E))
      EEaa,有h(E)=h(a)h(E)=h(a),则为正则表示,且L(h(E))=h(L(E))={h(a)}L(h(E))=h(L(E))=\{h(a)\}
    • 归纳:对E=E1E2,h(E1),h(E2)E=E_1E_2,h(E_1),h(E_2)为正则表示,且L(h(E1))=h(L(E1))L(h(E2))=h(L(E2))L(h(E_1))=h(L(E_1))\text{、}L(h(E_2))=h(L(E_2))
      由定义:h(E)=h(E1)h(E2)h(E)=h(E_1)h(E_2)
      h(E)h(E)为正则表示,且:L(h(E))=h(L(E))L(h(E))=h(L(E))
    • 归纳:类似证明E=E1+E2E=E_1+E_2E=E1E=E_1^*
  • 正则语言的逆同态

    • 设同态映射h:ΣTh:\Sigma \rightarrow T^*,对语言LTL\subseteq T^*,定义LL的逆同态:h1(L)={w  wΣ h(w)L}h^{-1}(L)=\{w~|~w\in \Sigma^* \land~ h(w)\in L\}
  • 定理:若LTL\subseteq T^*为正则语言,h:ΣTh:\Sigma\rightarrow T^*为同态映射,则h1(L)h^{-1}(L)也是正则语言。

六. 正则表示的代数定律

注意下面的ε\varepsilon指的是{ε}\{\varepsilon\}
LMNL\text{、}M\text{、}N均为正则表示

  • 交换律与结合律

    L+M=M+L(L+M)+N=L+(M+N)(LM)N=L(MN)\begin{aligned} &L+M=M+L\\ &(L+M)+N=L+(M+N)\\ &(LM)N=L(MN) \end{aligned}

  • 单位元和零元
    • 对于并运算,单位元是\emptyset
    • 对于连接运算,单位元是{ε}\{\varepsilon\},零元是\emptyset

    +L=L+=LεL=Lε=LL=L=\begin{aligned} &\varnothing + L = L+\varnothing = L\\ &\varepsilon L=L\varepsilon=L\\ &\varnothing L=L\varnothing=\varnothing \end{aligned}

  • 分配律

    L(M+N)=LM+LN(M+N)L=ML+NL\begin{aligned} &L(M+N)=LM+LN\\ &(M+N)L=ML+NL \end{aligned}

  • 等幂律

    L+L=LL+L=L

  • 闭包相关的定律

    (L)=L=εε=εL+=LL=LLL=L++εL?=ε+L\begin{aligned} &(L^*)^*=L^*\\ &\varnothing ^*=\varepsilon\\ &\varepsilon ^*=\varepsilon\\ &L^+=LL^*=L^*L\\ &L^*=L^++\varepsilon\\ &L?=\varepsilon+L \end{aligned}


第五讲:正则文法与正则语言

一. 文法

  • 文法的定义 G=(V,T,S,P)G=(V,T,S,P)
    VV:变量的集合
    TT:终结符的集合
    SS:开始变量
    PP:产生式的集合

  • 示例:

    SaSbSεG=(V,T,S,P):V={S};T={a,b};P={SaSb,Sε}\begin{aligned} &S\rightarrow aSb\\ &S\rightarrow \varepsilon\\ &G=(V,T,S,P):V=\{S\};T=\{a,b\};P=\{S\rightarrow aSb,S\rightarrow \varepsilon\} \end{aligned}

  • 由变量和终结符构成的字符串称为句型

  • 由终结符构成的字符串称为句子

  • 推导和推导闭包

    • 推导:GG从变量AA推导出句子α\alpha,记为AαA\Rightarrow\alpha
    • 推导闭包:GG从变量AA推导出句子α\alpha,记为AαA\Rightarrow^*\alpha,但是不关心推导的具体过程

文法的语言为:L(G)={wSw,wT}L(G) = \{w| S\Rightarrow^* w , w\in T^*\}
如果两个文法对应的语言相同,那么认为两个文法等价。

二. 线性文法

  • 线性文法的定义:产生式右侧至多有一个变量
  • 右线性文法GG:所有产生式只有两类AxBA\rightarrow xBAxA\rightarrow x
  • 左线性文法GG:所有产生式只有两类ABxA\rightarrow BxAxA\rightarrow x
  • 右线性文法和左线性文法统称为正则文法
  • 线性文法的表达能力严格强于正则文法,但是弱于CFG

三. 正则文法和正则语言

  • 定理:正则文法产生的语言=正则语言
    • 对于正则文法,可以构造对应的NFA接受文法对应的语言
    • 将NFA转变为等价的右线性文法

四. 自动机的积

  • 定义:
    给定DFA

    A=(QA,Σ,δA,q0A.FA)  B=(QB,Σ,δB,q0B.FB)A=(Q_A,\Sigma,\delta_A,q_{0A}.F_A)\\ ~~B=(Q_B,\Sigma,\delta_B,q_{0B}.F_B)

​ 则称自动机M=(QA×QB,Σ,δ,(q0A,q0B),FA×FBM=(Q_A\times Q_B,\Sigma,\delta,(q_{0A},q_{0B}),F_A\times F_BAABB的积,或称MM为积自动机。
其中状态转移函数为δ((qA,qB),a)=(δA(qA,a),δB(qB,a))\delta((q_A,q_B),a) = (\delta_A(q_A,a), \delta_B (q_B,a))
​ 记为M=A×BM=A\times B

  • 积自动机接受的语言是前两DFA的

第六讲:正则语言的判定性质&DFA的优化

一. 基本问题

  • 判定算法(以DFA表示正则语言)

    • 从初态开始,输入字符串 w ,若可以到达某一终态,则该正则语言中接收 w,否则不接收 w
      • 算法复杂度:设输入字符串w 的长度 |w |=n,上述判定算法的复杂度为 O(n)O(n)
  • 判定算法(以NFA表示正则语言)

    • 可将其转化为等价的 DFA,然后执行上述过程;也可直接模拟处理字符串w的过程。
      • 判定算法的复杂度为O(ns2)O(ns^2), 其中n为w 的长度,s为NFA 的状态数目。对于目前可达的ε\varepsilon-闭包,接受输入后遍历可达的ε\varepsilon闭包,复杂度为O(n(s+δ))O(n(s+|\delta|)),在最坏情况下,可能达到上面的时间复杂度。
  • 判定算法(正则语言为空)

    • 给定一正则语言L(给定一个DFA、NFA、正则表示式),怎样判断L是否为空, L=L=\varnothing
    • 方法:去接受语言L的DFA M,判断M是否有从初态到终态的路径
    • 设有限自动机的状态数目为 n,上述判定算法的复杂度为O(n2)O(n^2)(自动机)/O(n)O(n)(正则表示式)。
  • 判定正则语言相等

    • 给出两个正则语言L1L_1L2L_2,判定L1=L2L_1=L_2
    • 算法思想:将两个正则语言转化为DFA,证明DFA是否等价
      • 适当重命名,使得两个DFA没有重名的状态
      • 将两个DFA相并,构造新的DFA M
      • 对M用运用填表算法,证明原两个初态是否不可区别
    • 算法复杂度:上述算法的复杂度上限为O(n4)O(n^4),适当设计填表算法的数据结构可以使得复杂度降为O(n2)O(n^2)
  • 给定正则语言,判断LL,判断LL是否无限
    • 取接受语言的DFA,判断初态和终态之间是否有环路

二. 泵引理

  • 泵引理(正则语言的必要条件)
    给出一无限正则语言LL,存在一正整数m。
    wL,wm,xyz,w=xyz\forall w\in L,|w|\ge m,\exists x\text{、}y\text{、}z,w=xyz,满足:
    xym|xy|\le my1|y|\ge 1
    有:wi=xyizL,i=0,1,2,w_i=xy^iz\in L,i=0,1,2,\cdots

三. 非正则语言的判定

Pumping引理可以表示为

mwxyzk(wLwmw=xyzyϵxym(k0xykzL))\exists m \forall w \exists x \exists y \exists z \forall k (w \in L \land |w| \geq m \rightarrow w = xyz \land y \neq \epsilon \land |xy| \leq m \land (k \geq 0 \rightarrow xy^k z \in L))

命题的否定形式为:

mwxyzk(wLwmw=xyzyϵxym(k0xykzL))\forall m \exists w \forall x \forall y \forall z \exists k (w \in L \land |w| \geq m \land w = xyz \land y \neq \epsilon \land |xy| \leq m \land (k \geq 0 \land xy^k z \notin L))

  • 泵引理的证明步骤

    1. 选任意的m
    2. 找到一个长度至少为m的串wLw\in L (存在)
    3. 选满足w=xyzyεxymw=xyz\wedge y \ne \varepsilon \wedge |xy|\le mx,y,zx,y,z (对于任意的一种划分)
    4. 找到一个k0k\ge 0,使xykzLxy^kz\notin L
  • Pumping引理不是正则语言的充分条件

  • 有限语言一定是正则语言,一定可以构造一个NFA来接受这个语言。

四. DFA的优化

  • 集合上的等价关系和集合的划分

    • R 是集合Q 上的一个等价关系,由 R 产生的所有等价类(或块)的集合构成 Q 的一个划分。
    • 等价类:对任何aQa\in Q, aa 所在的等价类用[a][a]表示,定义为[a]={xxRa}[a]=\{x|xRa\}
    • 每一元素都属于唯一的等价类,即满足
      1. 对任何的a,bQa,b\in Q,或者[a]=[b][a]=[b],或者[a][b]=[a]\cap[b]=\varnothing
      2. aQ[a]=Q\cup _{a\in Q}[a]=Q
  • DFA状态集合上的一个等价关系

    • DFA D=(Q,Σ,δ,q0,F)DFA~D=(Q,\Sigma,\delta,q_0,F),定义QQ上的二元关系RR
      对任何p,qQ   ,   pRq    if    wΣ  ,  δ(p,w)Fδ(q,w)Fp,q \in Q~~~,~~~pRq~~~~if~~~~w\in\Sigma^*~~,~~\delta^*(p,w)\in F\Leftrightarrow \delta^*(q,w)\in F
  • 状态集划分的算法-填表法

    • 填表算法:基于如下递归地标记可区别的状态偶对的过程。
      • 基础:若p为终态,q为非终态,则p和q标记是可区别的
      • 归纳:设p和q已标记为可区别的,若状态r和s通过输入符号a可分别转移到p和q,即δ(r,a)=p,δ(s,a)=q\delta(r,a)=p,\delta(s,a)=q,则r和s也标记为可区别的。
  • 最优的DFA(DFA优化的步骤)填表法得到的是最优的DFA

    1. 删除从初态不可到达的状态及与其相关的边, 设所得到的 DFAA=(Q,Σ,δ,q0,F)A=(Q,\Sigma,\delta,q_0,F)
    2. 使用填表算法找出所有等价的状态偶对;
    3. 根据 2 的结果计算当前状态集合的划分块,每一划分块中的状态相互之间等价,而不同划分块中的状态之间都是可区别的。包含状态 q 的划分块用 [q][q] 表示

第八讲:有限自动机的扩展&上下无关文法

有限自动机的拓展

Moore自动机和Mealy自动机都是确定性的,是DFA的拓展形式。

Moore自动机

Moore自动机是六元组:M=(Q,Σ,Λ,δ,G,q0)M = (Q, \Sigma,\Lambda, \delta,G, q_0)

  • Q是状态集合
  • Σ\Sigma是输入字母表
  • Λ\Lambda是输出字母表
  • δ:Q×ΣQ\delta: Q \times \Sigma \rightarrow Q是状态转移函数
  • G:QΛG: Q \rightarrow \Lambda是输出函数
  • q0Qq_0 \in Q是初始状态

非形式化的,Moore自动机就是在转移到新的状态后,会输出一个字符,并且输出仅依赖于状态。

Mealy自动机

Mealy自动机同时带有输出,但是输出由状态和输入字符同时决定,即在转移时输出。

形式化的,Mealy自动机为六元组A=(Q,Σ,Λ,δ,G,q0)A = (Q, \Sigma,\Lambda, \delta,G, q_0)

  • Q是状态集合
  • Σ\Sigma是输入字母表
  • Λ\Lambda是输出字母表
  • δ:Q×ΣQ\delta: Q \times \Sigma \rightarrow Q是状态转移函数
  • G:Q×ΣΛG: Q\times \Sigma \rightarrow \Lambda是输出函数
  • q0Qq_0 \in Q是初始状态

自动机的计算复杂性

  • DFA和输入串
    • 空间复杂性为O(1)O(1)
    • 时间复杂度为O(w)O(|w|)
  • NFA和输入串
    1. 非回溯法(Non-backtracking method):
      • 时间复杂度: O(Q2w)O(Q^2 \cdot w)
      • 空间复杂度: O(Q2)O(Q^2)
    2. 回溯法(Backtracking method):
    • 时间复杂度: O(Qw)O(Q \cdot w)
    • 空间复杂度: O(Qw)O(Q \cdot w)

CFG

CFG的推导与归约:

  • 归约是将产生式的右边替换为产生式的左边
  • 推导是将产生式的左边替换为产生式的右边

最左推导与最右推导:

  • 最左推导是从最左边的变量开始进行推导
  • 最右推导是从最右边的变量开始进行推导

语法分析树

注意在语法分析树的叶结点上可以是终结符也可以是变量,,将每个叶结点按照从左到右的次序连接起来得到一个(VT)(V\cup T)^*的字符串成为语法分析树的产物。

CFL

三. 文法二义性

  • 二义文法概念:CFG  G=(V,T,S,P)CFG~~G= (V,T, S, P) 称为二义的,如果对某个wTw ∈T^*,存在根结点都为开始符号SS 的两棵不同的分析树(等价的,也可以是两种最左或者最右推导), 其产物都是ww注意二义性仅是对于文法而言的

    CFG  GCFG~~G, 如果对每一wTw∈T^*,仅存在一棵这样的分析树,则G 为无二义的文法。

  • 定理:对CFG  G=(V,T,S,P)CFG~~G= (V,T, S, P)wTw ∈T^*ww 具有两棵不同的分析树,当且仅当存在两个不同的从开始从SSww的最左推导。

  • 文法二义性的的另一种定义:CFG  G=(V,T,S,P)CFG~~G= (V,T, S, P) 称为二义的,如果存在某个wTw∈T^*, 有两个不同的从开始符号SSww的最左推导。用途:方便证明文法的无二义性。

  • 二义性的判定:一个CFGCFG是否为二义的问题是不可判定的,即不存在解决该问题的算法。

注意:对于语言而言,语言是一组字符串的集合,是不存在二义性的。只是采用文法来描述这个语言的时候,某些文法会有二义性,有些则没有。

四. 二义性的消去方法

  • 没有通用方法消去文法的二义性。(多尝试!)

  • 如果上下文无关语言LL所有文法都是二义的,则称LL是固有二义的。(某些上下文无关语言只有二义文法)注意这里说的是语言是固有二义的

    例:L={anbncm}{anbmcm}L=\{a^nb^nc^m\}\cup\{a^nb^mc^m\}是固有二义的。

注意:二义CFG表示的语言不一定是固有二义语言

算符优先级法&左结合法&最近嵌套法
  • 算符优先级:将文法的产生式按优先级进行排序,产生式的优先级越高,越靠前。注意这里的靠前是在归约的意义下的,对于表达式的计算可以视为归约的过程

    例:EE+EEEaE\rightarrow E+E|E*E|a,其中*优先级高于++

  • 左结合法:将文法的产生式按结合性进行排序,结合性越强,越靠前。和优先级方法类似的,将同级运算规定从左到右优先级逐渐减小。

    例:EE+EEEaE\rightarrow E+E|E*E|a,其中*结合性强于++

  • 最近嵌套法:将文法的产生式按嵌套程度进行排序,嵌套程度越深,越靠前。考虑ififelseelse的匹配,在下面的例子中只有MM能直接产生匹配的ififelseelse

    例:EE+EEEaE\rightarrow E+E|E*E|a,其中*嵌套程度深于++

五. CFG的构造方法

  • 例1:构造上下文无关文法G,接受L:L={w=wRw{0,1}}L=\{w=w^R|w\in\{0,1\}^*\}
    S0S01S101εS\rightarrow 0S0|1S1|0|1|\varepsilon
  • 例2:构造上下文无关文法G,接受L:L={wwRw{0,1}}L=\{ww^R|w\in\{0,1\}^*\}
    S0S01S1εS\rightarrow 0S0|1S1|\varepsilon
  • 例3:构造上下文无关文法G,接受L:L={wwRw{0,1}}L=\{w\overline{w}^R|w\in\{0,1\}^*\}
    S0S10S1εS\rightarrow 0S1|0S1|\varepsilon

六. CFG的构造实例

  • 流程:分析L特征,构造CFG的G,再论证相互包含来证明等价
  • 例:构造0和1个数相等的语言

构造方法不仅有上面一种

  • S0B1Aε,B1S0BB,A0S1AAS \rightarrow 0B|1A|\varepsilon, B\rightarrow 1S|0BB, A\rightarrow 0S|1AA
  • SSS0S11S0εS\rightarrow SS|0S1|1S0|\varepsilon
    • 0和1个数相等的句子可拆分为若干个子区间,方法是是从开头向后依次统计0、1的个数,每当个数第一次相等区间断开一次。

例:构造满足0的数量是1的数量两倍的CFG
类似的,尝试构造:S0S0S1S0S1S0S1S0S0SεS\rightarrow0S0S1S|0S1S0S|1S0S0S|\varepsilon





第九讲:PDA

一. PDA的介绍

  • PDA是NFA外加上栈组成
  • 状态转移:q1(a,bc)q2q_1\rightarrow(a,b\rightarrow c)q_2(其中a为输入符号,b为栈弹出符号,c为栈压入符号)
  • 栈为空时不允许进行迁移,停机!此时向栈中输入ε\varepsilon也是不允许的
  • 分确定PDA:NPDA
  • 栈里面一个单元只能放入一个字符,一次只能弹出一个字符,可以一次压入多个字符

    NPDA允许再相同的输入和栈顶符号时有多个状态转移,也允许ε\varepsilon转移

二. PDA的定义

  • (终态型的)PDA为七元组:P=(Q,Σ,Γ,δ,q0,Z0,F)P=(Q,\Sigma,\Gamma,\delta,q_0,Z_0,F)
    有限状态集合、有限输入字母表、有限栈字符、转移函数、一个初始状态、一个栈初始符号、终态集合

  • 空栈型PDA为六元组:P=(Q,Σ,Γ,δ,q0,Z0)P=(Q,\Sigma,\Gamma,\delta,q_0,Z_0)

  • 约定:PDA即为NPDA,PDA即为终态型PDA

  • PDA接受串:所有字符都被输入完毕&最后落在PDA的一个终态(与栈内元素无关)

  • PDA拒接串:输入字符串不能读完or最后不能落在PDA的终态

  • 由于栈的特性,上述自动机在表达字符的个数、反转方面上有优势


    上述NPDA在构造时,使用这个结论

三. PDA的即时描述

  • 即时描述(ID)定义:PDA的即时描述是一个三元组(q,w,γ)(q,w,\gamma)(当前状态、剩余输入串、栈中当前符号串)
  • 传递\vdash:设PDA  P=(Q,Σ,Γ,δ,q0,Z0,F)PDA~~P=(Q,\Sigma,\Gamma,\delta,q_0,Z_0,F)
    P\vdash_P\vdash满足:
    (p,α)δ(q,a,X)(p,\alpha)\in \delta(q,a,X)
    (q,aw,Xβ)(p,w,αβ)(q,aw,X\beta)\vdash(p,w,\alpha\beta)
    ​ 其中:p,qQ,aΣ,wΣ,XΓ,αβΓp,q\in Q,a\in\Sigma,w\in \Sigma^*,X\in \Gamma,\alpha\beta\in\Gamma ^*
  • 注意在在上面的表示中,从左到右为栈顶到栈底
  • ID的传递闭包
    P\vdash_P^*\vdash^*定义为:
    基础:对于任意的ID II,都有III\vdash^* I
    归纳:如果IK,KJI\vdash K,K\vdash^*J,则有IJI\vdash^*J

  • 定理:设PDA  P=(Q,Σ,Γ,δ,q0,Z0,F)PDA~~P=(Q,\Sigma,\Gamma,\delta,q_0,Z_0,F),如果(q,x,α)(p,y,β)(q,x,\alpha)\vdash^*(p,y,\beta)那么对于任意的wΣ and γΓw\in \Sigma^*~and~\gamma\in\Gamma^*(q,xw,αγ)(p,yw,βγ)(q,xw,\alpha\gamma)\vdash^*(p,yw,\beta\gamma)

四. PDA的语言

  • 终态型PDA的语言
    NPDA M=(Q,Σ,Γ,δ,q0,Z0,F)NPDA~M=(Q,\Sigma,\Gamma,\delta,q_0,Z_0,F),则其语言L(M)L(M)定义为:
    L(M)={wwΣ,(q0,w,z0)M(qf,ε,u),uΓ}L(M)=\{w|w\in \Sigma^*,(q_0,w,z_0)\vdash^*_M(q_f,\varepsilon,u),u\in\Gamma^*\}
  • 空栈型PDA的语言
    PDA  P=(Q,Σ,Γ,δ,q0,Z0)PDA~~P=(Q,\Sigma,\Gamma,\delta,q_0,Z_0),其语言L(M)L(M)定义为:
    L(M)={w(q0,w,Z0)(q,ε,ε),qQ}L(M)=\{w|(q_0,w,Z_0)\vdash^*(q,\varepsilon,\varepsilon),q\in Q\}
  • 两种PDA语言的关系:可以互相设计使得满足需求语言

终态型 PDA → 空栈型 PDA 转换

  1. 增加新初始状态 qsq_s,压入 Z0,Z0Z_0,Z'_0。 添加新的栈底符号的意义是防止原PDA在某些非接受状态下被清空。
  2. 保留原机器所有转移。
  3. 从原终态 ε-跳到 qclearq_{\mathit{clear}}
  4. qclearq_{\mathit{clear}} 用 ε-迁移弹出所有符号。
  5. 无终态,靠“栈空”判定接受。

给定终态接受 PDA

M=(Q,Σ,Γ,δ,q0,Z0,F),M = (Q,\Sigma,\Gamma,\delta,q_0,Z_0,F),

等价地构造空栈接受 PDA

M=(Q,Σ,Γ,δ,qs,Z0,).M' = (Q',\Sigma,\Gamma',\delta',q_s,Z'_0,\varnothing).

1. 构造要素
  • 状态集

    Q=Q{qs,  qclear}.Q' = Q \cup \{\,q_s,\;q_{\mathit{clear}}\,\}.

    • qsq_s:新初始状态
    • qclearq_{\mathit{clear}}:清空栈状态
  • 栈符号集

    Γ=Γ{Z0},\Gamma' = \Gamma \cup \{Z'_0\},

    其中 Z0Z'_0 是新的栈底标记

  • 初始状态与初始栈符号

    • 初始状态:qsq_s
    • 初始栈符号:Z0Z'_0
  • 终态集

    F=F' = \varnothing

    (统一使用空栈接受,无终态)

2. 转移函数 δ\delta'
  1. 进入原机器

    (qs,  ε,  Z0)    (q0,  Z0Z0)(q_s,\;\varepsilon,\;Z'_0)\;\mapsto\;(q_0,\;Z_0\,Z'_0)

  2. 保留原机器的所有转移
    对每条

    (p,  a,  A)    {(p,  α)}(p,\;a,\;A)\;\mapsto\;\{(p',\;\alpha)\}

    δ\delta'中照搬。

  3. 终态到清空栈
    对每个 fFf\in F 和任意 XΓX\in\Gamma'

    (f,  ε,  X)    (qclear,  X)(f,\;\varepsilon,\;X)\;\mapsto\;(q_{\mathit{clear}},\;X)

  4. 清空栈状态循环弹出
    对任意 AΓA\in\Gamma'

    (qclear,  ε,  A)    (qclear,  ε)(q_{\mathit{clear}},\;\varepsilon,\;A)\;\mapsto\;(q_{\mathit{clear}},\;\varepsilon)

空栈型PDA转换为终态型PDA

设给定空栈接受的PDA为:

M=(Q,Σ,Γ,δ,q0,Z0)M = (Q, \Sigma, \Gamma, \delta, q_0, Z_0)

我们构造一个终态型PDA:M=(Q,Σ,Γ,δ,qs,Z0,F)M' = (Q', \Sigma, \Gamma', \delta', q_s, Z_0', F'),其中:

  • Q=Q{qs,qf}Q' = Q \cup \{q_s, q_f\},其中 qsq_s 是新初始状态,qfq_f 是新终态;
  • Γ=Γ{Z0}\Gamma' = \Gamma \cup \{Z_0'\}Z0Z_0' 是新的栈底符号;
  • 初始状态为 qsq_s,初始栈符号为 Z0Z_0'
  • F={qf}F' = \{q_f\}
  • 转移函数 δ\delta' 包括以下部分:
    1. 初始过渡:(qs,ε,Z0)(q0,Z0Z0)(q_s, \varepsilon, Z_0') \mapsto (q_0, Z_0Z_0'),进入原机器并压入原始栈底;
    2. 保留原 δ\delta 中所有转移;
    3. 添加空栈检测转移:对所有 qQq \in Q,添加

δ(q,ε,Z0)(qf,Z0) \delta'(q, \varepsilon, Z_0') \ni (q_f, Z_0')

表示当原机器栈清空至 Z0Z_0' 时跳转到终态 qfq_f

说明:
MM 接受某输入使得栈空,意味着 MM' 可以检测到栈回到 Z0Z_0' 并跳转到终态 qfq_f,从而完成终态接受。

五. PDA与CFG

  • 定理:上下文无关文法(CFG)语言=PDA接受的语言

空栈型PDA转换为CFG(上下文无关文法)

给定一个空栈接受的PDA
P=(Q,Σ,Γ,δ,q0,Z0)P = (Q, \Sigma, \Gamma, \delta, q_0, Z_0)
可转换为等价的CFG G=(V,Σ,R,S)G = (V, \Sigma, R, S),步骤如下:

1. 非终结符集合 V

构造形如 [pAq][p A q] 的非终结符,表示 PDA 从状态 pp 开始,以 AA 为栈顶符号,经过若干步骤清空 AA,最终到达状态 qq

2. 终结符集合

Σ\Sigma(与PDA输入字母表相同)

3. 开始符号 S

S=[q0Z0qf]S = [q_0 Z_0 q_f] 注意:上面的S产生式产生的应该是或!
其中 qfq_f 是某个能使栈清空的状态。

4. 产生式规则 R

δ(p,a,A)(r,B1B2Bk)\delta(p, a, A) \ni (r, B_1 B_2 \dots B_k),对所有状态序列 s1,,sks_1, \dots, s_k,加规则:

[pAsk]a[rB1s1][s1B2s2][sk1Bksk][p A s_k] \rightarrow a [r B_1 s_1] [s_1 B_2 s_2] \cdots [s_{k-1} B_k s_k]

如果 δ(p,a,A)(r,ε)\delta(p, a, A) \ni (r, \varepsilon),则加规则:注意添加的状态s1s_1\dots是任意状态,只要保证相等可以消去即可

[pAr]a[p A r] \rightarrow a

上面构造过程的最左推导就模拟了PDA的状态转移过程

示例语言

L={0n1nn0}L = \{0^n1^n \mid n \geq 0\} 的PDA转换后的文法片段:

S[qZ0q]S \rightarrow [q Z_0 q]

[qZ0q]0[qXq][qZ0q]1ε[q Z_0 q] \rightarrow 0 [q X q] [q Z_0 q] 1 \mid \varepsilon

[qXq]0[qXq]1ε[q X q] \rightarrow 0 [q X q] 1 \mid \varepsilon

注意:上面的S产生式产生的应该是或!

将上下文无关文法(CFG)转换为空栈型下推自动机(PDA)的方法

  1. 定义PDA状态

    • 初始状态 q0q_0
    • 主要处理状态 q1q_1
    • 接受条件:输入读完且栈为空(无需显式接受状态)
  2. 初始化栈

    • 添加转移:δ(q0,ϵ,ϵ)=(q1,S)\delta(q_0, \epsilon, \epsilon) = (q_1, S)
      (从 q0q_0 不读输入,栈顶为空时压入 SS 并进入 q1q_1
  3. 处理产生式规则

    • 对每条产生式 AαA \to \alpha,添加转移:
      δ(q1,ϵ,A)(q1,αR)\delta(q_1, \epsilon, A) \ni (q_1, \alpha^{\text{R}})
      (在 q1q_1 弹出 AA,将 α\alpha 的逆序压栈,不消耗输入)
  4. 处理终结符匹配

    • 对每个终结符 aa,添加转移:
      δ(q1,a,a)(q1,ϵ)\delta(q_1, a, a) \ni (q_1, \epsilon)
      (在 q1q_1 读入 aa 并弹出栈顶的 aa
  5. 示例:CFG SaSbϵS \to aSb \mid \epsilon 的转换

    • 初始化:δ(q0,ϵ,ϵ)=(q1,S)\delta(q_0, \epsilon, \epsilon) = (q_1, S)
    • 产生式规则:
      • SaSbS \to aSbδ(q1,ϵ,S)(q1,aSb)\delta(q_1, \epsilon, S) \ni (q_1, aSb)
        (压入顺序为 bSab \to S \to a,栈顶为 aa
      • SϵS \to \epsilonδ(q1,ϵ,S)(q1,ϵ)\delta(q_1, \epsilon, S) \ni (q_1, \epsilon)
    • 终结符匹配:
      • δ(q1,a,a)(q1,ϵ)\delta(q_1, a, a) \ni (q_1, \epsilon)
      • δ(q1,b,b)(q1,ϵ)\delta(q_1, b, b) \ni (q_1, \epsilon)

PDA接受条件:输入字符串完全读完后栈为空。


第十讲:DPDA、CNF(确定下推自动机、CFG化简与规范)

一. 确定下推自动机的概念

  • 定义:PDA P=(Q,Σ,Γ,δ,q0,z0,F)P=(Q,\Sigma,\Gamma,\delta,q_0,z_0,F)称为确定的下推自动机(DPDA),如果满足:

    • 对于aΣa\in\Sigma或者a=εa=\varepsilonXΓ{ε},δ(q,a,X)X\in\Gamma-\{\varepsilon\},\delta(q,a,X)最多包含一个元素。
      • 在任何一个状态qq,当你看到当前输入是aa(可以是空串 ε\varepsilon),而栈顶是XX的时候,你只能有一个可选的操作。并且弹出的栈顶符号不能为空。
      • 当输入字符和栈顶字符不能全是ε\varepsilon,即ε,εε\varepsilon, \varepsilon \rightarrow \varepsilon是不允许的
    • 对于aΣ,aεa\in\Sigma,a\neq \varepsilonδ(q,a,X)\delta(q,a,X)\ne \varnothing,则δ(q,ε,X)=\delta(q,\varepsilon,X)=\varnothing
      • 如果你在当前状态qq看到输入符号aa,而栈顶是XX时可以做某个操作,那就不允许你“什么都不看输入”(ε\varepsilon)也做栈顶是XX的操作
  • 状态不可以没有转移

    说明该定义亦称为终态型DPDA,类似也可以定义空栈型DPDA

  • 不容许迁移:
    δ(q1,a,b)\delta(q_1,a,b)δ(q1,ε,b)\delta(q_1,\varepsilon,b)不能同时出现。
    即可以存在单独的迁移δ(q1,a,b)\delta(q_1,a,b)δ(q1,ε,b)\delta(q_1,\varepsilon,b),但是它们相互排斥,不能同时存在

  • DPDA语言

    (终态型DPDA语言)
    如果语言L能够被一DPDA P=(Q,Σ,Γ,δ,q0,z0,F)P=(Q,\Sigma,\Gamma,\delta,q_0,z_0,F)​接收,则L称为确定性下推自动机的语言,或确定性上下文无关语言,或终态型DPDA语言。

    (空栈型DPDA语言)
    如果语言L能够被一空栈型DPDA P=(Q,Σ,Γ,δ,q0,z0)P=(Q,\Sigma,\Gamma,\delta,q_0,z_0)接收,则L称为空栈型DPDA的语言。

二. DPDA语言与其他语言的关系

  • {DPDA的语言}{CFL(NPDA)}\{DPDA\text{的语言}\}\subset\{CFL(NPDA)\}
  • 定理:若L是正则语言,则存在DPDA P,使得L(P)=L
  • DPDA的表达能力强于有限自动机
  • 但是对于语言:回文语言:L={wwRw{0,1}}L =\{ww^R|w\in\{0,1\}^*\},无法构造DPDA无法接受
  • DPDA的表达能力强于于有限自动机:即
    • LL是正则语言,那么存在DPDA PP,使得L(P)=LL(P)=L
    • 但是对于语言L={wcwRw{0,1}}L=\{wcw^R | w \in \{0,1\}^*\}不是正则语言但是下面的DPDA可以接受

三. 终态型DPDA与空栈型DPDA

  • 前缀性质:一个语言L具有前缀性质,当且仅当不存在x,yL,xyx,y\in L,x\ne y,且xxyy的前缀
  • 定理:语言L是空栈型DPDA P的语言,当且仅当
    • L具有前缀性质
    • L是终态型DPDA P’语言,即L=L(P’)

{空栈型DPDA的语言}{终态型DPDA的语言}(真包含)\{\text{空栈型}DPDA\text{的语言}\} \subset \{\text{终态型}DPDA\text{的语言}\} \quad (\text{真包含})

空栈型DPDA与正则语言没有关系。

四. DPDA与二义文法

  • 定理:若语言L是终态型DPDA P的语言,则存在无二义上下文无关文法G,使得L=L(G)L=L(G)。也就是说终态型/空栈型DPDA的语言是无固有二义的。

{DPDA语言}{CFG非固有二义语言}(真包含)\{DPDA\text{语言}\} \subset \{CFG\text{非固有二义}\text{语言}\} \text{(}\text{真包含}\text{)}

五. CFG化简与规范-消去无用符号

  • 相关定义

    • 有用符号:对于CFG G=(V,T,S,P)G=(V,T,S,P)。称符号XVTX\in V\cup T是有用的,当且仅当SαXβwS\Rightarrow^*\alpha X\beta\Rightarrow^* w,其中wT,α,β(VT)w\in T^*,\alpha,\beta\in(V\cup T)^*
    • 无用符号:非有用符号
    • 无用产生式:含有无用符号的产生式
    • 产生符号:X称为产生符,如果存在wTw\in T^*,满足XwX\Rightarrow^*w。终结符是产生符
    • 可达符号:X称为产生符,如果存在α,β(VT)\alpha,\beta\in (V\cup T)^*,满足SαXβS\Rightarrow^*\alpha X\beta。S是可达符
    • 有用符号一定是产生符号和可达符号,但是反之不一定成立
  • 产生符算法

    CFG  G=(V,T,S,P)CFG~~G=(V,T,S,P),产生符集合由以下步骤计算:
    基础:任何终结符 aTa\in T都是产生符
    归纳:若有产生式AαA\rightarrow \alpha,且α(VT)\alpha \in (V\cup T)^*中的每个符号都是产生符,则A也是产生符
    定理:此算法恰好求得GG中所有的产生符

  • 可达符算法

    CFG  G=(V,T,S,P)CFG~~G=(V,T,S,P),可达符集合由以下步骤计算:
    基础:SS是可达符
    归纳:若AA是可达符,且AαA\rightarrow \alphaα(VT)\alpha \in (V\cup T)^*,则α\alpha中的每个符号都是可达符
    定理:此算法恰好求得GG中所有的可达符

  • 消去无用符号

    设 CFG G=(V,T,S,P)L(G)G=(V,T,S,P)\text{,}L(G)\ne \varnothing

    • 消去非产生符号
      从G中删除所有非产生符以及所有包含这些符号的产生式,得到CFG G2=(V2,T2,S,P2)G_2=(V_2,T_2,S,P_2)
    • 消去不可达符号
      G2G_2中删除所有不可达符以及所有包含这些符号的产生式,得到 CFG G1=(V1,T1,S,P1)G_1=(V_1,T_1,S,P_1)
  • 定理:有上述算法得到的文法G1G_1不包含无用符号,且L(G1)=L(G)L(G_1)=L(G) 注意上面的两步消去是不可以交换顺序的

    • 定理说明:剩余符号都是有用符号;新的文法与原来的文法是等价的
    • 证明思路:一方面,G1G_1中不包含无用符号;另一方面,对任何wwSG1w   iffSGwS\Rightarrow^*_{G_1} w ~~~iff S \Rightarrow^*_G w

消去无用符号的步骤

  • 计算产生符号集合
  • 消去非产生符号
  • 计算可达符号集合
  • 消去不可达符号

六. 消去ε\varepsilon产生式

目的:方便文法的设计,利于文法规范化
消去ε\varepsilon产生式,除文法不能产生串ε\varepsilon外,不会影响到原文法相应的语言中其它字符串的产生。

  • 可空符号
    设 CFG G=(V,T,S,P)G=(V,T,S,P),称符号AVA\in V是可空的,如果AεA\Rightarrow^*\varepsilon
    ​ 消去 ε\varepsilon 产生式及其影响,需要计算可空符号的集合。

  • 可空符号集合计算步骤

    基础:对所有产生式AεA\rightarrow \varepsilonAA是一个可空符号
    归纳:如果有产生式BC1C2CkB\rightarrow C_1C_2\dots C_k,其中每一个CiVC_i\in V是可空符号,则BB也是可空符号

  • 消去ε\varepsilon产生式算法

    • 计算GG的可空符号集合
    • 对每一产生式 AA1A2AkA\rightarrow A_1A_2\dots A_k
    • G1G_1中不包含GG的所有ε\varepsilon产生式:AεA\rightarrow \varepsilon
$$ L(G_1) = L(G) - \{\varepsilon\} $$ 例子:

七. 消去单一产生式

  • 单一产生式:形如ABA\rightarrow B的产生式,其中ABA\text{、}B为非终结符

  • 消去目的:可减少文法的变量,简化文法推导,利于文法规范化

  • 单一偶对:设 CFG G=(V,T,S,P),A,BV,(A,B)G=(V,T,S,P),A,B\in V,(A,B)称为单一偶对,如果ABA\Rightarrow^* B且该推导过程仅使用单一产生式。

    消去单一产生式时,需要计算所有单一偶对的集合。

  • 消去单一产生式算法:

    • 计算 G 中的单一偶对集合
    • 对每个单一偶对(A,B),在G1G_1中加入产生式AαA\rightarrow \alpha,其中BαB\rightarrow \alpha为非单一产生式
    • G1G_1中包含GG的所有非单一产生式

八. CFG的化简和Chomsky范式

  • 简化步骤

    • 消去ε\varepsilon-产生式
    • 消去单一产生式
    • 消去无用产生式
      • 计算并消去非产生符
      • 计算并消去非可达符
  • Chomsky范式的条件

    • G中不含无用符号
    • 产生式P只有具有如下两种简单形式之一:ABCA\rightarrow BCAaA\rightarrow a
  • 步骤

    • 消去ε\varepsilon-产生式、消去单一产生式、消去无用产生式
    • a. 如果某一终结符a出现于某些右部长度大于1的产生式中,则引入一个新的非终止符如A,将a替换成A,并新增AaA\rightarrow a
    • b. 右部长度>2的产生式AB1B2BkA\rightarrow B_1B_2\dots B_k采用级联的方式转换,引入k-2个非终结符AB1C1A\rightarrow B_1C_1C1B2C2C_1\rightarrow B_2C_2

第十一讲:上下文无关语言的性质

一. CFL的必要条件

二.CFL的泵引理

  • 对任意的正整数
  • 寻找一个字符串的长度大于等于n
  • 对于任意的分割,存在一个k使得这个字符串不属于上面的语言

三.CFL的闭运算性质

  1. 并运算:如果LLMM都是CFL,则LML\cup M也是CFL
  2. +*+运算:如果LL是CFL,那么LL^*L+L^+也是CFL
  3. 连接运算:如果LLMM是CFL,那么LMLM也是CFL
  4. 反转运算:如果LL是CFL,那么LRL^R也是CFL

对于上面性质的证明可以构造对应的CFG来证明新的语言是CFL

注意上面介绍的同态和替换的定义并不相同,可以认为同态是替换的一种特例。注意同态是将字符映射到字符串,而替换是将字符替换为语言。

对于CFL的交运算,CFL的交、补和差运算得到的都不一定是CFL

但是,正则语言与CFL的交运算得到的一定是CFL,可以使用对应的PDA和DFA来证明。

四.CFL的判定问题

空语言问题

检测CFG的开始变量是否无用即可

无限语言问题

给定CFG GG,判定L(G)L(G)是否无限,可以使用以下方法:

  • 消去ε\varepsilon和单一产生式
  • 消去无用符号
  • 构造变量的依赖图
  • 若变量依赖图有环,则L(G)L(G)无限,否则有限。
语言元素问题-CYK算法
  1. 输入
    • 文法 GG(需为CNF形式,如 ABCA \to BCAaA \to a)。
    • 字符串 w=aababw = aabab,长度 n=5n = 5
  2. 初始化
    • 创建 n×nn \times n 表格,dp[i][j]dp[i][j] 表示子串 w[ii+j1]w[i \ldots i+j-1] 能推导出的非终结符集合。
  3. 填充长度为1的子串
    • 对每个 ii,若 w[i]=aw[i] = a,根据规则(如 AaA \to a)填入 dp[i][1]dp[i][1]
  4. 填充长度大于1的子串
    • 对于长度 j=2j = 2nn
      • 对每个起始位置 i=1i = 1nj+1n-j+1
        • 分割子串 w[ii+j1]w[i \ldots i+j-1]w[ik]w[i \ldots k]w[k+1i+j1]w[k+1 \ldots i+j-1]
        • 检查规则 XYZX \to YZ,若 Ydp[i][ki+1]Y \in dp[i][k-i+1]Zdp[k+1][i+j1k]Z \in dp[k+1][i+j-1-k],则 Xdp[i][j]X \in dp[i][j]
  5. 结果判断
    • Sdp[1][n]S \in dp[1][n],则 wL(G)w \in L(G).
不可判定问题

第十二讲:Turning机(图灵机)

一. 图灵机的介绍

  • 语言的层次:图灵机接受的语言>上下无关语言>正则语言
  • 基本图灵机:带(tape)、带头(tape head)、空白带符(blank)、单元格(cell)、带符(tape symbol);读-写器(读头)、控制单元、两端无限
  • 每一步,读头都需要完成如下动作:读一个符号;写一个符号;左移或右移
  • 不容许有ε\varepsilon转移
  • 没有可能的转移,停机!
  • 接受输入:当TM能够到达某终态(无论输入是否读完、是否停机)
  • 拒绝输入:若TM停在一非终态或者若TM进入一无限循环

二. 图灵机的定义

  • TM是七元组 M=(Q,Σ,Γ,δ,q0,B,F)M=(Q,\Sigma,\Gamma,\delta,q_0,B,F)
    有限状态集合;有限输入符号集;有限带符号集;转移函数;开始状态;空白符;终态集合
    例如:M=({q0,q1,q2,q3,q4,q5,q6},{0,1,2},{0,1,2,X,Y,Z,B},δ,q0,B,{q6})M=(\{q_0,q_1,q_2,q_3,q_4,q_5,q_6\},\{0,1,2\},\{0,1,2,X,Y,Z,B\},\delta,q_0,B,\{q_6\})转移函数会以图or表表示

三. 图灵机的即时描述

  • TM即时描述ID
    图灵机:M=(Q,Σ,Γ,δ,q0,B,F)M=(Q,\Sigma,\Gamma,\delta,q_0,B,F)
    当前格局:X1X2Xi1qXiXi+1XnX_1X_2\dots X_{i-1}qX_{i}X_{i+1}\dots X_n 称为即时描述,或ID
    其中:qQq\in Q为当前M的状态;当前读头正在扫描XiX_i
    对于两端无限长的B字符,在表示ID时不要写出。

  • TM推导关系\vdash

    图灵机:M=(Q,Σ,Γ,δ,q0,B,F)M=(Q,\Sigma,\Gamma,\delta,q_0,B,F)
    定义ID‘s之间的推到关系 M\vdash_M(或\vdash)如下:

    1. δ(q,Xi)=(p,Y,L)\delta(q,X_i)=(p,Y,L),则有:
      X1X2Xi1qXiXi+1Xn  M  X1X2Xi2pXi1YXnX_1X_2\dots X_{i-1}qX_iX_{i+1}\dots X_n ~~\vdash_M~~X_1X_2\dots X_{i-2}pX_{i-1}Y\dots X_n
      ​ 两个例外:
      ​ (1) i=1时, qX1X2XnMpBYX2XnqX_1X_2\dots X_{n}\vdash_{M} pBYX_2\dots X_n
      ​ (2) i=n且Y=B时,X1X2Xn1qXnMX1X2Xn2pXn1X_1X_2\dots X_{n-1}qX_n \vdash_M X_1X_2\dots X_{n-2}pX_{n-1}
  1. δ(q,Xi)=(p,Y,R)\delta(q,X_i)=(p,Y,R),则有:
    X1X2Xi1qXiXi+1Xn  M  X1X2Xi1YpXi+1XnX_1X_2\dots X_{i-1}qX_iX_{i+1}\dots X_n ~~\vdash_M~~X_1X_2\dots X_{i-1}YpX_{i+1}\dots X_n
    ​ 两个例外:
    ​ (1) i=n时, X1X2Xn1qXnMX1X2Xn1YpBX_1X_2\dots X_{n-1}qX_{n}\vdash_{M} X_1X_2\dots X_{n-1}YpB
    ​ (2) i=1且Y=B时,qX1X2XnMpX2Xn1XnqX_1X_2\dots X_n \vdash_M pX_2\dots X_{n-1}X_{n}

四. 图灵机的语言

  • 递归可枚举语言:图灵机接受的语言称为递归可枚举语言

    给定图灵机M=(Q,Σ,Γ,δ,q0,B,F)M=(Q,\Sigma,\Gamma,\delta,q_0,B,F)

    定义MM的语言:L(M)={wwΣ,q0wMαpβ,pF,αΓ,βΓ+}L(M)=\{w|w\in\Sigma^*,q_0w\vdash^*_M \alpha p\beta,p\in F,\alpha\in\Gamma^*,\beta \in \Gamma^+\}

  • 停机:若TM没有可能的后续转移,则停机

  • 定理:任给图灵机 MM,容易构造一个图灵机 MM' 使得 L(M)=L(M)L(M)=L(M') ,并满足:如果wL(M)w\in L(M)则对于 wwMM'接受ww 并一定停机。由此结论,如果没有特别指出,今后假定图灵机到达终态后一定停机。
    但是,若wL(M)w\notin L(M),则对于 wwMM 不一定能停机。

  • 递归语言:

    称语言LL是递归的,当且仅当存在图灵机MML=L(M)L=L(M),且满足:

    1. wL(M)w\in L(M),则对于wwMM接受ww,自然会停机
    2. wL(M)w\notin L(M),则对于wwMM最终也会停机

    递归语言对应的问题是可判定的。

五. 图灵机的计算

  • 函数 ff 是可计算的,如果存在图灵机MM,对任意的wDw\in D,满足:
    f:q0wqff(w)f: q_0w\vdash^* q_ff(w)
  • 选用单位制表示整数(即用1的个数来表示正整数)
可计算函数的例子
  • f(x,y)=x+yf(x,y)= x+y是可计算的
  • f(x)=2xf(x)=2x是可计算的
  • f(x,y)={1ifx>y0ifxyf(x,y)=\begin{cases} 1 &\text{if} \quad x>y \\ 0 &\text{if} \quad x\leq y\end{cases}
  • f(x)=x2f(x)=x^2是可以计算的
    考虑进行xx次加法即可

六. 图灵机的编程技巧

  • 带存储区的状态
    图灵机M=(Q,Σ,Γ,δ,q0,B,F)M=(Q,\Sigma,\Gamma,\delta,q_0,B,F)状态中可以包含一个具有有限个取值的存储单元,即状态集合为:
    Q=S×T={[q,a]qS,aT}Q=S\times T=\{[q,a]|q\in S,a\in T\}
    其中qSq\in S表示控制状态,aTa\in T表示数据元素

  • 多道图灵机
    此类图灵机 M=(Q,Σ,Γ,δ,q0,B,F)M=(Q,\Sigma,\Gamma,\delta,q_0,B,F)中,带符号是向量的形式。

  • 图灵机的子程序
  • 计算乘法的图灵机

七. 图灵理论

  • Turing观点:能机械计算的一定能用图灵机实现
  • 计算机科学理论:至今为止没有比图灵机更强的计算模型
  • 算法的定义:函数f(w)f(w)的算法,定义为计算f(w)f(w)的图灵机。【算法就是图灵机】
  • Computer Sience Law:一个计算是可被机器完成的,当且仅当它可以被一个图灵机完成。
  • 没有任何已知的计算模型,其计算能力比图灵机强
  • 图灵机等价:图灵机M1M_1与图灵机M2M_2称为等价,如果L(M1)=L(M2)L(M_1)=L(M_2)

八. 图灵机的拓展

  • 多通道图灵机
    多通道图灵机是一个读写头读写一个向量
  • 多带图灵机
    • 可以用多带图灵机来模拟多通道图灵机,也可以用多通道图灵机来模拟多带图灵机
    • 用多通道TM来模拟多带TM的方法为,对于每一个通道,使用两条带来模拟,其中一条保存当前读头的位置,另一个保存当前通道的内容
      • 将多带TM的每一个状态转移拆分为多带TM中的多个状态转移,分为先发现哪个通道的读头位置进行讨论
    • 多带图灵机与标准TM功能相同,但是二者速度会有差异
  • 多维图灵机

对于图灵机移动的拓展有:

  • 增加具有停止功能的图灵机:
    • 停止功能的TM与标准TM的功能相同
  • 状态转移的拓展:非确定TM
    • 非确定TM与标准TM功能相同,对于确定TM保存所有可能的计算路径并保存在二维带中。确定TM模拟非确定TM,复杂度在指数级
    • 使用的是广度优先搜索(BFS)
  • 半无限带自动机
    • 两通道半无限带自动机来模拟标准自动机,在状态中添加左状态和右状态
    • 半无限带自动机和标准TM功能相同
    • 对于原TM的任意状态添加左右情况下的转移,在跨越边界时,将左状态和右状态进行切换

九. 图灵机与其他自动机

  • 多栈机
    • 多栈机和DPDA的区别在于使用多个堆栈,状态转移函数为
      δ(q,a,X1Xk)=(p,Y1Yk)\delta(q,a,X_1\dots X_k)=(p,Y_1\dots Y_k)
    • 可以使用多栈机来模拟标准TM,一个双栈的PDA可以模拟标准TM
    • 多栈自动机可以使用多带图灵机来模拟,其中使用一个栈来模拟带,对应带来模拟对应栈
    • 例:设计一个双栈PDA接受的语言L={0n1n2nn1}L=\{0^n1^n2^n | n\ge 1\},模拟图灵机运行即可
  • 计数器机
    • 可以证明:
      • 具有一个计数器的计数器机的语言接受能力相当于DPDA
      • 有两个或以上计数器的计数器机语言接受能力相当于图灵机
        • 任何递归可枚举语言可以被具有三个计数器的计数器机接受
        • 其中X0X_0为栈顶
        • 有三个计数器的计数器机可以用具有两个计数器的计数器机来模拟
        • 将三个计数器上的数表示在一个计数器中,表示方法用三个质数的乘方
  • 现代计算机
    • 现代计算机能模拟图灵机
    • 图灵机能模拟现代计算机

第十三讲:不可判定问题

一、图灵机的编码

对于一个图灵机可以使用多种方式进行编码。编码对应的二进制串采用1w1w编码,即在输入字符串前面加上一个11,用编码的字符串1w1w来计算是第几个字符串。

二、对角线语言与通用语言

  • 不是每一个正整数jj都能对应一个图灵机,如果整数jj没有对应的图灵机,那么认为第jj个图灵机不接受任何字符串。

  • 对角线语言:设MiM_i为第ii个图灵机
    Ld={wiMi不接受wi}L_d=\{w_i|M_i\text{不接受} w_i\}

  • 对角线语言不是递归可枚举语言,可以用反证法证明上面语言不会被任何一个图灵机接受,类似于理发师悖论

    • 如果有图灵机MM能接受这个语言,那么将这个图灵机的编码ww进行输入,如果MM接受,那么ww就不在LdL_d中;如果MM不接受,那么ww就在LdL_d中。
    • 但是上面的语言是客观存在的
  • 通用语言Lu={(M,w)M接受w}L_u=\{(M,w)|M\text{接受} w\}

    • MM的二进制编码为CCww(0+1)(0+1)^*中的串CC'(M,w)(M,w)的二进制编码为C111CC111C'
    • 上面描述的是哪些图灵机和被接受的输入串的组合构成的语言
    • 通用语言是递归可枚举语言

三、递归语言的性质

  • 递归可枚举语言:存在一个接受语言的图灵机

    • 在该语言中的串,一定能让图灵机停机并接受
    • 不在该语言中的串,可能让图灵机停机并拒绝,也有可能让图灵机无法停机
  • 递归语言:存在一个接受语言的图灵机

    • 在该语言中的串,一定能让图灵机停机并接受
    • 不在该语言中的串,一定让图灵机停机并拒绝
  • {递归语言递归可枚举语言}\{\text{递归语言} \subset \text{递归可枚举语言}\}

  • LL是递归语言,则L\overline{L}也是递归语言

    • 通用语言LuL_u递归可枚举语言,但不是递归语言Lu\overline{L_u}不是递归可枚举语言
      否则可以将对角线语言对应的问题归约到Lu\overline{L_u}对应的问题,即LdL_d是递归可枚举语言
  • 若语言LLL\overline{L}都是递归可枚举语言,那么LLL\overline{L}都是递归语言

四、判定问题与语言

  • 判定问题:给定一个语言LL,对于任意给定的字符串ww,判定wLw\in L是否成立
  • 性质:任意输入到truetruefalsefalse的映射
  • 问题对应的语言:Lp={xP(x)==true}L_p= \{x | P(x) ==true\}
  • 问题的判定
    • 若一个问题对应的语言是递归语言,则称该问题是可判定的,否则是不可判定的
    • 若一个问题对应的语言是递归可枚举语言,则称该问题是部分可判定的
  • 问题的归约
    • P1P_1P2P_2是两个问题,P1P_1归约到P2P_2,如果存在一个多项式时间的算法将P1P_1的实例转化为P2P_2的实例
    • 如果问题P2P_2是可判定的,那么问题P1P_1也是可判定的
    • 如果问题P2P_2是部分可判定的,那么问题P1P_1也是部分可判定的
    • 如果问题P1P_1是不可判定的,那么P2P_2也是不可判定的
    • 如果问题P1P_1不是部分可判定的,那么P2P_2也是非部分可判定的
  • 图灵机语言非空问题:
    • 对应语言Lne={ML(M)}L_{ne}=\{M|L(M)\ne \varnothing\}
    • LneL_{ne}递归可枚举语言,但不是递归语言
      • 可以借助LuL_u对应的图灵机MM'构造,将图灵机编码MM输入,并且枚举所有的字符串ww,如果MM'接受,则说明L(M)L(M)非空,这时候接受并停机。否则上述图灵机不可能停机,于是拒绝。
      • 这样可以证明LneL_{ne}是递归可枚举语言
      • 设计一个转换算法ff,将任何(M,w)LuMLne(M,w)\in L_u \Leftrightarrow M' \in L_{ne}
        • 忽略输入xx,只将它当作启动信号
        • 内部模拟原图灵机MM在输入ww上的运行。
        • 如果MM接受ww,那么MM'接受xx
        • 否则,MM'拒绝或不停止。
    • Le=LneL_e = \overline{L_{ne}}不是递归可枚举语言,否则LneL_{ne}是递归语言
  • 图灵停机问题是不可判定的
  • 平凡性质与非平凡性质:
    • XX上的性质PP,如果性质对应的集合是空集或全集,那么称之为平凡性质
  • Rice定理:递归可枚举语言的每一个非平凡性质都是不可判定的 ^52defa
    • 指的是满足性质P的所有语言构成的集合不可判定,或其对应的问题:任给一个语言、它满足性质P吗?的问题不可判定。
    • 归约的过程为,将LuL_u的实例归约到图灵机接受的语言是否满足性质PP'。只需要从输入(M,w)(M,w)构造MM'即可
  • Post对应问题:
    • 从两个长度相同的列表中选择相同顺序的项,拼接后是否能得到两个完全相同的字符串?
    • Post对应问题是不可判定的

形式语言与自动机
https://yima-gu.github.io/2025/06/15/Formal_Language&Automata/形式语言与自动机/
作者
Yima Gu
发布于
2025年6月15日
许可协议