【发布时间】:2019-05-21 22:34:55
【问题描述】:
问题)Σ={a,b},NFA如下图所示:
我为 nfa 和 dfa 做了一个转换表,但不知道 q2 应该去哪里,要么是 q0,要么是创建一个新的状态,称为 q4
【问题讨论】:
问题)Σ={a,b},NFA如下图所示:
我为 nfa 和 dfa 做了一个转换表,但不知道 q2 应该去哪里,要么是 q0,要么是创建一个新的状态,称为 q4
【问题讨论】:
通过将 NFA 状态的子集视为相应 DFA 的潜在状态,我们可以使用子集或幂集构造从 NFA 到 DFA。我们的 DFA 的初始状态将是 {q0},这意味着在读取任何输入之前只能达到 q0。从 {q0} 读取 a 后,我们可以通过消耗 a 到达 q2,然后通过 lambda-transition 再次到达 q0。因此,f({q0}, a) = {q0, q2}。在 {q0} 中读取 b 后,我们只能转到 q1;所以 f({q0}, b) = {q1}。
我们在需要转换的 DFA 中引入了两个新状态,{q0, q2} 和 {q1}。稍加思考就会发现 {q0, q2} 具有与 {q0} 完全相同的转换。在输入 a 时,q1 可以转到 q1、q2 或 q0(通过 q2);在输入 b 上,它可以转到 q2 或 q0(通过 q2)。因此,f({q1}, a) = {q0, q1, q2} 和 f({q1}, b) = {q0, q2}。
我们已经看到 {q0, q2} 并且知道它的转换。但是,我们现在需要 {q0, q1, q2} 的转换。似乎在输入 a 上,NFA 的所有状态都可以从某个状态到达;输入 b 也是如此。所以,f({q0, q1, q2}, a) = {q0, q1, q2} 和 f({q0, q1, q2}, b) = {q0, q1, q2}。
我们没有在此迭代中引入任何新状态,因此我们拥有 DFA 中可能需要的所有状态。我们的 DFA 如下所示:
q s q'
{q0} a {q0, q2}
{q0} b {q1}
{q0, q2} a {q0, q2}
{q0, q2} b {q1}
{q1} a {q0, q1, q2}
{q1} b {q0, q2}
{q0, q1, q2} a {q0, q1, q2}
{q0, q1, q2} b {q0, q1, q2}
除了 {q1} 之外的所有状态都在接受,因为它们都包含来自 NFA 的接受状态 q0。现在,在我们最小化这个 DFA 之前,让我们重命名状态:
qA = {q0}
qB = {q0, q2}
qC = {q1}
qD = {q0, q1, q2}
我们可以迭代地划掉不能组合的状态对,如下所示:
qA,qB qA,qC qA,qD qB,qC qB,qD qC,qD
--------------------------------------------------
1. xxxxx xxxxx xxxxx
Reason: qC cannot be combined with others since it is
not accepting and the others are
2. xxxxx xxxxxx
Reason: f((qA, qD), b) and f((qB, qD), b) equal (qC, qD)
which was crossed off during the last iteration.
qA,qB cannot be crossed off, so these states can be
combined in a minimal DFA.
得到的最小 DFA 为:
q s q'
qAB a qAB
qAB b qC
qC a qD
qC b qAB
qD a qD
qD b qD
【讨论】: