【问题标题】:Conversion of RE to FSA without ε没有 ε 的 RE 到 FSA 的转换
【发布时间】:2021-03-21 05:49:58
【问题描述】:

我有一个正则表达式

10+(0+11)*1

如何将正则表达式更改为有限状态自动机?

【问题讨论】:

  • 我投票结束这个问题,因为没有表现出任何努力。

标签: math automata finite-automata automata-theory


【解决方案1】:

一方面,在 RE 和 NFA 之间以及 NFA 和 DFA 之间的等价性证明中使用了算法。这是一种选择,不需要深入了解或理解 RE 生成的语言。

另一种选择是先尝试理解该语言,然后从头开始为该语言编写 DFA。

我将向您展示的方式涉及 Myhill-Nerode 定理,该定理说常规语言在不可区分关系上具有与该语言的最小 DFA 中的状态一样多的等价类。如果可以将相同的字符串集附加到它们以获得语言中的某些字符串,则两个字符串在语言方面是无法区分的。例如,字符串 a、b 和 ba 是可区分的 w.r.t。 L(ab) 因为 a 后面可以跟 b,b 后面只能跟空字符串,ba 后面跟什么都没有(空集)来得到 L 中的字符串。这告诉我们 a 的最小 DFAb至少需要三个状态。

对于您的语言,L(10 + (0 + 11)*1,我们观察到:

  • 空字符串是我们首先看到的。它需要一个状态——DFA 的初始状态——并且可以跟在 L 中的任何字符串之后,以获取 L 中的一个字符串。将此状态称为 [e]。

  • 字符串0后跟1可以得到该语言的字符串;这使它与空字符串不同,因此需要一个新状态。称之为 [0]。

  • 字符串 1 后面可以跟空字符串以获取该语言中的另一个字符串;这使它与空字符串和字符串 0 区分开来。将其状态称为 [1]。

  • 字符串 00 后面可以跟跟 0 完全相同的字符串,以获得语言中的字符串。这意味着 00 不需要新状态; 00 会将我们的 DFA 带到状态 [0]。

  • 字符串 01 后面可以跟 1(0 + 11)*1 形式的字符串,以获取语言中的字符串。这是新的,所以我们需要一个新的状态。称之为 [01]

  • 字符串 10 后面可以跟空字符串,只是为了得到 L 中的一个字符串。这是新的,所以称它的状态为 [10]。

  • 字符串 11 后面可以跟跟 0 完全相同的字符串,以获得语言中的字符串。 11 会将我们的 DFA 带到状态 [0]。

  • 字符串 010 永远不会导致该语言中的字符串;它必须在我们的最小 DFA 中导致死状态。称之为 [010]。

  • 字符串 011 与字符串 0 和 11 无法区分。

  • 字符串 100 和 101 不能导致语言中的字符串,所以它必须将我们的 DFA 带到死状态 [010]。

我们发现我们需要的状态是:[e]、[0]、[1]、[01]、[10] 和 [010]。过渡并不难弄清楚:

  • [e] 在输入 0 和 1 上分别转换为 [0] 和 [1]
  • [0] 在输入 0 和 1 上分别转换为 [0] 和 [01]
  • [1] 在输入 0 和 1 上分别转换为 [10] 和 [0]
  • [01] 在输入 0 和 1 上分别转换为 [010] 和 [0]
  • [10] 转换为 [010] ob 输入 0 或 1
  • [010] 总是转换到自身

您现在有一个适用于您的语言的最小 DFA,以及这种最小化的证明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2019-03-19
    • 1970-01-01
    • 2022-01-24
    • 2020-06-03
    • 1970-01-01
    相关资源
    最近更新 更多