由 1 的 NFA 分隔的一对零?

Pair of Zeros separated by 1's NFA?

我正在研究一种语言 L = { 每对零由长度为 4i 的 1 分隔,i>=0 }

例如110011110 应该被接受,因为前两个零之间没有任何分隔。然后下一对被4个分开。

这是我对 NFA 的尝试,还有什么遗漏吗?

我们可以直接使用 Myhill-Nerode 来为这种语言推导出一个最小的 DFA。推理很简单。

  1. e,空字符串,可以跟在L中的任意字符串,得到L中的字符串。
  2. 0 可以后跟 1* 或 (1^4i)L 以获得 L 中的字符串。
  3. 1后面可以跟L,得到L中的字符串。这意味着它与空字符串没有区别。这也意味着我们不需要担心以 1 开头的较长字符串,因为它们将被不以 1 开头的较短字符串覆盖。
  4. 00 后面可以跟 0 一样的东西,所以没区别。这也意味着我们无需担心以 00 开头的较长字符串,因为它们由不以 00 开头的较短字符串处理。
  5. 01 后面可以跟 1* 或 111(1^4i)L 得到 L 中的字符串。
  6. 10、11以1开头可以忽略(见3)
  7. 000、001可以忽略,因为它们都是00开头的(见4)
  8. 010 后面不能跟任何东西来得到 L 中的字符串。我们也可以忽略以此开头的任何东西,因为它不能导致 L 中的字符串。
  9. 011 后面可以跟 1* 或 11(1^4i)L 得到 L 中的字符串。
  10. 100, 101, 110, 111 可以忽略,因为它们以 1 开头(见 3)
  11. 0000、0001、0010、0011可以忽略,因为它们都是以00开头的(见4)
  12. 0100、0101可以忽略,因为它们都是以010开头的(见8)
  13. 0110 后面不能跟任何内容以获取 L 中的字符串,因此与 010 无法区分。
  14. 0111后面可以跟1*或1(1^4i)L得到L中的字符串。
  15. 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111都可以忽略,因为都是1开头(见3)
  16. 唯一可以区别于较短字符串的长度为 4 的字符串是 0111; 01110 与 010 没有区别,因为没有任何东西将它引向 L 中的字符串,而 01111 与 0 没有区别,因为它可以后跟 1* 或 (1^4i)L 以得到 L 中的某些内容。

这看起来工作量很大,但实际上是一个非常简单的练习。我们可以返回并列出我们完整的最短长度可区分字符串集:

  1. e,从上面的第 1 点开始
  2. 0,从上面的第 2 点开始
  3. 01,来自上面第 5 行
  4. 010,从上面第 8 点开始
  5. 011,从上面第 9 点开始
  6. 0111,从上面第 14 点开始

要写下 DFA,我们需要为这些最短长度的可区分字符串中的每一个提供一个状态。从对应于字符串 x 的状态的转换将导致对应于通过将输入符号连接到 x 形成的字符串的状态。所以:

            ___________________________
            |                         ^
        0   V  1       1        1     | 1
--->(e)--->(0)--->(01)--->(011)--->(0111)
    \_/    \_/      | 0     | 0       | 0
     1      0       |       V         V
                    |<-----------------
                    V
                    (010)
                    \___/
                     0,1
  1. e为初始状态
  2. e 的状态在 1 上循环到自身,因为 e.1 = 1 并且 1 与 e 没有区别。无法区分的字符串导致最小 DFA 中的相同状态。
  3. e 的状态在 0 上进入 0 的状态,因为 e.0 = 0 并且 0 与所有长度相同或更短的字符串是可区分的。
  4. 状态 0 导致状态 01 导致状态 011 在 1 上导致状态 0111,因为 0111 = 011.1 = 01.1.1 = 0.1.1.1 并且这些都可以与相同或更短长度的字符串区分开来。
  5. 0111 在 1 上导致 0,因为 0111.1 = 01111 与 0 没有区别。
  6. 状态 0、01、011 和 0111 在 0 上导致状态 010,因为 0.0 = 00、01.0 = 010、011.0 = 0110 和 0111.0 = 01110 与 010 没有区别。
  7. 010 在所有输入上都指向自身,因为无法向其添加任何内容以获得 L 中的字符串,因此对于在前面与此进行任何连接也是如此。

现在我们有了结构,我们只需要查看每个状态并判断其规范字符串是否在 L 中。如果是,则该状态正在接受;否则就不是。

  1. e 在 L 中,所以 (e) 正在接受。
  2. 0 在 L 中,所以 (0) 正在接受。
  3. 01 在 L,所以 (01) 正在接受。
  4. 010 在 L 中,所以 (010) 不接受。
  5. 011 在 L 中,所以 (011) 正在接受。
  6. 0111 在 L,所以 (0111) 正在接受。

这样就完成了L的最小DFA的推导。