形式语言与自动机考试例题整理(考试向)

本文最后更新于:2024年6月18日 晚上

形式语言与自动机考试题型整理

练习试卷可参考哈工大

1.构造DFA/NFA

L={xx{0,1}+x满足...}L=\{x|x\in\{0,1\}^{+}且x满足...\}

  • 以01、101、1101开头

    DFA:要注意qdieq_{die}状态的设计。以101为例,DFA如下:

    image-20240615124508547
  • 包含01、101、1101

    DFA:先把包含该串的状态画出来,再考虑其他转移状态的设计

    NFA:从每个字母开始猜测

    以1101为例,DFA和NFA如下:

    image-20240615130458972
  • 以01、101、1101结尾

    DFA:先把该串状态画出来,再考虑其他转移状态的设计

    NFA:从每个字母都开始猜测

    以1101为例,DFA和NFA如下:

    image-20240615131923604
  • 不包含00、11、1010

    DFA:直接将包含00、11、1010情况中DFA的非接受状态和接受状态互换即可

  • 同时含有01和10

    1. DFA:考虑将首字母分为0/1分别讨论
    2. NFA:在每个字母的位置分0和1进行猜测即可

    image-20240615165543696

  • 同时含有00和11

  • xx看做二进制时,xx模5余3

    先看一道书上的例题,P36 2.2.6(a):

    x以1开头,解释为二进制整数时是5的倍数,如101、1010、1111

    1. 先不看以1开头,由于任何整数模5,其余数都在0到4之间。我们考虑只针对余数设计状态间转移,即q0/q1/q10/q11/q100q_{0}/q_{1}/q_{10}/q_{11}/q_{100}四个状态,q0q_0为接受状态。转移规则如下:假设我们当前读到的01串是(y)2=(5a+b)10,0b4(y)_2=(5a+b)_{10},0\le b\le 4,那么(y1)2=(10a+2b+1)10,(y0)2=(10a+2b)10(y1)_2=(10a+2b+1)_{10},(y0)_2=(10a+2b)_{10},其中y1y1需要判断2b+12b+1是否5\le 5,即识别到1余数×2+1\times2+1,识别到0余数×2\times 2

      image-20240615143037779
    2. 加入以1开头,即进入该转移的初始状态为q1q_1,我们可以增加一个初始状态qsq_s,接收0则进入状态qdieq_{die},接收1则进入q1q_1

    回到此题,显然以q11q_{11}作为接受状态即可。

    如果此题说x是5的倍数的二进制表示,需要考虑判断是否有前缀0,如0000101,不被接受

  • xx以1结尾,长度为偶数;以0结尾,长度为奇数

    1. DFA:可以考虑四个状态,1结尾长度为奇数、1结尾长度为偶数、0结尾长度为奇数、0结尾长度为偶数,可添加一个初始状态,然后在四个状态间进行转移即可
    2. NFA:先考虑设计奇数、偶数两个状态,奇数状态尝试再识别1达到接受状态,偶数状态尝试再识别0达到接受状态
    image-20240615154053261
  • xx的首字符和尾字符相等

    分01讨论即可

    image-20240615160657873
  • xx是十进制非负数

    不接受有前缀0的即可(单个0除外)

  • xx中0和1个数相等且交替出现

    分第一个元素为0/1讨论即可,DFA如下:

    image-20240615161958544
  • xx中0的个数被2整除,1的个数被3整除

    不在考试范围内,可考虑对0构造状态q00,q01q_{00},q_{01},对1构造状态q10,q11,q12q_{10},q_{11},q_{12},从而构造出2×3=62\times3=6个状态,接受状态为q00q10q_{00}q_{10}

  • xx以01开头或以01结尾(含同时)

    DFA:

    image-20240615172647132

​ NFA:

  • xx倒数3个字符至少有一个是1

NFA:三种方式均可,第二个NFA可以认为是在x倒数第3个字符是1的基础上得到

image-20240615175905491

2.DFA算法

2.1 ϵ\epsilon-NFA2NFA

2.2 NFA2DFA

采用子集构造法

image-20240615185509167

2.2 等价性Equivalence

考的概率比较小,用于判断两个DFA是否定义了相同的语言。方法:构造乘积自动机(product DFA)、填表法

  • 乘积自动机

    状态集分别为Q,RQ,R,乘积DFADFA状态集为Q×R,[q,r]Q\times R,[q,r],其中qQ,rRq\in Q,r\in R

    注意:

    • 当且仅当自动机LLRR中只有一个接受ww时,标记为接受状态

    • 当该自动机的语言为空时,两个自动机等价

  • 填表法

    注意:当初始状态等价时,自动机等价

2.3 最小化Minimally

用于找出最少状态的DFA或最短长度的RE,方法:消除不可达状态,合并不可区分状态

  • 采用填表法,合并不可区分状态

