问题描述
我一直在尝试解决这个问题,因为这是一项大学作业。我需要为上述问题构建一个 DFA 和一个 NFA。到目前为止,我已经能够解决 DFA,但经过多次尝试,找不到适合 NFA 的解决方案。
我的 DFA 针对上面提供的语言的解决方案:
我对 NFA 的尝试如下。我为我乱七八糟的笔迹道歉,但这些只是我在旅途中绘制的粗略作品。
我的第一次尝试:
我的第二次尝试:
我的第三次尝试:
解决方法
只有三个词,所以只需为您的 NFA 制作三个平行路径,使用如下所示的转换函数:
输入状态 | 输入符号 | 输出状态 |
---|---|---|
[开始] | 一 | [a.b],[a.bb] |
[开始] | b | [b.aa] |
[a.b] | b | [ab#] |
[a.bb] | b | [ab.b] |
[ab.b] | b | [abb#] |
[b.aa] | 一 | [ba.a] |
[ba.a] | 一 | [baa#] |
此处,状态名称在方括号 ([..]) 中,以“#”结尾的状态名称是终结符。
通常认为制作 NFA 比制作 DFA 更容易,因此通常的方法是先制作 NFA,然后通过将多个输出状态更改为单个中间状态来修改 NFA 制作 DFA。
如果您对上述 NFA 遵循此方法,则生成的 DFA 将如下所示(我在中间状态名称后附加了“*”):
输入状态 | 输入符号 | 输出状态 |
---|---|---|
[开始] | 一 | [a.b*] |
[开始] | b | [b.aa] |
[a.b*] | b | [ab.*] |
[ab.*] | (e) | [ab#] |
[ab.*] | b | [abb.*] |
[abb.*] | (e) | [abb#] |
[b.aa] | 一 | [ba.a] |
[ba.a] | 一 | [baa#] |
我对所有空符号/输入结束转换到终止状态有点松散。如果您需要我填写所有内容,我可以这样做。