解释理论计算机科学(TOC)中正则语言的不同运算。
语言是从某个字母表(有限或无限)中的一组字符串。换句话说,Σ*的任何子集L在TOC中都是一种语言。
一些**特殊语言**如下所示:
- {} 空集/语言,不包含任何字符串。
- {ε} 包含一个字符串的语言,空字符串。
示例
Σ = {0, 1}
L = {x | x ∈ Σ* 且x包含偶数个0}
Σ = {0, 1, 2,…, 9, .}
L = {x | x ∈ Σ* 且x构成一个有限长度的实数}
= {0, 1.5, 9.326,.}
Σ = {a, b, c,…, z, A, B,…, Z}
L = {x | x ∈ Σ* 且x是Pascal保留字}
Σ = {BEGIN, END, IF,…}
Σ = {Pascal保留字} ∪ {(, ), ., :, ;,…} ∪ {合法的Pascal标识符}
L = {x | x ∈ Σ* 且x是一个语法正确的Pascal程序}
Σ = {英语单词}
L = {x | x ∈ Σ* 且x是一个语法正确的英语句子}
正则语言的运算
正则语言的一些运算如下:
- 并集
- 交集
- 差集
- 连接
- Kleene星闭包
让我们一一了解这些运算。
并集
如果L1和L2是两个正则语言,它们的并集L1∪L2也将是正则的。
例如,L1 = {an | n > 0} 和 L2 = {bn | n > 0}
L3 = L1 ∪ L2 = {an ∪ bn | n > 0} 也是正则的。
交集
如果L1和L2是两个正则语言,它们的交集L1∩L2也将是正则的。
例如:
L1 = {ambn | n > 0 且 m > 0} 和
L2 = {ambn ∪ bnam | n > 0 且 m > 0}
L3 = L1 ∩ L2 = {ambn | n > 0 且 m > 0} 也是正则的。
连接
如果L1和L2是两个正则语言,它们的连接L1.L2也将是正则的。
例如:
L1 = {an | n > 0} 和 L2 = {bn | n > 0}
L3 = L1.L2 = {am.bn | m > 0 且 n > 0} 也是正则的。
Kleene闭包
如果L1是一个正则语言,它的Kleene闭包L1*也将是正则的。
例如,L1 = (a ∪ b),L1* = (a ∪ b)*
补集
如果L(G)是一个正则语言,它的补集L'(G)也将是正则的。可以通过从所有可能的字符串中减去L(G)中的字符串来找到语言的补集。
例如:
L(G) = {an | n > 3}
L'(G) = {an | n ≤ 3}
注意:如果由两个正则表达式生成的语言相同,则这两个正则表达式是等价的。例如,(a+b*)* 和 (a+b)* 生成相同的语言。由(a+b*)*生成的每个字符串也由(a+b)*生成,反之亦然。
示例1
编写接受集合Σ={a}上所有a组合的语言的正则表达式。
所有a的组合意味着a可以是零个、一个、两个等等。如果a出现零次,则表示空字符串。也就是说,我们期望集合为{ε, a, aa, aaa, …}。
因此,我们给出如下正则表达式:
R = a*
即a的Kleene闭包。