在计算机科学的上下文中,单词是符号的串联。使用的符号称为字母。例如,由字母表{0,1,2,3,4,5,6,7,8,9} 组成的一些单词将是1、2、12、543、1000 和002。
语言是所有可能单词的子集。例如,我们可能想要定义一种语言来捕获所有精英军情六处特工。它们都以双 0 开头,因此语言中的单词是 007、001、005 和 0012,但不是 07 或 15。为简单起见,我们说一种语言是“ 一个字母表”,而不是“由一个字母表中的符号 串联而成的单词的子集”。
在计算机科学中,我们现在想要对语言进行分类。如果可以通过一个接一个地检查单词中的所有符号来确定一个单词是否属于具有恒定(有限)内存的算法/机器,我们称之为语言常规。仅由单词42 组成的语言是常规语言,因为您可以决定其中是否包含单词,而无需任意数量的内存;您只需检查第一个符号是否为 4,第二个是否为 2,以及后面是否有更多数字。
所有单词数量有限的语言都是规则的,因为我们可以(理论上)构建一个恒定大小的控制流树(您可以将其可视化为一组嵌套的if-语句,检查一个数字后另一个)。例如,我们可以使用以下构造测试一个单词是否属于“10 到 99 之间的素数”语言,除了我们当前所在的代码行编码之外不需要内存:
if word[0] == 1:
if word[1] == 1: # 11
return true # "accept" word, i.e. it's in the language
if word[1] == 3: # 13
return true
...
return false
请注意,所有有限语言都是正则的,但并非所有正则语言都是有限的;我们的双 0 语言包含无限数量的单词(007、008,还有004242 和0012345),但可以用常量内存进行测试:要测试一个单词是否属于其中,请检查是否第一个符号是0,第二个符号是否是0。如果是这样,请接受它。如果单词短于三个或不以00 开头,则不是军情六处代号。
形式上,finite-state machine 或regular grammar 的构造用于证明一种语言是正则的。这些类似于上面的if-statements,但允许任意长的单词。如果有一个有限状态机,那么也有一个正则文法,反之亦然,所以任何一个都足够了。例如,我们的双 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
...
等价的regular expression是:
00[0-9]*
有些语言是不常规的。例如,任意数量的语言1,后跟相同数量的2(常写为1n2n,对于任意一个n) 是不规则的 - 您需要超过恒定数量的内存(= 恒定数量的状态)来存储 1s 的数量来决定一个单词是否属于该语言。
这通常应该在理论计算机科学课程中解释。幸运的是,维基百科很好地解释了formal 和regular languages。