如果一种语言可以用有限自动机表示或者可以为它生成正则表达式,则称该语言是正则的。这个定义将我们引向一般定义:对于每个对应于该语言的正则表达式,可以生成一个有限自动机。
对于某些表达式,例如:- (a+b), ab, (a+b)* ;仅凭直觉制作有限自动机相当容易,如下所示。当我们提供更长的正则表达式时,问题就出现了。这带来了对 FA 生成的系统方法的需求,这已由 Kleene 在Kleene 定理中提出 – I
克莱恩定理-I:
For any Regular Expression r that represents Language L(r), there is a Finite Automata that accepts same language.
为了理解 Kleene’s Theorem-I,让我们考虑正则表达式的基本定义,我们观察到 , 并且单个输入符号“a”可以包含在正则语言中,并且可以通过这些组合执行的相应操作是:
说, 和是两个正则表达式。然后,
- + 也是一个正则表达式,对应的语言是L( ) UL( )
- . 也是一个正则表达式,对应的语言是L( ).L( )
- * 也是一个正则表达式,对应的语言是 L( )*
我们可以进一步将这个定义与 Null Transitions 结合使用,通过两个或多个较小的有限自动机(每个对应于一个正则表达式)的组合来产生 FA。
让 S 接受 L = {a} 并且 T 接受 L = {b},那么 R 可以使用提供的操作表示为 S 和 T 的组合:
R = S + T
我们观察到,
- 在联合操作的情况下,我们可以有一个新的开始状态,从这个状态开始,空转换继续到两个有限状态机的开始状态。
- 两个有限自动机的最终状态都转换为中间状态。最终状态统一为一个可以通过空转换遍历的状态。
R = S.T
我们观察到,
- 在串联操作的情况下,我们可以有与 S 相同的起始状态,唯一的变化发生在 S 的结束状态,它被转换为中间状态,然后是空转换。
- Null 转换之后是 T 的起始状态,T 的最终状态用作 R 的结束状态。
R = S*
我们观察到,
- 添加了一个新的起始状态,并且 S 已被放置为中间状态,以便可以合并自循环条件。
- 开始和结束状态已分别定义,因此自循环条件不会受到干扰。
现在我们已经了解了一般操作。让我们看看如何使用 Kleene’s Theorem-I 为给定的正则表达式生成 FA。
Example:
Make a Finite Automata for the expression (ab+a)*
我们看到,使用 Kleene 定理 – 我给出了一种系统方法来为所提供的正则表达式生成有限自动机。