电子科技大学《有限自动机》期末总结

前言

  1. 首先要说明的是:一般的文法至少都是0型文法,也就是说0型文法限制最少。若将0型文法比作基类的话,1、2、3型文法就是不断继承并加以限制得到的子类。
  2. 0 型文法(PSG,对应图灵机TM)
    1型文法(CSG,对应线性界线自动机,自然语言)
    2型文法(CFG,对应下推自动机PDA,程序设计语言)
    3型文法(RG,对应有限自动机DFA/NFA)
    • 它是在2型文法的基础上满足:A→α|αB(右线性)(A→α|Bα 左线性不满足)
    • 3 型文法也叫正规文法,记为 RG。
  • 0、1 型文法产生式左部存在含有终结符的符号串或两个以上的非终结符,而2、3型文法的产生式左部只允许是单个非终结符号。

第一章 基础知识

(1) ε \varepsilon ε 代表空串(长度为 0 的串),{ ε \varepsilon ε} 代表仅含有空串的集合。

(2) 用 ∅ \empty 代表空集:一个元素都不包含的集合。

(3) 用 ∑ 代表一个符号的非空有限集合,称之为字母表,其中的元素称为字母。任意字符的非空集合就是一个字母表(字母表有非空性、有穷性、单一性)

(4) α β \alpha \beta αβ 代表两个字符串 α \alpha α β \beta β 的连接

  • 若: α = a 1 a 2 a 3 . . . a n \alpha = a_1a_2a_3...a_n α=a1a2a3...an β = b 1 b 2 b 3 . . . b n \qquad \beta= b_1b_2b_3...b_n β=b1b2b3...bn
  • α β = a 1 a 2 a 3 . . . a n b 1 b 2 b 3 . . . b n \alpha \beta= a_1a_2a_3...a_nb_1b_2b_3...b_n αβ=a1a2a3...anb1b2b3...bn

特别:

  • α ε = ε α = α \alpha \varepsilon = \varepsilon \alpha = \alpha αε=εα=α
  • α 2 = α α \alpha^2 = \alpha \alpha α2=αα
  • α 1 = α \alpha^1 = \alpha α1=α
  • α 0 = ε \alpha^0 = \varepsilon α0=ε
  • α n = α n − 1 α \alpha^n = \alpha^{n-1}\alpha αn=αn1α

注: 一般,AB与BA是不相等的。


思考:




  • 比如: x = 01 , y = a b , = > x y = ( 01 a ) b = ( 01 ε ) a b = 01 a b x = 01, y = ab, => xy = (01a)b = (01ε)ab = 01ab x=01,y=ab,=>xy=(01a)b=(01ε)ab=01ab
  • 连接满足结合律,但不满足交换律,比如: x y z = ( x y ) z = x ( y z ) xyz = (xy)z = x(yz) xyz=(xy)z=x(yz),但是, x y ≠ y x xy ≠yx xy=yx 即 01ab ≠ ab01

  • 集合即含有多个字符串

  • 字母表的克林闭包: ∑ ∗ = ∑ 0 ∪ ∑ 1 ∪ ∑ 2 ∪ ∑ 3 . . . \sum^* = \sum^0 \cup \sum^1\cup \sum^2 \cup \sum^3 ... =0123...
  • 集合 A 的克林闭包: A ∗ = A 0 ∪ A 1 ∪ A 2 ∪ A 3 . . . A^* = A^0 \cup A^1\cup A^2 \cup A^3 ... A=A0A1A2A3...

注: 一般,AB与BA是不相等的。

6) A n A^n An 代表集合 A 的 n 次连接 (n次幂)

  • A 的 n 次幂定义为:
    • (1) A 0 A^0 A0 = { ε \varepsilon ε}
    • (2) A n = A n − 1 A n ≥ 1 A^n = A^{n-1}A \qquad\qquad n \geq 1 An=An1An1

7) A*代表A上所有字符串的集合,即表示集合A中的所有串进行任意次连接而形成的所有串的集合

A* 称为集合 A 的闭包(克林闭包)

例:A = {0,1}

8) A+ 称为A的正闭包

思考:
是否对于任意的集合 A,都有: A + = A ∗ − { ε } A^+= A^*-\{ε\} A+=A{ε}

  • 结论: 除 A = {ε} 外

语言

9)给定字母表 ∑,则 ∑* 的任意子集 L 称为字母表 ∑ 上的一个语言。空集是所有集合的子集,所以 ∅ \empty 可以是所有字母表产生的语言

  • 本质上,语言 L 是字母表 ∑ 上的字符串形成的集合。
  • 语言可分为有穷语言与无穷语言

10)设 ∑ 是一个字母表, ∀ L ⊆ ∑ ∗ , ∀ w ∈ L , w 称为语言 L 的一个句子 \forall L \subseteq \sum^*, \forall w \in L, w 称为语言 L 的一个句子 L,wL,w称为语言L的一个句子,

语言的乘积

语言的 n 次幂

设 ∑ 是一个字母表, ∀ L ⊆ ∑ ∗ \forall L \subseteq \sum^* L, L 的 n 次幂也是一个语言

  • (1) 当 n = 0 时, L 0 = { ε } L^0 = \{ε\} L0={ε}
  • (2) 当 n ≥ \geq 1时, L n = L n − 1 L L^n = L^{n-1} L Ln=Ln1L

语言的闭包

L 的正闭包 L + L^+ L+ 是一个语言: L + = L ∪ L 2 ∪ L 3 ∪ … L^+ = L ∪ L^2 ∪ L^3 ∪ … L+=LL2L3
L 的克林闭包 L ∗ L^* L 是一个语言: L ∗ = L 0 ∪ L + L^* = L^0 ∪ L^+ L=L0L+

给出递归定义

对于任意 x ∈ ∑ ∗ x \in \sum^* x ,字符串 x x x 的倒序
(1)若 |x| <=1,则 x T = x x^T =x xT=x
(2)若 |x| > 1,令 x = y a x = ya x=ya

  • 其中 y ∈ ∑ + y \in \sum^+ y+, a ∈ ∑ a \in \sum a

x T = a y T 若( 2 )中令 x = a y ,则 x T = y T a x^T = ay^T \quad \quad 若(2)中令 x = ay,则 x^T = y^Ta xT=ayT若(2)中令x=ay,则xT=yTa

第一章课后作业

(4)题有误,应该为: { 01 , 1 } ∗ { ε , 00 } { 10 , 1 } ∗ \{01, 1\}^*\{\varepsilon, 00\}\{10, 1\}^* {01,1}{ε,00}{10,1},正则表达式为: ( 01 + 1 ) ∗ ( ε + 00 ) ( 10 + 1 ) ∗ (01+ 1)^*(\varepsilon + 00)(10 + 1)^* (01+1)(ε+00)(10+1)

哈工大有限自己动机作业

  1. 字符串的长度可以是任意的, 那么是否也可以是无穷长的?(长度只能是有限长的)
  2. 任意有穷集合的克林闭包, 是否一定是无穷集合?(不一定,例如 ∅ ∗ = { ε } \empty^* = \{\varepsilon\} ={ε} { ε } ∗ = { ε } \{\varepsilon\}^* = \{\varepsilon\} {ε}={ε} 都是无穷集合 )

第二章 形式语言

给定字母表 ∑ \sum ,则 ∑ ∗ \sum^* 的任意子集 L L L 称为字母表 ∑ \sum 上的一个语言;本质上,语言 L L L 是字母表 ∑ \sum 上的字符串形成的集合。语言中的元素,称为语言的句子。


产生句子的过程

  • 从S开始,可以反复利用产生式的右边代替产生式的左边(推导过程),最终可以产生括号匹配的句子。

产生式(规则)的个数是有限的,但规则是递归的,所以可以产生无限个句子,甚至长度无限的句子。

  • S称为非终结符,在推导过程中,可以被代替的符号。
  • ()称为终结符,在推导过程中,不可以被代替的符号。
  • → 是产生式系统的元符号,不属于终结符,也不属于非终结符。



高级程序设计语言中的算术表达式的形成规则:

  • ① 单个变量是最基本的句子;
  • ② 若E是一个句子,则 EAE 是一个句子(其中A代表运算符+、-、*、/)
  • ③ 若E是一个句子,则 (E) 是句子;
  • 比如 EAE 可以是(EA)E、E(AE)
  • 通过定义一个新的 T,使得 * 、/、 F 运算先于 E + T,即对 T 运行作绑定,最后又在 T 的基础上,让(E)以及单个字符 i 优先运算
  • 这个展示了优先()、再 ^ 运算,然后是 *、/、%

  • 要求以字母开头,即首先表示单个字符的 I,以字母开头,字母 + 字母:IL,字母 + 数字:ID 即可

注意: 一个文法只能产生一个语言,一个语言 L 可能会由不同的文法产生



文法

短语结构文法 PSG (文法 G)

文法 G 是一个四元式:G = (∑,V,S,P)

  • 是有限字符的集合 (字母表), 元素称为字母或者终结符; 比如: ∑ = {( , )}、或者 ∑ = {a, b}
  • V 是有限字符的集合–非终结符集合,元素称为变量或者非终结符;如:V = {S}V = {E, A}V = {A, B, C}
  • S∈V,称为文法的开始符号;比如 V = {A, B, C} ,而 S = A,说明 P 中的产生式是从 A 开始的。
  • P 是产生式 α→β 的集合:比如:P:A → \to AB; AB → \to CAB; A → \to d; B → \to a
    • α ∈ ( ∑ ∪ V ) + α ∈(∑∪V)^+ α(V)+
      α 至少包含一个非终结符
    • β ∈(∑∪V)*

文法的作用就是产生一个语言。
文法通过推导产生语言,推导的逆过程称为归约
如果文法G有 α → \alpha \to αε产生式,则G是 PSG 型文法


在这里插入图片描述


在这里插入图片描述


语言

语言的定义: 给定文法 G,有开始符号 S,把 S 可以推导出的所有句子的集合,称为由文法产生的语言,记为 L(G),L(G)={ω|S=>*ω,且 ω∈ ∑ ∗ ∑^* }

例子

注意: 文法G产生语言L,必须满足:

  • ① G推导产生的所有句子都在L中
  • ② L的任意句子可以由G推导产生


文法和语言的 3 类问题
1、已知文法,得到该文法产生的语言
2、已知语言,构造产生该语言的某个文法
3、判断一个文法是否产生某个语言


第一类问题
第二类问题

S → \to aSa | bSb | cSc | aa | bb | cc

第三类问题
  • 说明,产生 1 个 0,就产生 1 个 1,开始符号产生 0 开始,则后面用 B 产生 一个 1,返回开始,开始产生一个 1,则用 A 产生一个 0,但是 000111也是相同的 0 和 1,所以各自加上 1 AA,0BB

第三类问题还包括

  • 判断一个语言是否由某个文法产生。
  • 证明一个语言由某一个文法产生。

注意:

  • 一个语言可以由多个不同的文法产生。
  • 一个文法只能产生一个语言。

例2-5

文法等价

  • 若文法 G1 和文法 G2 产生相同语言,则称文法 G1 和 G2 是等价的文法。L(G1) = L(G2)

注意区别:

  • 文法 G1 和 G2 等价
  • 文法 G1 和 G2 相同

文法分类

0 型文法:

  • 对于一般的短语结构文法(PSG) ,G=(∑,V,S,P),G称为0型文法,对应的L(G)称为0型语言 或 短语结构语言(PSL) 或 递归可枚举集

1 型文法 (左边部分长度小于等于右边部分的长度)


2 型文法(左边部分是单个非终结符且左边部分长度小于等于右边部分长度)


3型文法(左边部为单个非终结符,右边部分最多只有一个非终结符,且在最右边)


文法分类判断方法:

四类文法和对应的四类语言之间是真包含关系。

例题(文法判断)

  • 上述例题G1: S → \to 0 | 1 | 00 | 11 满足,① 任意 α → β \alpha \to \beta αβ∈P,均有 |α| ≤ |β| (左边部分长度小于等于右边部分长度) 成立,所以为 CSG(1 型);② 任意 α → β \alpha \to \beta αβ∈P (左边部分是单个非终结符号,CFG);③ 任意 α → β \alpha \to \beta αβ∈P,具有形式 A → \to w,w∈∑+ (右边部分最多只有一个非终结符号,且出现在最右边),所以为 RG 型(3 型),所以它同时也是 CFG,CSG,PSG , RLG 型
  • G2:同 G1
  • G3:同 G1 分析方式

  • G4,右边出现了两个非终结符,不满足 RG, 属于 CFG,CSG,PSG
  • G5 同 G4,不满足 RG, 属于 CFG,CSG,PSG

  • G6,左边不是单个非终结符,不属于CFG,所以更不可能是 RG,属于 CSG,PSG

  • G7:右边小于等于左边不满足,不属于 CSG,所以更不可能是 CFG,RLG,只属于 PSG

L(G) = {0, 1, 00, 11} ⇒ \Rightarrow

  • G1: S → \to 0 | 1 | 00 | 11 或

  • G2:
    S → \to A | B | AA | BB
    A → \to 0
    B → \to 1

  • 上述 G1 属于:RG、CFG、CSG、PSG, G2 属于 CFG、CSG、PSG


L(G) = { a n b ∣ n > 0 a^nb | n > 0 anbn>0} ⇒ \Rightarrow

  • G:S → \to ab | aS
  • 上述 G 属于:RG、CFG、CSG、PSG

L(G) = { ϵ \epsilon ϵ} ∪ \cup { a n b ∣ n > 0 a^nb | n > 0 anbn>0} ∪ \cup { a n ∣ n > 0 a^n | n > 0 ann>0} ⇒ \Rightarrow

  • G:S → \to ab | aS | ϵ \epsilon ϵ
  • 上述 G 属于:PSG,因为其他文法至少满足,左边部分小于等于右边部分,空串的长度为 0

L(G) = { w ∣ w ∈ { 0 , 1 } + , 且 w 以 0 开始 w | w \in\{0, 1\}^+, 且 w 以 0 开始 ww{0,1}+,w0开始} ⇒ \Rightarrow

  • G1:
    S → \to 0 | 0A
    A → \to 0 | 1 | 0A | 1A
    其中 A 产生 { 0 , 1 } + \{0, 1\}^+ {0,1}+
  • G2:
    S → \to 0A
    A → \to ϵ \epsilon ϵ | 0A | 1A
    其中 A 产生 { 0 , 1 } ∗ \{0, 1\}^* {0,1}
  • 上述 G1 属于:RG、CFG、CSG、PSG, G2 属于 PSG

L(G) = { 0 n ∣ n > 0 0^n | n > 0 0nn>0} ⇒ \Rightarrow

  • G1:
    S → \to 0S
    S → \to 0
  • 上述 G1 属于:RG、CFG、CSG、PSG

L(G) = { 0 n ∣ n ≥ 0 0^n | n ≥ 0 0nn0} ⇒ \Rightarrow

  • G1:
    S → \to 0S
    S → \to ϵ \epsilon ϵ
  • 上述 G1 属于:PSG

