视频加载失败

课程

7665 字
约 22 分钟

第三章 课后作业参考答案

编译原理exercises/homework·更新于 2026-09-15

第三章 课后作业参考答案


6. 令 AABBCC 是任意正规式,证明以下关系成立。

(1) AA=AA \mid A = A (2) (A)=A(A^*)^* = A^* (3) A=εAAA^* = \varepsilon \mid A A^* (4) (AB)A=A(BA)(AB)^*A = A(BA)^* (5) A=baAA = b \mid aA 当且仅当 A=abA = a^*b

解答(1) 证明 AA=AA \mid A = A: 根据正规式并集运算对应的集合定义,有: L(AA)=L(A)L(A)=L(A)L(A \mid A) = L(A) \cup L(A) = L(A)AA=AA \mid A = A 成立。

(2) 证明 (A)=A(A^*)^* = A^*: 由克林闭包运算定义,对于任意集合 SS,其闭包为 S=i=0SiS^* = \bigcup_{i=0}^{\infty} S^i。 则有: L(A)=i=0L(A)iL(A^*) = \bigcup_{i=0}^{\infty} L(A)^i L((A))=j=0L(A)j=j=0(i=0L(A)i)jL((A^*)^*) = \bigcup_{j=0}^{\infty} L(A^*)^j = \bigcup_{j=0}^{\infty} \left( \bigcup_{i=0}^{\infty} L(A)^i \right)^j 因为上式中右侧项表示对 L(A)L(A) 的任意有限次、无限次连接与并集,而这与 L(A)L(A^*) 中所包含的元素集合范围完全一致(均由 ε\varepsilon 以及由 L(A)L(A) 中元素连接而成的有限长字串组成),因此两集合相等: L((A))=L(A)L((A^*)^*) = L(A^*)(A)=A(A^*)^* = A^* 成立。

(3) 证明 A=εAAA^* = \varepsilon \mid A A^*: 展开克林闭包 L(A)L(A^*)

L(A)={ε}L(A)L(A)2L(A)3={ε}L(A)({ε}L(A)L(A)2)={ε}L(A)L(A)=L(εAA)\begin{aligned} L(A^*) &= \{\varepsilon\} \cup L(A) \cup L(A)^2 \cup L(A)^3 \cup \dots \\ &= \{\varepsilon\} \cup L(A) \left( \{\varepsilon\} \cup L(A) \cup L(A)^2 \cup \dots \right) \\ &= \{\varepsilon\} \cup L(A) L(A^*) \\ &= L(\varepsilon \mid A A^*) \end{aligned}

A=εAAA^* = \varepsilon \mid A A^* 成立。

(4) 证明 (AB)A=A(BA)(AB)^*A = A(BA)^*: 展开左侧正规式表示的集合:

L((AB)A)=(i=0(L(A)L(B))i)L(A)={ε,AB,ABAB,ABABAB,}L(A)={A,ABA,ABABA,ABABABA,}\begin{aligned} L((AB)^*A) &= \left( \bigcup_{i=0}^{\infty} (L(A)L(B))^i \right) L(A) \\ &= \{ \varepsilon, AB, ABAB, ABABAB, \dots \} L(A) \\ &= \{ A, ABA, ABABA, ABABABA, \dots \} \end{aligned}

展开右侧正规式表示的集合:

L(A(BA))=L(A)(i=0(L(B)L(A))i)=L(A){ε,BA,BABA,BABABA,}={A,ABA,ABABA,ABABABA,}\begin{aligned} L(A(BA)^*) &= L(A) \left( \bigcup_{i=0}^{\infty} (L(B)L(A))^i \right) \\ &= L(A) \{ \varepsilon, BA, BABA, BABABA, \dots \} \\ &= \{ A, ABA, ABABA, ABABABA, \dots \} \end{aligned}

显然两边集合完全一致,故 (AB)A=A(BA)(AB)^*A = A(BA)^* 成立。