填表法步骤示例:

image-20240616163920639

  1. 直接标记终态和非终态之间的状态对:{C}\{C\}×\times{A,B,D,E,F,G,H}\{A,B,D,E,F,G,H\}
  2. 标记所有经过字符 0 到达终态和非终态的状态对:{D,F}\{D,F\}×\times{A,B,C,E,G,H}\{A,B,C,E,G,H\}
  3. 标记所有经过字符 1 到达终态和非终态的状态对:{B,C,H}\{B,C,H\}×\times{A,C,D,E,F,G}\{A,C,D,E,F,G\}
  4. 检查剩下状态对:[A,G],[E,G][A,G],[E,G]可区分

image-20240616164831817

3.正则表达式

3.1 语言写正则表达式

分治法、递归、串接等方法设计正则表达式

L={ww{a,b,c},且w至少包含一个a和一个b}L=\{w|w\in \{a,b,c\}^{*},且w至少包含一个a和一个b\}

aabb的先后顺序即可

ca(a+c)b(a+b+c)+cb(b+c)a(a+b+c)c^*a(a+c)^*b(a+b+c)^* + c^*b(b+c)^*a(a+b+c)^*

L={ww{0,1},且倒数第三个符号是1}L=\{w|w\in\{0,1\}^{*},且倒数第三个符号是1\}

(0+1)1(0+1)(0+1)(0+1)^{*}1(0+1)(0+1)

L={ww{0,1},w没有两个连续的0}L=\{w|w\in \{0,1\}^{*},w没有两个连续的0\}

对于此类问题,有两种方法:

  1. 利用式子=(0+1)\sum^*=(0+1)^*,该式认为00101=((0)(0)(1)(0)(1))00101=((0)(0)(1)(0)(1))。我们只要让0产生的时候跟一个1即可,同时需要注意末尾和开头的0/1、以及满足空串的要求

    (1+01)(0+ϵ)(0+ϵ)(1+10)(1+01)^{*}(0+\epsilon)或(0+\epsilon)(1+10)^*

  2. 利用式子=(01)\sum^*=(0^*1^*)^*,该式子认为0011011=((00)(11))((0)(11))0011011=((00)(11))((0)(11))。同理我们产生0时加上1即可,同时需要注意空串和前后0/1的要求

    1(011)(0+ϵ)1^*(011^*)^*(0+\epsilon)

L={ww{0,1},w没有两个连续的1}L=\{w|w\in \{0,1\}^{*},w没有两个连续的1\}

参考上一问:

(0+10)(1+ϵ)(1+ϵ)(001)0(0+10)^*(1+\epsilon)或(1+\epsilon)(0^*01)^*0^*

L={ww{0,1},且w至多只有一对连续的1}L=\{w|w\in\{0,1\}^{*},且w至多只有一对连续的1\}

没有连续的1或者有一对连续的1

错误示范:

(0+10)(1+ϵ)+(10+ϵ)11(01+ϵ)(0+10)^*(1+\epsilon)+(1^*0+\epsilon)11(01^*+\epsilon)

正确示范:

(0+10)(1+ϵ)+(0+10)11(0+01)(0+10)^*(1+\epsilon)+(0+10)^*11(0+01)^*

L={ww{0,1},且w有两对连续的1}L=\{w|w\in\{0,1\}^{*},且w有两对连续的1\}

case 1: 111的形式

(0+10)111(0+01)(0+10)^*111(0+01)^*

case 2:11…11的形式

(0+10)11(0+0(1+ϵ)(0+01)0)11(0+01)(0+10)^*11(0+0(1+\epsilon)(0+01)^*0)11(0+01)^*

L={ww{0,1}w中每对相邻的0都在任何一对相邻的1前面}L=\{w|w\in\{0,1\}^*,w中每对相邻的0都在任何一对相邻的1前面\}

问题等价为没有连续的1串接上没有连续的0

(0+10)(ϵ+1)(1+01)(0+ϵ)(0+10)^*(\epsilon +1)(1+01)^*(0+\epsilon)

L={ww{0,1}w中不包含子串01}L=\{w|w\in\{0,1\}^*,w中不包含子串01\}

101^*0^*

L={ww{0,1}w中不包含子串10}L=\{w|w\in\{0,1\}^*,w中不包含子串10\}

010^*1^*

3.2正则表达式写语言

较简单,无例题

3.3(非考试)正则表达式转NFA

  • 对于r+sr+s

    image-20240615193234172
  • 对于rsrs,有

    image-20240615193251325

  • 对于rr^{*},有

    image-20240615193307299

4.上下文无关文法CFG

4.1 构造CFG

给出L={0n1nn0}L=\{0^n1^n|n\ge 0\}的文法

S0S1ϵS\rightarrow 0S1|\epsilon

给出L={0n1nn1}L=\{0^n1^n|n\ge 1\}的文法

S0A1A0A1ϵS\rightarrow 0A1\\ A\rightarrow 0A1|\epsilon

给出L={0n1n0m1mn0,m0}L=\{0^n1^n0^m1^m|n\ge 0,m\ge 0\}的文法

SAAA0A1ϵS\rightarrow AA\\ A\rightarrow 0A1|\epsilon

给出L={0和自然数(不能以0开头)}L=\{0和自然数(不能以0开头)\}

S0ABA123456789BCBϵC0AS\rightarrow 0|AB\\ A\rightarrow 1|2|3|4|5|6|7|8|9\\ B\rightarrow CB|\epsilon\\ C\rightarrow 0|A

给出L={0n1m0m1nn0,m0}L=\{0^n1^m0^m1^n|n\ge 0,m\ge 0\}的文法

S0S1ϵAA1A0ϵS\rightarrow 0S1|\epsilon|A\\ A\rightarrow 1A0|\epsilon

为语言L={0n1mnm}L=\{0^n1^m|n\not = m\}设计文法

分为n>mn>mn<mn<m两种情况

00 000 11100\ 000\ 111000 111 11000\ 111\ 11

SACCBAA00C0C1ϵB1B1S\rightarrow AC|CB\\ A\rightarrow A0|0\\ C\rightarrow 0C1|\epsilon\\ B\rightarrow 1B|1

给出L={xx包含两个相同的全0子串}L=\{x|x包含两个相同的全0子串\}的文法

考虑分为三部分,Eg. (1001)(00110100)(10110)

SABCAϵU1U0U1UϵC1UϵB0B00D0D1U11S\rightarrow ABC\\ A\rightarrow \epsilon|U1\\ U\rightarrow 0U|1U|\epsilon\\ C\rightarrow 1U|\epsilon\\ B\rightarrow 0B0|0D0\\ D\rightarrow 1U1|1

给出L={w{0,1}w包含至少31}L=\{w\in\{0,1\}^{*}|w包含至少3个1\}的文法

SA1A1A1AA0A1AϵS\rightarrow A1A1A1A\\ A\rightarrow 0A|1A|\epsilon

给出Leq={w{0,1}w01个数相等}L_{eq}=\{w\in \{0,1\}^*|w中0和1个数相等\}的文法

S0S11S0ϵSSS\rightarrow 0S1|1S0|\epsilon|SS,寻找递归结构,用变量构造

SS0S1SS1S0SϵS\rightarrow S0S1S|S1S0S|\epsilon,目标串这样构成,由变量定义变量

S0B1AA00S1AAB11S0BBS \rightarrow 0B | 1A\\ A \rightarrow 0 | 0S | 1AA\\ B \rightarrow 1 | 1S | 0BB

给出L1={wwRw{0,1}}L_1=\{ww^R|w\in\{0,1\}^{*}\}的文法

S0S01S1ϵS\rightarrow 0S0|1S1|\epsilon

给出L={ww=wR,w{0,1}}L=\{w|w=w^R,w\in\{0,1\}^*\}的文法

S0S01S101ϵS\rightarrow 0S0|1S1|0|1|\epsilon\\

给出L={aibjckijjk}L=\{a^ib^jc^k|i\not =j或j\not =k\}的文法

A/DA/D产生0个及以上的a/ca/cEE产生1个及以上的b

BB先产生相同数量的b,cb,c,然后要么产生1\ge1的b,要么产生1\ge 1的c;C同理

因此ABAB代表jkj\not =kCDCD代表iji\not =j

SABCDAaAεBbBcEcDCaCbEaADcDεEbEb S \rightarrow AB | CD\\ A \rightarrow aA | ε\\ B \rightarrow bBc | E | cD\\ C \rightarrow aCb | E | aA\\ D \rightarrow cD | ε\\ E \rightarrow bE | b\\

给出L={w{0,1}w不是ww形式}L=\{w\in\{0,1\}^*|w不是ww形式\}的文法

O生成奇数长度的串(一定不是ww形式),EE生成偶数长度的串

EE分为左右长度相等的串wlwlwrwr,最坏情况下只存在一个位置有wl[i]wr[i]wl[i]\not =wr[i]

我们以这个位置为中心,进行左右推导,即使左右推导的结果相等,最终的串也不相等

SEOO01COCEABBAACAC0BCBC1C01S \rightarrow E|O\\ O \rightarrow 0 | 1 | COC\\ E \rightarrow AB | BA\\ A \rightarrow CAC | 0\\ B \rightarrow CBC | 1\\ C \rightarrow 0 | 1\\

给出L={w{0,1}0的个数是1的个数的两倍}L=\{w\in\{0,1\}^*|0的个数是1的个数的两倍\}的文法

SS1S0S0SS0S1S0SS0S0S1SϵS\rightarrow S1S0S0S|S0S1S0S|S0S0S1S|\epsilon

4.2 推导CFG

给定字符串,写出其最左、最右或最短的推导

给定文法

SA1BA0AϵB0B1BϵS\rightarrow A1B\\ A\rightarrow 0A|\epsilon\\ B\rightarrow 0B|1B|\epsilon

给出串00101的最左/右推导

最左:SA1B0A1B00A1B001B0010B00101B00101S\rightarrow A1B\rightarrow 0A1B\rightarrow 00A1B\rightarrow 001B\rightarrow 0010B\rightarrow00101B\rightarrow 00101

最右:SA1BA10BA101BA1010A10100A10100101S\rightarrow A1B\rightarrow A10B\rightarrow A101B\rightarrow A101\rightarrow 0A101\rightarrow 00A101\rightarrow 00101

4.3 画语法树

给定字符串及文法规则,画出语法树。和4.1最左/右推导一致,不再给出例题

4.4 二义性

如果CFG能为某个句子生成多颗语法解析树,则称CFG是二义的( ambiguous

如果题目要求证明文法具有二义性:给出两颗不同的语法解析树即可

5.下推自动机PDA

5.1 设计PDA

接受可以写成空栈方式ϵ,Z0/ϵ\epsilon ,Z_0/\epsilon或终结状态方式ϵ,Z0/Z0\epsilon ,Z_0/Z_0

设计识别L01={0n1nn1}L_{01}=\{0^n1^n|n\ge1\}的PDA

image-20240527145557041

L01L_{01}识别符号串0011的动作序列?

(q0,0011,Z0)(q0,011,0Z0)(q0,11,00Z0)(q1,1,0Z0)(q1,ϵ,Z0)(q2,ϵ,Z0)(q_0,0011,Z_0)\vdash(q_0,011,0Z_0)\vdash(q_0,11,00Z_0)\\ \vdash(q_1,1,0Z_0)\vdash(q_1,\epsilon,Z_0)\\ \vdash(q_2,\epsilon,Z_0)

设计识别Lwwr={wwRw(0+1)}L_{wwr}=\{ww^{R}|w\in (0+1)^*\}的PDA

image-20240527153238973

设计识别Lw#wr={w#wRw(0+1)}L_{w\#wr}=\{w\#w^{R}|w\in (0+1)^*\}的PDA

image-20240617144436570

接受L={w:w=wRw(0+1)}L=\{w:w=w^R|w\in (0+1)^*\}的PDA

对于奇数长度的串,选择跳过中间的0或1;对于偶数,不跳过(采用空转移实现)

image-20240617152840264

接受L={w{0,1}w01的数量相同}L=\{w\in \{0,1\}^*|w中0和1的数量相同\}的PDA

对于01数量均为n的串,一定存在n个不相交的01匹配,因此可以用不确定的PDA实现

最后的ϵ,Z0/ϵ\epsilon,Z_0/\epsilon是将栈底符号弹出,实现以空栈状态接受ww

image-20240527161406581

接受L={0n1m0nm2n}L=\{0^n1^m|0\le n\le m\le 2n\}的PDA

由于每个0都对应1个1或者2个1,可以考虑将所有的0压栈,可以识别2个1再弹出0也可以识别出1个1再弹出0。对于识别2个1弹出0,我们增加一个状态,第一个1不弹0,第二个1弹出0

image-20240527163614310

设计语言L={0n1m1mn}L=\{0^n1^m|1\le m\le n\}的PDA

不出现1,Z01,Z_0即可

image-20240527171045797

接受L={0n1m0m1nn0,m0}L=\{0^n1^m0^m1^n|n\ge 0,m\ge 0\}的PDA

0压栈,1压栈,0弹出,1弹出,设计四个状态即可

接受L={ww包含两个相同的全0子串}L=\{w|w包含两个相同的全0子串\}的PDA

参考上文的CFG,(…1)(0…0)(1…1)(0…0)(1…)

image-20240617160710348

5.2 根据CFG构造PDA

PDAPDA比较难写出来时,采用CFGCFGPDAPDA的方法

如果CFG G=(V,T,P,S)CFG\ G=(V,T,P',S),构造PDAPDA

P=({q},T,VT,δ,q,S,ϕ)P=(\{q\},T,V\cup T,\delta,q,S,\phi)

其中δ\delta为:

  1. AV\forall A\in Vδ(q,ϵ,A)={(q,β)AβP}\delta(q,\epsilon,A)=\{(q,\beta)|A\rightarrow\beta\in P'\}
  2. aT\forall a\in Tδ(q,a,a)={(q,ϵ)}\delta(q,a,a)=\{(q,\epsilon)\}

image-20240617162814427

image-20240617162619047

6.泵引理(RL/CFL)

6.1 RL的泵引理

用于证明一个语言不是正则语言,泵引理如下:

如果语言 L 是正则的*,* 那么存在正整数 NN,对wL\forall w\in L

只要wN|w|≥N, 就可以将 ww 分为三部分 w=xyzw=xyz 满足:

  • y>0|y|>0

  • xyN|xy|≤N

  • k0,xykzL\forall k\ge 0,xy^kz\in L

  • 采用”对抗赛“的方式证明,方便书写
    下表中用len(w)len(w)表示w|w|,因为markdown表格会识别’|'符号…

证明L01={0n1nn0}L_{01}=\{0^n1^n|n\ge 0\}不是正则语言

证明Leq={ww由数量相等的01构成}不是正则的L_{eq}=\{w|w由数量相等的0和1构成\}不是正则的

BOSS Me
选取NZ+N\in Z^+ 选取w=0N1Nw=0^N1^N,显然wL,len(w)=2N>Nw\in L,len(w)=2N>N
选取len(xy)Nlen(xy)\le N,则y=0my=0^mm1m\ge 1 选取i=2i=2,则xy2z=0N+m1N∉L01(Leq)xy^2z=0^{N+m}1^N\not \in L_{01}(L_{eq})
不满足泵引理,因此不是正则语言

证明L={0i1ji>j}L=\{0^i1^j|i>j\}不是正则的

BOSS Me
选取NZ+N\in Z^+ 选取w=0N+11Nw=0^{N+1}1^N,显然wL,len(w)=2N+1>Nw\in L,len(w)=2N+1>N
选取len(xy)Nlen(xy)\le N,则y=0my=0^mm1m\ge 1 选取i=0i=0,则xy0z=0N+1m1N∉Lxy^0z=0^{N+1-m}1^N\not \in L
不满足泵引理,因此不是正则语言

证明L={a3bncn3n3}L=\{a^3b^nc^{n-3}|n\ge 3\}不是正则语言

BOSS Me
选取NZ+N\in Z^+ 选取w=a3bNcN3w=a^{3}b^Nc^{N-3},显然wL,len(w)=2N>Nw\in L,len(w)=2N>N
选取len(xy)Nlen(xy)\le N,则有三种情况:y=amy=a^my=bmy=b^my=albry=a^lb^r ①选取i=2i=2,则xy2z=a3+mbNcN3∉Lxy^2z=a^{3+m}b^Nc^{N-3}\not \in L .②选取i=2i=2,则xy2z=a3bN+mcN3∉Lxy^2z=a^3b^{N+m}c^{N-3}\not \in L.③选取i=2i=2,则xy2z=a3bralbNcN3∉Lxy^2z=a^{3}b^{r}a^{l}b^{N}c^{N-3}\not \in L
三种情况都不满足泵引理,因此不是正则语言

证明L={0n10n1n0}L=\{0^n10^n1|n\ge 0\}不是正则语言

BOSS Me
选取NZ+N\in Z^+ 选取w=0N10N1w=0^{N}10^N1,显然wL,len(w)=2N+2>Nw\in L,len(w)=2N+2>N
选取len(xy)Nlen(xy)\le N,则y=0my=0^mm1m\ge 1 选取i=0i=0,则xy0z=0Nm10N1∉Lxy^0z=0^{N-m}10^N1\not \in L
不满足泵引理,因此不是正则语言

证明L={1pp是素数}L=\{1^p|p是素数\}不是正则语言

BOSS Me
选取NZ+N\in Z^+ 选取w=1P,Pw=1^{P},P是大于NN的最小素数,显然wL,len(w)=P>Nw\in L,len(w)=P>N
选取len(xy)Nlen(xy)\le N,则y=1by=1^bb1,xyz=1a1b1cb\ge 1,xyz=1^a1^b1^c 选取i=a+ci=a+c,则xya+cz=1a+b(a+c)+c=1(a+c)(1+b)∉Lxy^{a+c}z=1^{a+b(a+c)+c}=1^{(a+c)(1+b)}\not \in L
不满足泵引理,因此不是正则语言

判断L={1pp能被3整除}L=\{1^p|p能被3整除\}是否是正则的

1P1^P是正则的,1P=(111)1^P=(111)^*

以下为错误示范:xy4b+1z1a+c+4b+1xy^{4b+1}z\not =1^{a+c+4b+1}

BOSS Me
选取NZ+N\in Z^+ 选取w=1P,Pw=1^{P},P是大于NN的最小的3的倍数,显然wL,len(w)=P>Nw\in L,len(w)=P>N
选取len(xy)Nlen(xy)\le N,则y=1by=1^bb1,xyz=1a1b1cb\ge 1,xyz=1^a1^b1^c 选取i=4b+1i=4b+1,则xy4b+1z=1a+c+4b+1xy^{4b+1}z=1^{a+c+4b+1},由于a+b+c=3k,kN+a+b+c=3k,k\in N^+,因此1a+c+4b+1=13(k+b)+1∉L1^{a+c+4b+1}=1^{3(k+b)+1}\not \in L
不满足泵引理,因此不是正则语言

证明L={0nn是完全平方数}L=\{0^n|n是完全平方数\}不是正则的

BOSS Me
选取NZ+N\in Z^+ 选取w=0P,Pw=0^{P},P是大于NN的最小的完全平方数,P=K2P=K^2,显然wL,len(w)=P>Nw\in L,len(w)=P>N
选取len(xy)Nlen(xy)\le N,则y=0by=0^bb1,xyz=0a0b0cb\ge 1,xyz=0^a0^b0^c 选取i=b+Pi=b+P,则xyb+Pz=0a+c+b+P=02P=02K2xy^{b+P}z=0^{a+c+b+P}=0^{2P}=0^{2K^2},由于2K22K^2不是完全平方数,因此xyb+Pz∉Lxy^{b+P}z\not \in L
不满足泵引理,因此不是正则语言

证明L={0nn是完全立方数}L=\{0^n|n是完全立方数\}不是正则的

BOSS Me
选取NZ+N\in Z^+ 选取w=0P,Pw=0^{P},P是大于NN的最小的完全立方数,P=K3P=K^3,显然wL,len(w)=P>Nw\in L,len(w)=P>N
选取len(xy)Nlen(xy)\le N,则y=0by=0^bb1,xyz=0a0b0cb\ge 1,xyz=0^a0^b0^c 选取i=b+Pi=b+P,则xyb+Pz=0a+c+b+P=02P=02K3xy^{b+P}z=0^{a+c+b+P}=0^{2P}=0^{2K^3},由于2K32K^3不是完全平方数,因此xyb+Pz∉Lxy^{b+P}z\not \in L
不满足泵引理,因此不是正则语言

证明L={0nn2的幂}L=\{0^n|n是2的幂\}不是正则的

BOSS Me
选取NZ+N\in Z^+ 选取w=0P,Pw=0^{P},P是大于NN的最小的2的幂次,P=2KP=2^K,显然wL,len(w)=P>Nw\in L,len(w)=P>N
选取len(xy)Nlen(xy)\le N,则y=0by=0^bb1,xyz=0a0b0cb\ge 1,xyz=0^a0^b0^c 选取i=2i=2,则xy2z=0Pxy^2z=0^{P'},由于P<PP+N<2PP<P'\le P+N<2P2P2P是大于PP的下一个2的幂次数字,因此xy2z∉Lxy^{2}z\not \in L
不满足泵引理,因此不是正则语言

6.2 CFL的泵引理

大概率不考…

如果语言LLCFLCFL,存在正整数NN,对zL\forall z\in L,只要zN|z|\ge N,就可以将zz分为五部分z=uvwxyz=uvwxy,满足

  1. vxϵ(vx>0)vx\not =\epsilon(|vx|>0)
  2. vwxN|vwx|\le N
  3. i0,uviwxiyL\forall i\ge 0,uv^iwx^iy\in L

7.CNF/CYK算法

7.1 文法化简的顺序

  • 消除ϵ\epsilon -产生式

    SABS\rightarrow ABAAaAϵA\rightarrow AaA|\epsilonBBbBϵB\rightarrow BbB|\epsilon

    A、B是可空的,因此SABABS\rightarrow AB|A|BAAaAAaaAaA\rightarrow AaA|Aa|aA|aBBbBBbbBbB\rightarrow BbB|Bb|bB|b

  • 消除单元产生式

    若有ABA\rightarrow B,则称[A,B][A,B]为单元对,删除ABA\rightarrow B,然后将BB的产生式复制给AA

  • 消除非产生的无用符号

    AαA\rightarrow \alpha,且α\alpha中符号都是产生的,则AA是产生的

  • 消除非可达的无用符号

    SS是可达的,AαA\rightarrow \alpha,且AA是可达的,则α\alpha中符号都是可达的

7.2 CNF化简算法

每个不带 εεCFL 都可以由这样的 CFG G 定义*,* G 中每个产生式的形式都为ABCA\rightarrow BCAaA\rightarrow a

这里的 A,BCA,B和C 是变元,aa 是终结符

转换方法:

  1. 将产生式AX1X2...XmA\rightarrow X_1X_2...X_m中的终结符aa替换为新变元CaC_a

  2. 增加新产生式CaaC_a\rightarrow a

  3. 引入新变元D1,D2,...,Dm2D_1,D_2,...,D_{m-2},将产生式AB1B2...BmA\rightarrow B_1B_2...B_m替换为级联产生式

    AB1D1D1B2D2...Dm2Bm1BmA\rightarrow B_1D_1\\ D_1\rightarrow B_2D_2 ...\\ D_{m-2}\rightarrow B_{m-1}B_{m}

将下面的CFG写成CNF

SϵADDAS\rightarrow \epsilon | ADDA

AaA\rightarrow a

CcC\rightarrow c

DbCbD\rightarrow bCb

SSϵS'\rightarrow S|\epsilon

SAES\rightarrow AEEDFE\rightarrow DFFDAF\rightarrow DA

AaA\rightarrow aBbB\rightarrow bCcC\rightarrow c

DBGD\rightarrow BGGCBG\rightarrow CB

CFG G=({S,A,B},{a,b},P,S)CFG\ G=(\{S,A,B\},\{a,b\},P,S),产生式集合PP为:

SbAaBS\rightarrow bA|aB

AbAAaSaA\rightarrow bAA|aS|a

BaBBbSbB\rightarrow aBB|bS|b

请设计等价的CNFCNF

SCbACaBS\rightarrow C_bA|C_aBCbbC_b\rightarrow bCaaC_a\rightarrow a

ACbD1CbSaA\rightarrow C_bD_1|C_bS|aD1AAD_1\rightarrow AA

BCaD2CbSbB\rightarrow C_aD_2|C_bS|bD2BBD_2\rightarrow BB

7.3 CYK成员性测试算法

CYK算法用来对CNF文法进行成员性测试,例子如下:XijX_{ij}代表第ii个到第jj个字母区间

image-20240617001403304

举个例子,判断X14(bbab)X_{14}(bbab)时,检查如下,其中×\times代表笛卡尔积

  1. X11×X24={BS,BC}X_{11}\times X_{24}=\{BS,BC\},在表中查找是否属于产生式,这里找到SS产生BC
  2. X12×X34={}X_{12}\times X_{34}=\{\},空集跳过
  3. X13×X44={AB}X_{13}\times X_{44}=\{AB\},找到SSCC都产生ABAB

因此答案X14={S,C}X_{14}=\{S,C\}

8.构造图灵机

注意:画自动机时,可以先画出第一次循环,后面再补上循环缺失的转移

8.1 四则运算

加法、减法、乘法、乘方

加法

输入:B000C00BB000C00B

输出:B00000BB00000B

image-20240617194637214

整数真减法

输入:B000100BB000100B 输出:B0BB0B

输入:B00010000BB00010000B 输出:BB

这里采用1作为隔断,输出为前面的0数量-后面的0数量

image-20240617201054275

以000100(3-2)为例,以初始的1为界限,我们不断采用将1左边最远的0标记为B,1右边最近的0标记为1的操作

直到

  1. 发现1右边没有0了(即跳过1后遇到B),说明满足mnm\ge nnn标记完了,此时我们1左边是多标记了一个0为B的

    因此需要往左把标记的1变为B,只保留1前面的0,并且把最左边的一个B改为0(因为多标记了)

  2. 发现前缀0没有了,只剩下开始用来隔断的1,说明m<nm<n,因此往右把所有的01转B即可

乘法

输入:B000C00BB000C00B

输出:B000000BB000000B

太难了 建议抄在纸上T_T

  1. q0q0q3q3B000C00BB000C00B变为B000C00CB000C00C,并将新的字符串放在末尾的C后
  2. 思路:针对两个CC之间的0,我们从左往右,每标记一个,就在末尾C后面复制开头B和中间C之间的0,即q5q5q10q10实现转换为BYYYCX0C000BBYYYCX0C000Bq5q5q3q3将前面的Y转换回来,准备下一轮的复制,即变为B000CX0C000BB000CX0C000B
  3. q3q3遇到末尾CC则代表乘法完成,结果存放在末尾C后面,需要将末尾C和前面的C/X/0标记回B(即图中q3q3q12q12,画的有点问题)

2222-1

8.2 字符串操作

移动、复制、查找、反转

复制字符串:

输入:B10110BB10110B

输出:B10110C10110BB10110C10110B

比较简单,分01讨论即可,最后别忘了把前面标记的01标记回去(不画图了^ _ ^,下图来源

Lightbox

反转字符串

输入:B10110BB10110B

输出:B01101BB01101B

从右往左标记,分01讨论即可

image-20240617220624563

8.3 特定排列

设计识别{0n1nn1}\{0^n1^n|n\ge 1\}的图灵机

思路:我们找出每一对匹配的0011,将其标记为XXYY,当所有都标记完成则接受该字符串

B000111BBX00Y11BBXX0YY1BBXXXYYYBB000111B\rightarrow BX00Y11B\rightarrow BXX0YY1B\rightarrow BXXXYYYB

建立循环如下,

  1. 识别到00,将其改为XX并往右移动
  2. 跳过中间所有的00YY(一直往右)
  3. 识别到11,改为YY往左移动
  4. 跳过中间所有的YY00(一直往左)
  5. 找到XX后往右移动,此时回到循环开头

如果在循环开头遇到YY,则说明0101对已经标记完,则跳过所有的YY找到BB,就进入了终结状态

image-20240610113755019

此图灵机接受00110011的ID序列是?

q00011 Xq1011 X0q111 Xq20Y1 q2X0Y1 Xq00Y1 XXq1Y1 XXYq11 XXq2YY Xq2XYY XXq0YY XXYq3Y XXYYq3B XXYYBq4B\begin{align} q_00011&\ \vdash Xq_1011\ \vdash X0q_111\ \vdash Xq_20Y1\\ &\ \vdash q_2X0Y1\ \vdash Xq_00Y1\ \vdash XXq_1Y1\\ &\ \vdash XXYq_11\ \vdash XXq_2YY\ \vdash Xq_2XYY\\ &\ \vdash XXq_0YY\ \vdash XXYq_3Y\ \vdash XXYYq_3B\\ &\ \vdash XXYYBq_4B \end{align}

构造TM识别L={w{0,1}w01的数量相等}L=\{w\in \{0,1\}^*|w中01的数量相等\}

由于ww中的01一定匹配,我们从左往右,不断找到一对01匹配项,对于左边的每个0/1,标记为为X,找到右边匹配的1/0标记为Y

因此最新的X(位于q0处,且是最左边的X)的左边一定都标记完成,右边一定只剩下Y;当跳过Y遇到B时,则接受该字符串

image-20240618145242048

构造TM识别L={www{0,1}}L=\{ww|w\in\{0,1\}^{*}\}

分为两步,以B01110111BB01110111B作为例子,

  1. 找到中点:我们不断填充左边和右边,最终指针停在BXYYYBXYYYXXYYYBYYYB的位置

  2. 判断左边和右边:我们让指针左移一格,然后把左半边的XY还原为01,此时B0111XYYYBB0111XYYYB

    然后不断标记左边,对右边进行判断即可,判断一个就标记为B。左边遇到B则进入终结状态

构造TM识别L={wwRw{0,1}}L=\{ww^R|w\in\{0,1\}^{*}\}

分01讨论即可,从两端往中间标记

img

构造TM识别语言{anbncnn1}\{a^nb^nc^n|n\ge 1\}

每标记一个a(a/X),就往右移动匹配一个b(b/Y),再往右移动匹配一个c(c/Z),然后往左直到X,再往右,开始重复以上步骤。

注意,当a识别完(X往右遇到Y)时,需要检查是否所有的b和c都转为了Y和Z,是则接收,否则不接收。

构造TM识别语言{anbmcnnm}\{a^nb^mc^n|n\ge m\},其中nnmm为正整数

1

构造TM识别语言{anbman+m}\{a^nb^ma^{n+m}\},其中nnmm为正整数

先查找a,再查找b,都标记右边的a即可

img

构造TM识别语言{anb2n}\{a^nb^{2n}\},其中nn为正整数

每个a匹配两个b即可(a/X,b/Y),直到a识别完(遇到左端的Y),需要检查b是否识别完(Y结束后就是B)

9.讨论

9.1 不可判定性undecidable

对于一个问题,如果存在一个算法能回答它,则该问题是可判定的,即“可判定问题”=“递归语言”;否则是不可判定的

  • 不可判定的问题:

    • 是否会执行程序中的特定代码行?
    • 给定的无上下文语法是否无二义?
    • 两个给定 CFG 生成相同的语言吗?
  • 对角化语言LdL_d:不是递归可枚举语言,即不存在接受LdL_d的图灵机

  • 通用语言Lu={M111wwL(M)}L_u=\{M111w|w\in L(M)\}(图灵机MM和输入串ww的编码组成的有序对(M,w)(M,w)):

    递归可枚举(RE)但非递归的语言,即不可判定的

  • 赖斯定理:令LPL_PTM MTM\ M的二进制TMTM代码,满足L(M)L(M)具有属性P。

    有两个属性可以判定:

    1. 不包含任何RE语言(判定为假)
    2. 包含每个RE语言(判定为真)

    对于其他属性PPLPL_P不可判定。

    证明:采用归约的技术,将LuL_u归约到LPL_P,由于LuL_u不可判定,因此LPL_P不可判定

9.2 计算机设计computer design

9.3 程序语言设计programming language design


形式语言与自动机考试例题整理(考试向)
http://kcollision.github.io/2024/0684b3f46a.html
作者
collision
更新于
2024年6月18日
许可协议