NFA接受以下语言

NFA to accept the following language

我需要构建一个 NFA(或 DFA)来识别以下语言: L = {w | w mod 3 = 1}。 所以我尝试的方法是让 NFA 识别可被 3 整除的数字,然后将它们加 1,但这种方法比看起来要难得多(如果不是不可能的话?)。 我只设法做了一个 NFA 来识别可被 3 整除的数字。

我假设 w 被解释为非负整数的十进制表示形式(不带前导零)。

鉴于此,我们可以使用 Myhill-Nerode 来迭代确定我们需要的状态:

  1. 空字符串后面可以跟 L 中的任何字符串以得到 L 中的字符串。我们将此 [e] 称为等价 class。请注意,此等价 class 对应于 L 的最小 DFA 的初始状态(如果存在的话)。另请注意,初始状态不接受,因为空字符串不是非负整数的有效十进制表示形式。

  2. 字符串0后面不能跟任何东西得到L中的字符串;它导致对应于等价的死状态 class [0].

  3. 字符串 1、4 和 7 在 L 中,因此它们必须对应于新状态。我们将这些 [1].

  4. 称为等价 class
  5. 字符串2、5、8不在L中;然而,并非 L 中的所有字符串都会将它们引导至 L 中的字符串。这些必须对应于一个新的等价关系 class 我们将调用 [2].

  6. 字符串3、6、9不在L中;但是这些可以跟在 L 中的任何内容以得到 L 中的字符串。这与空字符串相同,因此我们不需要新的等价 class 或声明:等价 class 是[e].

  7. 可以验证,每一个两位数的十进制字符串都与上面的某个一位数的十进制字符串没有区别。因此,不需要新的等价 classes 或状态。

要确定转换,只需将转换符号附加到等价 class 的代表元素,然后查看结果字符串属于哪个等价 class:这将是转换终止的地方。例如,0 上有从 [e] 到 [0] 的过渡,1 上有从 [e] 到 [1] 的过渡,等等

因为 10 = 1 (mod 3),在十进制字符串的末尾添加一个新数字将使新值 modulo 3 成为原始数字值的总和modulo 3 为新数字的值 modulo 3:

x = a (mod 3)
y = b (mod 3)
x * 10 = x * 1 (mod 3) since 10 = 1 (mod 3)
x . y = x * 10 + y = x * 1 + y = x + y (mod 3)

填充过渡留作练习。