在计算机科学的上下文中,单词是符号的串联。使用的符号称为字母。例如,字母表中的形成了一些字{0,1,2,3,4,5,6,7,8,9}
将是1
,2
,12
,543
,1000
,和002
。
一个语言是那么的所有可能的字的一个子集。例如,我们可能想定义一种捕获所有精英MI6代理的语言。这些全部用双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
注意,所有有限语言都是规则语言,但并非所有规则语言都是有限语言。我们的double-0语言包含无限数量的单词(007
,和008
,也可以004242
和0012345
),但可以使用恒定内存进行测试:要测试单词是否属于其中,请检查第一个符号0
是否为,第二个符号是否为0
。如果是这样,请接受。如果单词少于三个或不是以开头00
,则不是MI6代号。
形式上,有限状态机或规则语法的构造用于证明语言是规则的。这些与if
上面的-statement类似,但是允许任意长的单词。如果有一个有限状态机,那么也有一个规则语法,反之亦然,因此足以显示其中一个。例如,我们的double-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个ñ 2 Ñ,对于任意Ñ)不是正则的-你需要超过存储器的恒定量(=状态的恒定数)存储1
s的数量,以决定一个单词是否在该语言中。
通常应在理论计算机科学课程中对此进行解释。幸运的是,维基百科很好地解释了正式语言和常规语言。