我有一个简单的问题,就是假设给定是DFA的字母集,那么制作一个DFA就能接受所有以双字母(aa,bb)开头或以双字母(aa,bb)结尾的输入。给定的语言。
我试图通过以下方法来解决此问题:
- 生成正则表达式
- 制作相应的NFA
- 使用Powerset构造来推导DFA
- 最小化DFA中的状态数
第1步: 给定问题的正则表达式为(除其他之外):
((aa|bb)(a|b)*)|((a|b)(a|b)*(aa|bb))
步骤2: 给定表达式的NFA为:
(来源:livefilestore.com)
在表格形式中,NFA为:
State Input:a Input:b
->1 2,5 3,5
2 4 -
3 - 4
(4) 4 4
5 5,7 5,6
6 - 8
7 8 -
(8) - -
第3步:使用Powerset结构转换为DFA:
Symbol, State + Symbol, State (Input:a) + Symbol, State (Input:b)
->A, {1} | B, {2,5} | C, {3,5}
B, {2,5} | D, {4,5,7} | E, {5,6}
C, {3,5} | F, {5,7} | G, {4,5,6}
(D), {4,5,7} | H, {4,5,7,8} | G, {4,5,6}
E, {5,6} | F, {5,7} | I, {5,6,8}
F, {5,7} | J, {5,7,8} | E, {5,6}
(G), {4,5,6} | D, {4,5,7} | K, {4,5,6,8}
(H), {4,5,7,8} | H, {4,5,7,8} | G, {4,5,6}
(I), {5,6,8} | F, {5,7} | I, {5,6,8}
(J), {5,7,8} | J, {5,7,8} | E, {5,6}
(K), {4,5,6,8} + D, {4,5,7} + K, {4,5,6,8}
步骤4:最小化DFA:
我先更改了K-> G,J-> F,I-> E。在下一次迭代中,H-> D和E-> F。因此,最终表为:
State + Input:a + Input:b
->A | B | C
B | D | E
C | E | D
(D) | D | D
(E) | E | E
从图表上看,它看起来像:
(来源:livefilestore.com)
...这不是必需的DFA!我对结果进行了三重检查。那么,我哪里出错了?
注意:
- -> =初始状态
- ()=最终状态
3
这是已经提出的基本问题的一个很好的例子,因为您包括了整个思路。
—
拉斐尔
非常感谢,谢谢!^^
—
Anurag Kalia