(5) 证明 A=baAA = b \mid aA 当且仅当 A=abA = a^*b

  • 充分性(若 A=abA = a^*b,则满足等式): 将 A=abA = a^*b 带入右式中: baA=ba(ab)=(εaa)b\begin{aligned} b \mid aA &= b \mid a(a^*b) \\ &= (\varepsilon \mid a a^*) b \end{aligned} 由题(3)已证结论知 εaa=a\varepsilon \mid a a^* = a^*,带入后有: (εaa)b=ab=A(\varepsilon \mid a a^*) b = a^*b = A 等式成立。
  • 必要性(若 A=baAA = b \mid aA,在 εL(a)\varepsilon \notin L(a) 的前提下其唯一解为 aba^*b): 根据 Arden 引理(Arden’s Lemma),对于集合方程 X=AXBX = AX \cup B,如果空字 εL(A)\varepsilon \notin L(A),则该方程有唯一的代数解 X=ABX = A^*B。因此当 εL(a)\varepsilon \notin L(a) 时,A=abA = a^*bA=baAA = b \mid aA 的唯一解。

7. 构造下列正规式相应的 DFA。

(1) 1(01)1011(0 \mid 1)^*101 (2) 01010100^*10^*10^*10^* (原书标注为第3问)

解答

(1) 对于正规式 1(01)1011(0 \mid 1)^*101

