实验三:DFA 的最小化¶
背景¶
课堂上介绍了一种 DFA 最小化的算法:填表算法。填表算法递归地标记可区别的状态偶对,直到在一轮检查中没有再找到新的可区别状态偶对。
填表算法首先在初始化时将每对终态与非终态标记为可区别的,然后在一轮检查中检查所有不可区别的状态偶对 (r, s),如果状态 r 和 s 通过某个输入符号 a 可分别转移到 p 和 q,δ(r, a)=p,δ(s, a)=q,且 p 和 q 已标记为可区别的,则 r 和 s 也标记为可区别的。如果在一轮检查中没有新标记的可区别状态偶对,则结束填表,并根据填表结果划分状态的等价类,作为最小化的 DFA 的状态,也就是将原 DFA 的状态集合映射到新 DFA 的状态上,并保持状态转移与原 DFA 相符。这样,我们就得到了与原 DFA 等价的、最小化的 DFA。
有这样的一个结论:接受同一正规语言的最小化的 DFA 相互同构,即这些 DFA 在重新命名状态后是相同的 DFA。
任务¶
你需要将homework/lib_char.h中的
// #include "DFA-minimization/minimization.h"
取消注释,然后完成homework/DFA-minimization/minimization.h中的TODO,将传入的 DFA 最小化,使项目通过CI/CD。
思考题目¶
-
试证明:接受同一正规语言的最小化的 DFA 相互同构。
-
基于本课程的实验,提出一种可以判定任意两个正规表达式是否等价的算法。
作者: