在计算机科学的语境中,一个词是符号的串联。使用的符号称为字母表。例如,一些由字母组成的单词{0,1,2,3,4,5,6,7,8,9}
是1
, 2
, 12
, 543
, 1000
, 和002
。
因此,语言是所有可能单词的子集。例如,我们可能想要定义一种语言来捕获所有精英军情六处特工。这些都以双 0 开头,所以语言中的单词是007
, 001
, 005
, and 0012
,但不是07
or 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
and 0012345
),但可以用常数记忆进行测试:要测试一个单词是否属于其中,检查第一个符号是否是0
,以及第二个符号是否是0
。如果是这样,请接受它。如果单词短于三或不以 开头00
,则不是军情六处代号。
形式上,有限状态机或正则文法的构造用于证明语言是正则的。这些类似于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
(通常写为 1 n 2 n,对于任意n)是不规则的 - 您需要的内存量不只是恒定数量(= 恒定数量的状态) 来存储1
s 的数量来决定一个词是否在该语言中。
这通常应该在理论计算机科学课程中解释。幸运的是,维基百科很好地解释了正式语言和常规语言。