确定的有穷自动机DFA
确定的有穷自动机(DFA)¶
- 具有有穷个状态,不同的状态代表不同的意义。按照实际的需要,可以在不同的状态间转换
- 将输入字符串中的字符汇集在一起构成一个字母表。处理的所有字符串都是该字母表上的字符串
- 在任一状态下,从输入字符串中读入一个字符,根据当前状态和读入的这个字符转到新的状态
- 有一个开始状态
- 有一些终止(或接受)状态,表示到目前为止所读入的字符构成的字符串是语言的一个句子
组成结构¶
- \(Q\): 有穷状态集
- \(\Sigma\): 有穷输入符号集或字母表
- \(\delta\): \(Q\times \Sigma\to Q\)状态转移函数
- \(q_0\in Q\): 初始状态
- \(F\subseteq Q\): 终结状态集或接受状态集
例:用DFA表示电视遥控开关
- 字母表\(\Sigma=\{p\}\),p——按开关键
- 有穷状态集\(Q\)
- 电视关(\(q_0\))
- 电视开(\(q_1\))
- 状态转移函数\(\delta\)
\[\delta(q_0,p)=q1,\delta(q_1,p)=q_0\]
例:设计DFA,在任何由0和1组成的字符串中,接受含有01子串的全部串
- 字母表\(\Sigma=\{0,1\}\)
- 有穷状态集\(Q\)
- 初始状态\(q_0\):还没有看到0
- \(q_1\):已经看到了0
- \(q_2\):已经看到了01
- 状态转移函数
\[\delta(q_0,0)=q_1,\delta(q_1,1)=q_2,\delta(q_2,0)=q_2\]
\[\delta(q_0,1)=q_0,\delta(q_1,0)=q_1,\delta(q_2,0)=q_2\]
DFA设计方法¶
法一
-
从初始状态开始,对每个状态,依次确定每个字符作为输入时,可能到达的状态:
- 如果到达的状态是之前已出现的状态,建立当前状态到应到达状态的边;
- 如果到达的状态是之前未出现的状态,增加新的状态,建立当前状态到新增状态的边
-
确定终止状态
法二
- 从初始状态开始,重点关注可以到达结束状态的路径,然后对每个节点补充其他字符作为输入时的边和状态
例:若\(\Sigma=\{0,1\}\),给出接受全部含有偶数个0和偶数个1的串的DFA
例:设计DFA接收以下语言
\[L=\{x|x\in \{0,1\}^* \wedge x中至少包含一个子串010\}\]
扩展转移函数¶
扩展状态转移函数\(\delta\)到字符串,定义扩展转移函数\(\hat{\delta}\):
\[\hat{\delta}(q,w)=\begin{cases}q&w=\epsilon\\\delta(\hat{\delta}(q,x),a)&w=xa\end{cases}\]
上式中\(a\)是一个字符,\(w\)和\(x\)是字符串
例:接受全部含有01子串的DFA,\(\hat{\delta}处理串0101的过程\)
DFA语言与正则语言¶
若\(D=(Q,\Sigma,\delta,q_0,F)\)是一个DFA,则\(D\)接受的语言为
\[L(D)=\{w\in \Sigma^*|\hat{\delta}(q_0,w)\in F\}\]
即所有能使DFA从开始状态到达接受状态的符号串集合
如果语言\(L\)是某个DFA \(D\)的语言,则称其为正则语言
有限字符串对应的语言是正则语言
\(\Phi\),\(\{\epsilon\}\)都是正则语言,状态转移图如下