【发布时间】:2021-03-21 05:49:58
【问题描述】:
我有一个正则表达式
10+(0+11)*1
如何将正则表达式更改为有限状态自动机?
【问题讨论】:
-
我投票结束这个问题,因为没有表现出任何努力。
标签: math automata finite-automata automata-theory
我有一个正则表达式
10+(0+11)*1
如何将正则表达式更改为有限状态自动机?
【问题讨论】:
标签: math automata finite-automata automata-theory
一方面,在 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]。过渡并不难弄清楚:
您现在有一个适用于您的语言的最小 DFA,以及这种最小化的证明。
【讨论】: