实验二:子集构造法¶
背景¶
为了证明 DFA 和 NFA 的等价性,我们学习了子集构造法,这种方法模拟了 NFA 接受任意串时的搜索过程(类似于 BFS)。
首先回忆一下 DFA、NFA 和 ε-NFA 的定义:
在修改的子集构造法中,我们需要从 q0 的 ε-闭包,即空串所能够到达的状态集合出发,考察每一个可达状态集接受任意 Σ 中字符的转移,具体而言,状态集 S 接受字符 a 后转移到的集合应为 ECLOSE({ x | x ∈ δ(q, a), q ∈ S })。如果状态集中有终态,则表明存在一条 ε-NFA 中的路径,使得接受字符串以后可以到达终态,此 ε-NFA 可以接受此字符串,于是其对应的 DFA 状态也应是终态,否则是非终态。
对于状态及其转移的遍历,使用 BFS 或 DFS 均可。
任务¶
你需要将homework/lib_char.h中的
// #include "subset-construction/subset_construction.h"
取消注释,然后完成homework/subset-construction/subset_construction.h中的TODO,将传入的 ε-NFA 转换为等价的 DFA,使项目通过CI/CD。
注意:不管 DFA 状态的可达性,直接构造状态数目为 2n 的 DFA 在时空复杂度上是不可接受的,应当只构造出那些可达的状态。
作者:


