在计算机科学中,一个“单词”是由“符号”连接而成的。使用的符号称为“字母表”。例如,由字母表
{0,1,2,3,4,5,6,7,8,9}
形成的一些单词是
1
、
2
、
12
、
543
、
1000
和
002
。
然后,“语言”是所有可能单词的子集。例如,我们可能想定义一个捕捉所有精英MI6特工的语言。它们都以双零开头,因此该语言中的单词将是
007
、
001
、
005
和
0012
,但不包括
07
或
15
。为简单起见,我们称“语言基于某个字母表”而不是“是由该字母表中符号连接而成的单词的子集”。
在计算机科学中,我们现在希望对语言进行分类。如果可以通过检查单词中的每个符号并决定单词是否属于该语言来使用算法/具有恒定(有限)内存的机器判断语言,则称该语言为“正则语言”。仅由单词
42
组成的语言是正则的,因为您可以判断单词是否属于该语言,而无需任意数量的内存;您只需要检查第一个符号是否为4,第二个符号是否为2,以及是否跟随其他数字。
所有词汇有限的语言都是正则的,因为我们可以(理论上)构建一个恒定大小的控制流树(您可以将其视为一堆嵌套的if
语句,检查每个数字之后的一个)。例如,我们可以使用以下结构测试一个单词是否在“10到99之间的质数”语言中,除了编码当前所在代码行的内存外,不需要任何内存:
if word[0] == 1:
if word[1] == 1:
return true
if word[1] == 3:
return true
...
return false
请注意,所有有限语言都是正则的,但并非所有正则语言都是有限的;我们的双0语言包含无限数量的单词(
007
,
008
,还有
004242
和
0012345
),但可以用恒定的内存测试:要测试一个单词是否属于它,检查第一个符号是否为
0
,第二个符号是否为
0
。如果是这样,接受它。如果该单词长度小于三或不以
00
开头,则不是MI6代号。
形式上,
有限状态机或
正则文法的构建用于证明一种语言是正则的。它们类似于上面的
if
语句,但允许任意长的单词。如果有一个有限状态机,也有一个正则文法,反之亦然,因此只需证明其中之一即可。例如,我们的双0语言的有限状态机如下:
start state: if input = 0 then goto state 2
start state: if input = 1 then fail
start state: if input = 2 then fail
...
state 2: if input = 0 then accept
state 2: if input != 0 then fail
accept: for any input, accept
对应的正则语法是:
start → 0 B
B → 0 accept
accept → 0 accept
accept → 1 accept
...
等价的正则表达式是:
00[0-9]*
有些语言是不规则的。例如,任意数量的数字1
后跟相同数量的数字2
的语言(通常写作1n2n,对于任意n)是不规则的——你需要更多的内存(=常数个状态)来存储1
的数量,以确定一个单词是否属于该语言。
这个通常应该在理论计算机科学课程中解释。幸运的是,维基百科很好地解释了formal和regular languages。
a*b*
是正则的?但是语言 { a^nb^n | n > 0 } 不是一个正则语言。 - Grijesh Chauhan