automata - 将接受具有奇数个 1's and odd number of 0' 的字符串的 DFA

标签 automata dfa

我想要 DFA 生成,它将接受具有奇数个 1 和奇数个 0 的字符串。

最佳答案

首先,让我们构建一个接受奇数 0 的 DFA。我们至少需要一个状态,否则我们不能接受任何东西。该状态不能接受,因为空字符串引导到那里并且空字符串没有奇数 0。因此,我们至少需要两个状态 - 一个不接受的初始状态和一个接受状态。我们需要更多吗?

为了回答这个问题,让我们开始填充过渡,看看我们得到了什么。必须有一个起源于接受状态的转换。它去哪儿了?如果它自己去,那么我们不接受字符串 0,它有一个奇数(一个)0。所以我们需要在初始状态下在 0 上去到某个接受状态。我们恰好已经有了接受状态;我们去那里吧。

接下来,我们必须从接受状态进行转换。如果我们返回接受状态,我们将接受字符串 00,所以我们不能那样做。我们必须过渡到一些不接受的状态。我们已经有了一个不接受的状态——我们的初始状态——所以这个选择可能会奏效。或者,如果没有,我们必须引入一个新状态。让我们首先考虑返回到初始状态是否有效,因为在这种情况下我们就完成了。

我们已经推断出字符串 0 和 00 的处理是正确的。从那时起,000将被正确处理,因为我们在随后的0上从初始状态返回到接受状态;实际上,我们在 0^2k 处返回到初始状态,在 0^(2k+1) 处返回到接受状态,因为 k >= 0。因此,这个 DFA 对于 0 的奇数串的语言是正确的。图表看起来像:

        /---0----\
        |        |
        V        |
----->(q0)--0-->(q1)

通过改变标签,我们可以得到一个自动机,用于表示 1 的奇数串的语言:

        /---1----\
        |        |
        V        |
----->(q2)--1-->(q3)

要让自动机接受包含奇数 0 和 1 的字符串,想象一下同时运行两个自动机:每当我们看到 0 时,我们将它传递给第一个,每当我们看到 1 时,我们将它传递给第一个第二个。然后,如果两个自动机最终都处于接受状态,我们就接受。我们可以通过将第一个和第二个自动机的所有四对状态视为一个新的组合自动机的状态来表示两个自动机的组合状态,其转换图如下所示:

          /----0----\
          |         |
          V         |
----->(q0,q2)--0-->(q1,q2)
       ^  |         ^  |
       |  1         |  1
       1  |         1  |
       |  V         |  V
      (q0,q3)--0-->(q1,q3)
          ^         |
          |         |
          \----0----/

这些是关于语言正则性的 Myhill-Nerode 定理和正则语言交集的笛卡尔积机构造背后的直觉。

关于automata - 将接受具有奇数个 1's and odd number of 0' 的字符串的 DFA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55624588/

相关文章:

infinite - 表明语言是无限的

regex - 正则表达式转 DFA

prolog - 在没有算术的情况下识别 Prolog 中的 A^n B^n 语言

state-machine - 堆栈大小受限的 PDA 接受哪些类型的语言?

python - 将某种 XML/Json 文件编译成 Graphiz/有限状态自动机。有什么建议么?

regex - 回复 : Number of a's is divisible by 6 and Number of b's is divisible by 8

dfa - 我似乎无法为这种语言创建 DFA

lisp - LISP 中的 NFA 识别器

automata - 将 NFA 转换为 DFA

prolog - 我无法理解 Prolog 如何知道 DFA 接受规则中的开始状态