设计DFA

时间:2019-05-30 16:31:10

标签: automata finite-automata dfa automata-theory

解决歧义后,我想为以下语言设计DFA。 我曾想过并尝试了很多,但未能获得正确的答案。

S->aA|aB|lambda
A->aA|aS
B->bB|aB|b

1 个答案:

答案 0 :(得分:0)

我建议首先将NFA视为常规语法,以取得NFA;然后,确定NFA,然后我们可以写下一个与此语法相同但又模棱两可的新语法(由于相同的原因,确定自动机是确定性的)。写下该语法的NFA很容易:形式X -> sY的产生转换为输入X上从状态Y到状态s的转换。同样,X -> lambda形式的转换意味着X是一个接受状态,而X -> b形式的转换意味着一个新的接受状态,该状态转换为无效状态。

我们需要每个非终结符SAB的状态;我们将为每个产品进行过渡。我们的NFA如下所示:

       /---a----\
       |        |
       V        |
----->(S)--a-->(A)<--\
       |        |    |
       a        \--a-/   /--a,b--\
       |                 |       |
       V                 V       |
 /--->(B)--b-->(X)-a,b->(Y)<-----/
 |     |
 \-a,b-/

在这里,状态(S)(X)正在接受,状态(Y)是无效状态(我们并不需要明确地描述它,但请耐心等待)和这个自动机完全等同于语法。现在,我们需要确定这一点。确定的自动机的状态将与非确定版本的状态子集相对应。我们的第一个确定性状态将对应于仅包含(S)的集合,并且我们将找出其他所需的子集(我们最多可以具有32个子集,因为我们有5个状态,而2的5的幂是32 ),使用过渡:

Q               s    Q'
{(S)}           a    {(A),(B)}
{(S)}           b    empty
{(A),(B)}       a    {(A),(B),(S)}
{(A),(B)}       b    {(B),(X)}
{(A),(B),(S)}   a    {(A),(B),(S)}
{(A),(B),(S)}   b    {(B),(X)}
{(B),(X)}       a    {(B),(Y)}
{(B),(X)}       b    {(B),(X),(Y)}
{(B),(Y)}       a    {(B),(Y)}
{(B),(Y)}       b    {(B),(X),(Y)}
{(B),(X),(Y)}   a    {(B),(Y)}
{(B),(X),(Y)}   b    {(B),(X),(Y)}

我们遇到了六个状态,以及一个死状态(empty),我们可以通过q1q6命名为qD。对应于其中具有(S)(X)的子集的所有状态都在接受,并且(S)是初始状态。我们的DFA如下所示:

                  /-a,b-\
                  |     |
                  V     |
----->(q1)--b-->(qD)----/
       |
       a          /--a--\
       |          |     |
       V          V     |
      (q2)--a-->(q3)----/
       |         |
       b         |
       |         b
       V         |
  /--(q4)<------/     /--b--\
  |   |               |     |
  |   \------b------(q6)<---+
  a     /--a----\    |      |
  |     |       |    |      |
  \-->(q5)<-----+--a-/      |
        |                   |
        \---------b---------/

最后,我们可以从DFA中读取明确的常规语法:

(q1) -> a(q2) | b(qD) | lambda
(qD) -> a(qD) | b(qD)
(q2) -> a(q3) | b(q4)
(q3) -> a(q3) | b(q4) | lambda
(q4) -> a(q5) | b(q6) | lambda
(q5) -> a(q5) | b(q6)
(q6) -> a(q5) | b(q6) | lambda