L(G) = { a n b n ∣ n > 0 a^nb^n | n > 0 anbnn>0} ⇒ \Rightarrow

  • G1:
    S → \to aSb
    S → \to ab
  • 上述 G1 属于:CFG、CSG、PSG

L(G) = { a , b a, b a,b} ∗ ^* ⇒ \Rightarrow

  • G1:
    S → \to aS
    S → \to bS
    S → \to ϵ \epsilon ϵ
  • 上述 G1 属于:PSG

L(G) = {字母表{a ,b} 上所有对称的串 (没有中心点) 组成的语言} ⇒ \Rightarrow

  • G1:
    S → \to aSa
    S → \to bSb
    S → \to aa
    S → \to bb
  • 上述 G1 属于:CFG、CSG、PSG

L(G) = {字母表{a ,b} 上所有对称的串(有中心点)组成的语言} ⇒ \Rightarrow

  • G1:
    S → \to aSa
    S → \to bSb
    S → \to aba
    S → \to bab
  • 上述 G1 属于:CFG、CSG、PSG

L(G) = { w w T ∣ w ∈ { a , b } ∗ ww^T | w \in \{a, b\}^* wwTw{a,b}}

  • G1:
    S → \to aSa
    S → \to bSb
    S → \to ϵ \epsilon ϵ

例题(根据文法构造产生的语言)

A → \to ab | aAb ⇒ \Rightarrow { a n b n a^nb^n anbn | n > 0}

A → \to ε \varepsilon ε | aAb ⇒ \Rightarrow { a n b n a^nb^n anbn | n ≥ 0}

A → \to ε \varepsilon ε | aA | bA ⇒ \Rightarrow { a , b } ∗ a, b\}^* a,b}

A → \to a | b | aA | bA ⇒ \Rightarrow { a , b } + a, b\}^+ a,b}+

A → \to ε \varepsilon ε | aA ⇒ \Rightarrow { a n ∣ n ≥ 0 a^n | n ≥ 0 ann0}

A → \to a | aA ⇒ \Rightarrow { a n ∣ n > 0 a^n | n > 0 ann>0}

A → \to aAa | bAb ⇒ \Rightarrow { w A w T ∣ w ∈ { a , b } + wAw^T | w \in \{a, b\}^+ wAwTw{a,b}+}

A → \to 0 | 1 ⇒ \Rightarrow { x ∣ x = x T x | x = x^T xx=xT}


例题(根据产生的语言构造文法)

1. 字母表 {a, b} 上所有对称的串(没有中心点)组成的语言:

  • S → \to aSa | bSb | aa | bb

2. 字母表 {a, b} 上所有对称的串(有中心点)组成的语言:

  • S → \to aSa | bSb | aba | bab

3. L = { w d w T ∣ w ∈ { a , b , c } + wdw^T | w \in \{a, b, c\}^+ wdwTw{a,b,c}+ 上所有对称的非空串组成的语言}

  • S → \to aSa | bSb | cSc | aaa | bbb | ccc | aba | aca | bab | bcb | cac | cbc
  • 第 (6) 缺少了 w → 0 ∣ 1 ∣ 0 w ∣ 1 w w \to 0 | 1 | 0w | 1w w0∣1∣0w∣1w 并且 S → 0 S 0 ∣ 1 S 1 ∣ w S \to 0S0 | 1S1 | w S0S0∣1S1∣w 更妥


对称法

顾名思义,对称法适用于那些存在对称性的语言。
对称法构造的精髓在于:

  1. 找出对称轴
  2. 找出对称性

逐步求精法(分解法)

逐步求精法有两种:自上而下或者从左向右。
逐步求精法使用前提:语言中各成分之间没有关联。


第二章课后作业

第(3) 问中,AB 看为一个整体,S 的产生等价与 AB,其中用 A 代表 0,B 代表 1,AB 来产生 AAB,即前面先产生 A,AB 来产生 ABB,即后面产生 1


其中的 (3) 还可以写为 S → \to 11A11 | 11 | 111、 A → \to ε \varepsilon ε | 1A | 0A

所有 0 和 1 一样多的串
S → 0 A ∣ 1 B S \to 0A | 1B S0A∣1B
A → 1 ∣ 1 S ∣ 0 A A A \to 1 | 1S | 0AA A1∣1S∣0AA
B → 0 ∣ 0 S ∣ 1 B B B \to 0 | 0S | 1BB B0∣0S∣1BB

所有 0 比 1 多的串
S → 0 A ∣ 1 B S \to 0A | 1B S0A∣1B
A → 1 ∣ 1 S ∣ 0 A A A \to 1 | 1S | 0AA A1∣1S∣0AA
B → 0 ∣ 0 S ∣ 0 B ∣ 1 B B B \to 0 | 0S | 0B | 1BB B0∣0S∣0B∣1BB

S → 1 S A ∣ 0 S ∣ 0 S \to 1SA | 0S | 0 S1SA∣0S∣0
1 A → A 1 1A \to A1 1AA1
A 1 → 1 A A1 \to 1A A11A
A → 0 A \to 0 A0

所有最多有一对连续的 0 或最多有一对连续的 1 的串
在这里插入图片描述

S → A 00 B ∣ C 11 D ∣ A ∣ B S \to A00B | C11D | A | B SA00BC11DAB
A → 01 A ∣ ε A \to 01A | \varepsilon A01Aε
B → 10 B ∣ ε B \to 10B |\varepsilon B10Bε
C → 10 C ∣ ε C \to 10C | \varepsilon C10Cε
C → 01 C ∣ ε C \to 01C | \varepsilon C01Cε

所有最多有一对连续的 0 且最多有一对连续的 1 的串
S → A 00 B 11 C S \to A00B11C SA00B11C
A → 01 A ∣ ε A \to 01A | \varepsilon A01Aε
B → 10 B ∣ ε B \to 10B | \varepsilon B10Bε
在这里插入图片描述


第一版(3) 中 aBSa,其中的 B 表示,前面产生一个 a,立刻产生一个 B,但是结果为 aBaBSaa 这种类型,所以需要将 Ba 的顺序换位 aB。然后将所有的 B 转换为 b,但是这里存在一个问题。B 直接转化为 b,会出现接收 ababaa 这一类串的情况。所以错误,应该改为

S → \to aBSa | aba
Ba → \to aB
Bb → \to bb

这里当 Bb 是才能将 B 换为 b,是因为存在 aB 和 Ba 的情况,不能直接将 B 换为 b,而是要先将所有 B 移动到中间

第二版(3) 中错得很厉害,无法循环制造 a b c

第一版中的(6)不对


总结

在这里插入图片描述

在这里插入图片描述

第三章 有限状态自动机(DFA/NFA)

注: FA(DFA 和 NFA)识别正则语言(右线性语言)

在这里插入图片描述

有限状态自动机的读头只能向右移动,不能向左

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

预备知识:正则表达式

在这里插入图片描述

在这里插入图片描述

确定的又穷自动机

DFA 的计算

δ ( q 1 , 1 ) \delta(q_1, 1) δ(q1,1) 表示在 q 1 q_1 q1 状态接受了一个 1,由于根据要求,需要先接受一个 0,所以保持不变 δ ( q 1 , 1 ) = q 1 \delta(q_1, 1) = q_1 δ(q1,1)=q1,而 δ ( q 1 , 0 ) = q 2 \delta(q_1, 0) = q_2 δ(q1,0)=q2 表示当在 q 1 q_1 q1 状态下接收了一个 0,则可转入 q 2 q_2 q2 状态

q 1 q_1 q1 为初始状态,表示没有读入任何的字符




开始状态 q 0 q_0 q0 没有读入任何字符串,当读入一个 1 时,跳转到 q 1 q_1 q1 状态,接收


这里要求给出含有偶数个 0 和偶数个 1 的串:

  • 首先我们先给出偶数个 1 如下图上方所示,即将开始时刻设置为接受状态(开始时刻没有读入任何串),当接受到 0 时,不变,接受到 1 时,跳转到另一个状态。
  • 给出偶数个 0 如下图下方所示,同样设置开始时刻的状态为接受状态,当接受到 1 时不变,接收到 0 时,跳转到另一个状态。

进一步考虑将上述两个情况的图进行融合,则有四种情况:

  • q0:含有偶数个 0 和偶数个 1
  • q1:只含有偶数个 0
  • q2:只含有偶数个 1
  • q3:仅不是偶数个 0 也不是偶数个 1

这里是哈工大老师给出的答案,个人认为

w w w 是 3 的倍数,转化为读入的数字模 3 余 0、1 、2,并且是二进制表示,所以余数 * 2 即可进位

  • q0(模 3 余 0): 最开始是 0 满足是 3 的倍数,当接受一个 0 时,即 0*2+0 = 0, 当接受一个 1 时,即 0*2+1 = 1(q1 状态)
  • q1(模 3 余 1): 最开始是 1,接受一个 0,即 1*2+0 = 2,当接收一个 1 时,即 1*2+1 = 3(q3 状态)
  • q3(模 3 余 2): 最开始是 2,接受一个 0,即 2*2 + 0 = 4(余数为 1),当接受一个 1 时,即 2*2 + 1 = 5(余数为 2)
  • 需要设置一个开始状态,默认所有开始状态都是空串(qs)
  • qs 接收一个 1 时,余数为 1,跳转到 q1
  • qs 接收一个 0 时,余数为 0, 跳转到 q0 接收




接收: 0 或 1 开头以 0 结尾的串








2k: 0、2、4、6、8、10…
3m:0、3、6、9、12、15…
所以 2k + 3m: 除了不能表示 1 外,均可


2k:2、4、6、8、10、12、14…
3m:3、6、9、12、15、18…

如上 m、k>0,所以 2k + 3m: 除了不能表示 1、2、3、4、6外,均可





注意是十进制数,和之前的二进制数有所区别:

  • q0 的余数为 0,当读入 0 时,0*10+0 = 0,除 3 余数还是0;当读入 1 时,0 * 10 + 1 = 1,除 3 余数为 1,跳转到 q1;当读入 2 时,0 * 10 + 2 = 2,除以 3 余数为 2,跳转到 q2
  • q1 的余数为 1,当读入 0 时,1*10 + 0 = 10,除 3 余数为 1,跳转到自身;当读入 1 时,1*10 + 1 = 11,除 3 余数 为 2, 跳转到 q2;当读入2 时,1*10 + 2 = 12, 除 3 余数为 0,跳转到 q0
  • q2 的余数为 2,同理


这里说字符串代表的数字为十进制

  • q0 余数为 0,当接受数字 x = 1, 4, 7 时,0*10 + x,除以 3,余数均为 1
  • q1 余数为 1,当接受数字 x = 2, 5, 8 时,1 * 10 + x, 除以 3,余数均为 0

注意是二进制

  • 这里初始接受一个 0,到 q0 状态
  • q0:表示余数为 0,当接收 1 时,0 * 2 + 1 = 1,到 q1 状态
  • q1:表示余数为 1,当接受 1 时,1 * 2 + 1 = 3,到 q3 状态
  • q3:表示余数为 3,当接受 1 时, 3 * 2 + 1 = 7, 7%5 = 2,到 q2 状态
  • q2:表示余数为 2,当接收 1 时,2 * 2 + 1 = 5, 5 % 5 = 0,到 q0 状态(少画了一条 q2 到 q0 的线)
  • 其他状态转化,类推即可

  • 同理,能被 4 整除的余数为 0,1,2,3 四个状态
  • 同上述 2 进制一样,此处用余数 * 10 + 接收的数字,看最终余数是多少


NFA








如下例题可以看出,根据正则表达式可以直接表达出 NFA

图 3.27 从 图 3.26 DFA 中可以看出,只有当接收 0 时才能被 2 整除



注意这里是收尾字符相等,不是字符串


  • 根据正则表示 (a+b)* 进入自换,下一个 b ,进入下一个状态,(a + b)* 自环,又一个 a,进入下一个状态,后面 (a + b) 进入最后一个满足的状态,后续单起 + ,继续

  • 根据正则表达式同理,对于的 DFA 如下:

在这里插入图片描述

DFA 如下:


不懂

DFA 如下:


DFA 如下:最后一个圈画双环,接受,少画了


在这里插入图片描述

DFA 如下:

NFA 转化为 DFA

在这里插入图片描述

第三章课后习题

3.1 1-11 103页
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(6)有误,最开始空串不能接收,应该再画一个环

在这里插入图片描述
在这里插入图片描述

二进制数: x 模 5 与 3 同余表示 x 除以 5 余数为 3,模 5 的余数为 0、1、2、3、4。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 1-9
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


总结

NFA和DFA的区别:NFA对于一个输入可以有多个输出状态,而DFA只能有一个。

DFA 产生的语言为有限状态语言(FSL),每个 FSL 都是一个右线性语言。

DFA 将串扫描结束时,自动停机,这是唯一的停机状态。

利用 DFA 构建右线性文法,每个状态就是一个非终结符,状态转换函数等价于产生式。陷阱状态在文法中是无用非终结符。

第五章 下推自动机

注: PDA 识别上下文无关语言





Z 0 Z_0 Z0 表示栈为空






注意: Z 表示任意的栈顶符号


通过上述下推自动机的案例表如下:

不确定的下推自动机

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

注意:确定PDA和不确定PDA不等价。


在这里插入图片描述


在这里插入图片描述

第五章课后习题

(1)读入 1 ,将 A 压入栈,读入 0,将 1 弹栈,最终 1 的数量大于等于 0,当 0 弹出完后,存储带上为空,但是栈内还有 A。(read 表示入栈,match 表示出栈,当读到 0 时,转为出栈 match 状态)

(2)当读入一个 1,将两个 A 压入栈,当读到 0 时,换为弹出状态,每次弹出一个 A,当再一次读到 1 时,此时栈内应该为 Z 0 Z_0 Z0,因此保持栈内元素不变,一直读完 1

(3)先读前面 10,再同理读后面的 10



广义下推自动机与单态下推自动机

一般下推自动机(PDA)的栈顶是一个符号,而广义下推自动机(PDA)的栈顶可以为一个符号串。

定理 对于任意的下推自动机,存在上下文无关文法 G,使得 L(G) = L(PDA)

定理 上下文无关文法产生的语义也能被广义不确定下推自动机(PDA)接收

总结

第六章 图灵机

注: 处理 0 型文法

注意这里谈到的 ① FSC 先对所处状态进行改变,即 q' ,② 然后对当前扫描的符号进行擦除或印刷新的符号,擦除即用 B 代替、或不改变当前符号,即使用原来符号相同的符号。 ③ 再移动 FSC 判断下一个状态




even 表示偶数、odd 表示奇数


初始状态设置为 start ,即不可接收空串,而上一个初始状态为 even 状态


格局转换即用字符模拟图灵机过程


当读到 一个时,转换状态,后面不能再读1




修改完后,最终利用 check 进行检查,判断是否所有的 # 在一起,所有的 $ 在一起,从而实现前面全是 a 后面全是 b



向左寻找最左边的 a,#aa$abbb,这里最终为 ###$#$$$,不应该接收,不接收的逻辑也体现在检查哪里,检查第一个 $ 开始,检查后面所有连续的 $



先判断前面全是a,后面全是b,然后变一个a为 # 就变一个b 为 #,最终检查存储带上是否全为 #,全为则接收



同上面的 a n b n a^nb^n anbn,这里只是多加了一个 c,删了 a ,b,删 c 即可


第二个如何做到删与 b 同数量的 c,那当然是删 一个 b 删一个 c


图灵机作为非负整数函数计算模型

  • 当将图灵机作为计算模型时,最终存储带上有多少个 0,结果就是多少,所以目的是增加 0,减少 0 的问题,非 0 的其他字符均需要变为 B
  • o m 1 0 n o^m10^n om10n 实际上是一进制的模型

注意输出带上留下的连续的 0 即为结果




输入带上有多少个连续的 0 结果就是多少,一定要是连续的 0,所以将 1 改为 0,再将最后一个 0 改为 1,而不是直接将 1 改为 0


第一种写法: 此时的 start 为一般状态,即当 m > 0 时,前面的状态均为 start 状态,直到读到 1


第二种写法: 这里 start 为开始状态,其余逻辑与上述相同



m < n 时,思路:删一个0,删一个1,删除的最终都变为B,剩下的就是结果 m-n

提问: 删除 1 右边的 0,不该写为 1,改写为 # 或其他非 B 符号可以吗?可以

提问: 删除 1 右边的 0,不该写为 1,改写为 B 可以吗,不可以,改写为 B,如何判断 1 右边的 0 已经被替换完。和结束的判断条件冲突了,一样判断是否为 B 了

  • 输入带上多少个 0,最终结果就是多少,整体逻辑为,m 中的设置为 B,n 中的设置为 1,但是 n 设置的 1最终都是要变为 B 的,只需留下最终剩余的 0,作为结果。
  • (3)中第二条,表示跳过 1
  • (6)m ≤ n 的情况注意:在(4)中找到0左边的第一个B时会变为start状态,此时指向右边下一个,如果m ≤ n,则和(6)的第一条命令接上,将后面所有1和0变为B,最终结果为0


  • 这里(5)表示 m <= n,相减为 0,将输入带上所有的字符(包括 0)变为 B
  • 这里 (6)表示 m > n,相减为 m - n,将不是 0 的字符变为 B

图灵机的构造技术

图灵机的存储技术☆☆☆☆☆





图灵机的移动技术


右移两个单位:先将第1个和第2个存起来,并将输入带的1 2 个写为 B,后面依次读取存储,并将前一个写入输入带,从而实现右移





图灵机扫描多个符号技术


思考:哪些规则可省略?


P176


P182

可以将输入带上的3个符号当做一个单元,整体进行扫描,但是每次仅将图灵机的读/写头移动一个单元(移动一单元,实际读取 3 个字符,注意有可能输入带上的字符串不是 3 的倍数,所以需要考虑最后的处理过程,如 0BB,11B,01B等情况)


P186

图灵机的多道技术


注意这里补充说明部分:以长度长的操作数为标准,短的操作数前补 B,但是长的操作数是在二道还是一道不确定,所以需要把所有情况都说出来

问过老师后:这里可以增加说明,把长的操作数放入一道,短的放在二道,这样就减少了很多讨论


其中 B 在运算时可以看作 0


只接受,1、4、9、16、25…


  • ( i + 1 ) 2 = i 2 + 2 i + 1 (i + 1)^2 = i^2 + 2i + 1 (i+1)2=i2+2i+1
  • i = 0 i = 0 i=0 i = 1 i = 1 i=1 特殊处理,因为 i = 0 时,三道 1 个 a,二道 0 个 a,当 i = 1 i = 1 i=1 时,三道 3 个 a,二道 1 个 a.
  • 初始时刻,表示 i = 2 i = 2 i=2 的情况,二道 4 个 a ( i ) 2 (i)^2 (i)2,三道 3 个 a ( 2 ( i − 1 ) + 1 ) (2(i-1) + 1) (2(i1)+1)
  • 二道表示的数量为 i 2 i^2 i2 ,三道表示的数量为 ( 2 ( i − 1 ) + 1 ) (2(i-1) + 1) (2(i1)+1),当在三道的基础上添加两个 a,就变成了 ( 2 i + 1 ) (2i + 1) (2i+1),然后将三道的 a 添加到二道后面,二道的数量就变为了 ( i + 1 ) 2 (i + 1)^2 (i+1)2, 后续只需要比较二道与一道是否相等,如果二道比一道多,则拒绝接收,如果二道比一道少,则将三道增加两个 a,并添加到二道上,使得二道变为 ( i + 1 ) 2 (i + 1)^2 (i+1)2,继续与一道进行比较。
  • 实际上不需要特殊处理 0,1,二道表示 i 2 i^2 i2,三道表示 ( 2 i + 1 ) (2i + 1) (2i+1),二道先比较,然后直接加三道,三道再加两个 a

图灵机的查讫技术


这里 [q1, a] 表示 2 前面读到了一个 a,存储起来,去后面找相同的 a


图灵机的子程序技术



初始化程序用于判断,如果 m > 0, n = 0, 结果为 0,m = 0,n > 0,结果也为 0,只有当 m > 0, n > 0 进入主程序 main_start,需要注意 n 的右边用 1 来隔离





注意是因为 n 右边存在一个 1 隔离开,所以没问题

总结

  • 图灵机可能永不停机

存在的问题

上面有正确的
在这里插入图片描述


在这里插入图片描述

  • 第一个问题普通的那种判断图灵机是否接收语言:1 是看是否读完所有的串 ;2 是用一个 accept 状态表示接收,refuse 表示拒绝 。 最终读完后,存储带上的内容可以是全B 可以是保留原来的字符,也可以是其他字符。对的。实际上可以不用refuse状态。
  • 第二个问题利用图灵机计算时,比如两个数的加法运算,存储带上应该保存连续的0作为结果,对的。
  • 第三个问题是多道图灵机,应该提前说明每道代表的什么,然后读写头在初始时只需要文字说明在左端还是右端即可,默认在左端,对的。

图灵机延伸


(1)思路: 记住c最左边的字符,去c最右边找是否相等,相等的字符替换为其他符号。直到比较完两边的所有字符,则接收

x 表示 a 或 b
① 存储 c 最左边的字符,并改写为 #
<start, x, [q0, x], #, R>

② 寻找 c 最右边的字符,改写为 !
<[q0,x], B, [q1, x], B, L>
<[q0,x], x, [q0, x], x, R>
<[q0,x], c, [q0, x], c, R>
<[q0,x], !, [q1, x], !, L>

③ 寻找最左边的字符
<[q1,x], x, [q2, x], !, L>
<[q2,x], c, [q2, x], c, L>
<[q2,x], x, [q2, x], x, L>
<[q2,x], #,start, #, R>

④ w 为空串时处理
<start, c, accept, c, N>


(2)思路: 两道图灵机,初始时二道为 aa,一道存放原始字符串,一道与二道比较,如果二道比一道多,则拒绝接收,如果二道比一道少,则二道的串加倍,再与一道比较。字符加倍的过程为先在后面添加1卡住 (如果题目要求单道,也可以实现,即将第二道的字符串加到第一道后面,并用某个字符隔开,每次对后面加倍,与前面进行比较)

(3)思路: 两道图灵机,初始时二道为 aaa,一道存放原始字符串,一道与二道比较,如果二道比一道多,则拒绝接收,如果二道比一道少,则二道的串增加两次,从而达到3倍,再与一道比较。字符加倍的过程为先在后面添加1卡住


总结

对于文法构造类提问时,只可能按照下述方式提问

  1. 是 RG
  2. 是 CFG,但不是 RG
  3. 是 CSG,但不是 CFG
  4. 是 PSG,但不是 CSG

  1. RG:左边部分只有一个非终结符,右边部分最多只有一个非终结符,且该非终结符只能出现在最右边。(从左往右依次一个一个构建,部分具体情况直接写在开始文法后面)
  2. 是 CFG,但不是 RG:左边部分长度小于等于右边部分长度,且左边部分仅包含单个非终结符。(将 RG 中最右边的非终结符,看能不能放在最左边)
  3. 是 CSG,但不是 CFG:左边的长度小于等于右边,但左边不止一个非终结符。(将 CFG 中左边的某个单个非终结符整体变为两个非终结符,涉及的所有部分均需要更改,注意这个时候可能出现,左边的非终结符长度大于右边的情况,所以将右边仅产生一个终结符的情况,更换为产生两个,漏掉的情况,直接将结果放到开始文法中)
  4. 是 PSG,但不是 CSG:任何文法都可以是 PSG,但只是 PSG 应该 (① 左边的字符长度大于右边。 ② 除了开始文法部分可以含有空串产生式外,其他部分也含有空串产生式)
  5. 注: 由于空串 ε \varepsilon ε 的长度为0,根据文法的定义,含有空串产生式的文法一定不会是 CSG、CFG、RG

对于文法中的空串产生式,假设 S S S为文法开始符号,如果一个文法包含了 S → ε S \to ε Sε,它依然有可能是 1,2,3 型文法 (S不在任何产生式的右边);而如果文法包含一个普通的空串产生式,比如 A → ε A \to ε Aε (A不是S),那么它就只可能是0型文法而不可能是1,2,3型文法。

  • 限制 S 不出现在任何产生式的右部,使得开始符号 S 只负责推导的开始,而不能作为一般的非终结符使用;也即只能够使用1次,只负责产生空句子,而不影响其他句子的产生,也不能够增加其他句子

第二种写法:





  • PDA 只有当栈为空并且字符串字符完,才接收,如果在栈非空,想要接收时,需要单独写接收状态

图灵机构造一进制除法





对比一进制除法运算,只取余数


0 m 1 0 n 0^m10^n 0m10n 转换为一二道存操作数,三道存结果


由于有限自动机对应右线性文法,通过 DFA 来构造文法

如果此题 yyy 这种不满足,则应该如下:







思路: 将连续的 1 进行存储,并变为 ##,第二道增加 0 即可

References

编译原理—混子速成期末保过

第二章 语言和文法——由语言构造文法

第二章 语言和文法

自动机与形式语言复习:文法,DFA,NFA与正则表达式,CFG化简

哈工大2019年春形式语言与自动机期末复习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值