(该 DFA 的子集构造法详细步骤可见课本大题-答案

  • DFA 状态转移表
状态输入 00输入 11是否接受
AA (初态)AABB
BBCCBB
CCAADD
DD (终态)CCBB
  • DFA 状态图
stateDiagram-v2
    [*] --> A
    A --> A : 0
    A --> B : 1
    B --> B : 1
    B --> C : 0
    C --> A : 0
    C --> D : 1
    D --> B : 1
    D --> C : 0
    classDef accept fill:#f9f,stroke:#333,stroke-width:2px;
    class D accept;

(2) 对于正规式 01010100^*10^*10^*10^*

该语言的特征是:包含恰好三个字符 11,且在这三个 11 之间和前后允许填充任意多个 00

  • DFA 状态定义

    • S0S_0:已匹配 0011(初态)。
    • S1S_1:已匹配 1111
    • S2S_2:已匹配 2211
    • S3S_3:已匹配 3311(终态/接受状态)。
    • S4S_4:已匹配多于 3311(死状态,任何输入均无法再接受)。
  • 状态转移关系

    • δ(S0,0)=S0\delta(S_0, 0) = S_0δ(S0,1)=S1\delta(S_0, 1) = S_1
    • δ(S1,0)=S1\delta(S_1, 0) = S_1δ(S1,1)=S2\delta(S_1, 1) = S_2
    • δ(S2,0)=S2\delta(S_2, 0) = S_2δ(S2,1)=S3\delta(S_2, 1) = S_3
    • δ(S3,0)=S3\delta(S_3, 0) = S_3δ(S3,1)=S4\delta(S_3, 1) = S_4
    • δ(S4,0)=S4\delta(S_4, 0) = S_4δ(S4,1)=S4\delta(S_4, 1) = S_4
stateDiagram-v2
    [*] --> S0
    S0 --> S0 : 0
    S0 --> S1 : 1
    S1 --> S1 : 0
    S1 --> S2 : 1
    S2 --> S2 : 0
    S2 --> S3 : 1
    S3 --> S3 : 0
    S3 --> S4 : 1
    S4 --> S4 : 0, 1
    classDef accept fill:#f9f,stroke:#333,stroke-width:2px;
    class S3 accept;

8. 给出下面正规表达式。

(1) 以 01 结尾的二进制数串。 (2) 能被 55 整除的十进制整数。 (3) 包含奇数个 11 或奇数个 00 的二进制数串。

解答: (1) 01 结尾的二进制数串(01)01(0 \mid 1)^*01

(2) 能被 55 整除的十进制整数: 考虑到不应有前导零,可以独立表示整数 00,首位非零的其他以 0055 结尾的数字串: 0(123456789)(0123456789)(05)0 \mid (1 \mid 2 \mid 3 \mid 4 \mid 5 \mid 6 \mid 7 \mid 8 \mid 9)(0 \mid 1 \mid 2 \mid 3 \mid 4 \mid 5 \mid 6 \mid 7 \mid 8 \mid 9)^*(0 \mid 5)

(3) 包含奇数个 11 或奇数个 00 的二进制数串

  • 奇数个 11 的表示式(00 任意):(0101)10(0 \mid 10^*1)^*10^*
  • 奇数个 00 的表示式(11 任意):(1010)01(1 \mid 01^*0)^*01^*
  • 求两者并集: (0101)10(1010)01(0 \mid 10^*1)^*10^* \mid (1 \mid 01^*0)^*01^*

9. 对下面情况给出 DFA 及正规表达式。

(1) {0,1}\{0,1\} 上包含子串 010 的所有串。

解答

  • 正规表达式(01)010(01)(0 \mid 1)^*010(0 \mid 1)^*

  • DFA 状态与转移关系

    • AA:初态,表示目前没有匹配子串前缀。
    • BB:已匹配到前缀 0
    • CC:已匹配到前缀 01
    • DD:已完全匹配 010,为终态/接受状态。
  • DFA 转移表

状态输入 00输入 11是否接受
AA (初态)BBAA
BBBBCC
CCDDAA
DD (终态)DDDD
  • DFA 状态图
stateDiagram-v2
    [*] --> A
    A --> A : 1
    A --> B : 0
    B --> B : 0
    B --> C : 1
    C --> A : 1
    C --> D : 0
    D --> D : 0, 1
    classDef accept fill:#f9f,stroke:#333,stroke-width:2px;
    class D accept;

12. 将下面的有限自动机分别确定化和最小化。

(a) 需确定化的有限自动机。 (b) 需最小化的有限自动机。

解答

(a) 有限自动机确定化与最少化过程

原 NFA 转移表(初态与接受状态均为 00):

  • δ(0,a)={0,1}\delta(0, a) = \{0, 1\}
  • δ(0,b)={1}\delta(0, b) = \{1\}
  • δ(1,a)={0}\delta(1, a) = \{0\}
  • δ(1,b)=\delta(1, b) = \emptyset

子集确定化步骤

  1. 初态集A=[0]A = [0] (由于包含原终态 00,为接受状态)
  2. 求转移关系
    • move(A,a)=δ(0,a)=[0,1]=B\text{move}(A, a) = \delta(0, a) = [0, 1] = B (接受状态)
    • move(A,b)=δ(0,b)=[1]=C\text{move}(A, b) = \delta(0, b) = [1] = C (非接受状态)
  3. 对子集 B=[0,1]B = [0, 1] 计算
    • move(B,a)=δ(0,a)δ(1,a)={0,1}{0}=[0,1]=B\text{move}(B, a) = \delta(0, a) \cup \delta(1, a) = \{0, 1\} \cup \{0\} = [0, 1] = B
    • move(B,b)=δ(0,b)δ(1,b)={1}=[1]=C\text{move}(B, b) = \delta(0, b) \cup \delta(1, b) = \{1\} \cup \emptyset = [1] = C
  4. 对子集 C=[1]C = [1] 计算
    • move(C,a)=δ(1,a)=[0]=A\text{move}(C, a) = \delta(1, a) = [0] = A
    • move(C,b)=δ(1,b)==Φ\text{move}(C, b) = \delta(1, b) = \emptyset = \Phi (死状态/空集)
  5. 死状态 Φ\Phi 计算
    • move(Φ,a)=Φ\text{move}(\Phi, a) = \Phimove(Φ,b)=Φ\text{move}(\Phi, b) = \Phi

确定化后的转移表

确定化状态对应子集输入 aa输入 bb是否接受
AA (初态){0}\{0\}BBCC
BB{0,1}\{0, 1\}BBCC
CC{1}\{1\}AAΦ\Phi
Φ\Phi\emptysetΦ\PhiΦ\Phi

进行状态最小化(最少化)

  1. 初始划分
    • 接受状态组:S1={A,B}S_1 = \{A, B\}
    • 非接受状态组:S2={C,Φ}S_2 = \{C, \Phi\}
  2. 检查 S1={A,B}S_1 = \{A, B\} 的等价性
    • 输入 aaAaBS1A \xrightarrow{a} B \in S_1BaBS1B \xrightarrow{a} B \in S_1 (同组)
    • 输入 bbAbCS2A \xrightarrow{b} C \in S_2BbCS2B \xrightarrow{b} C \in S_2 (同组)
    • 因此 AABB 等价,可以合并,记为状态 ABAB(接受状态,也是初态)。
  3. 检查 S2={C,Φ}S_2 = \{C, \Phi\} 的等价性
    • 输入 aaCaAS1C \xrightarrow{a} A \in S_1,而 ΦaΦS2\Phi \xrightarrow{a} \Phi \in S_2 (分属不同组)
    • 因此 CCΦ\Phi 不等价,必须拆分。
  4. 最终化简状态集为:{AB,C,Φ}\{AB, C, \Phi\}

最小化后的 DFA 转移图

stateDiagram-v2
    [*] --> AB
    AB --> AB : a
    AB --> C : b
    C --> AB : a
    C --> phi : b
    phi --> phi : a, b
    classDef accept fill:#f9f,stroke:#333,stroke-width:2px;
    class AB accept;

(b) 有限自动机最小化过程

原 DFA 状态集 S={0,1,2,3,4,5}S = \{0, 1, 2, 3, 4, 5\},初态为 00,接受状态集为 F={0,1}F = \{0, 1\}

  1. 初始划分为两个子集

    • 接受状态集:S1={0,1}S_1 = \{0, 1\}
    • 非接受状态集:S2={2,3,4,5}S_2 = \{2, 3, 4, 5\}
  2. 分析划分 S2={2,3,4,5}S_2 = \{2, 3, 4, 5\}

    • 考察对输入 aa 的转移:
      • δ(2,a)=1S1\delta(2, a) = 1 \in S_1
      • δ(3,a)=3S2\delta(3, a) = 3 \in S_2
      • δ(4,a)=0S1\delta(4, a) = 0 \in S_1
      • δ(5,a)=5S2\delta(5, a) = 5 \in S_2
    • 由于 {2,4}\{2, 4\} 转移到 S1S_1,而 {3,5}\{3, 5\} 转移到 S2S_2,原集合拆分为: P1={{0,1},{2,4},{3,5}}P_1 = \{ \{0, 1\}, \{2, 4\}, \{3, 5\} \}
  3. 分析 P1P_1 中的各个子集

    • 检查子集 {0,1}\{0, 1\}
      • 输入 aaδ(0,a)=1{0,1}\delta(0, a) = 1 \in \{0, 1\}δ(1,a)=1{0,1}\delta(1, a) = 1 \in \{0, 1\}
      • 输入 bbδ(0,b)=2{2,4}\delta(0, b) = 2 \in \{2, 4\}δ(1,b)=4{2,4}\delta(1, b) = 4 \in \{2, 4\}
      • 因为转移目标落在相同分组内,所以 0011 等价。记作状态 A={0,1}A = \{0, 1\}
    • 检查子集 {2,4}\{2, 4\}
      • 输入 aaδ(2,a)=1{0,1}\delta(2, a) = 1 \in \{0, 1\}δ(4,a)=0{0,1}\delta(4, a) = 0 \in \{0, 1\}
      • 输入 bbδ(2,b)=3{3,5}\delta(2, b) = 3 \in \{3, 5\}δ(4,b)=5{3,5}\delta(4, b) = 5 \in \{3, 5\}
      • 因为转移目标落在相同分组内,所以 2244 等价。记作状态 B={2,4}B = \{2, 4\}
    • 检查子集 {3,5}\{3, 5\}
      • 输入 aaδ(3,a)=3{3,5}\delta(3, a) = 3 \in \{3, 5\}δ(5,a)=5{3,5}\delta(5, a) = 5 \in \{3, 5\}
      • 输入 bbδ(3,b)=2{2,4}\delta(3, b) = 2 \in \{2, 4\}δ(5,b)=4{2,4}\delta(5, b) = 4 \in \{2, 4\}
      • 因为转移目标落在相同分组内,所以 3355 等价。记作状态 C={3,5}C = \{3, 5\}
  4. 划分收敛,最终最小化状态集为 {A,B,C}\{A, B, C\}

    • AA (接受状态,包含原初态 00,为新初态)
    • BB (非接受状态)
    • CC (非接受状态)

最小化后的 DFA 转移图

stateDiagram-v2
    [*] --> A
    A --> A : a
    A --> B : b
    B --> A : a
    B --> C : b
    C --> C : a
    C --> B : b
    classDef accept fill:#f9f,stroke:#333,stroke-width:2px;
    class A accept;
Profile Image of the Author
Sonder
好想要技术
这是公告标题
这只是一个公告
分类
标签
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.16.7
文章许可
CC BY-NC-SA 4.0
文章目录