什么是普通语言?


78

我正在尝试理解语言级别的概念(常规,上下文无关,上下文敏感等)。

我可以很容易地查找它,但是我发现的所有解释都是大量的符号并谈论集合。我有两个问题:

  1. 您可以用语言描述什么是普通语言,以及这些语言的不同之处吗?

  2. 人们在哪里学习了解这些东西?据我了解,这是形式数学吗?我在uni上有几门课程使用了它,几乎没有人理解它,因为辅导员只是以为我们知道它。我在哪里可以学习到它,为什么人们会“期望”在这么多来源中了解它?就像教育上存在差距。

这是一个例子

属于该集合的任何语言都是字母上的常规语言。

语言如何“超越”任何事物?


实际上,维基百科在解释所有这些方面并不差劲。您可能想从en.wikipedia.org/wiki/Formal_language开始,然后逐步解决这些主题。例如,这将出现在“理论计算机科学”课程中。
巴特

3
我想说这样的问题是SO的主题。请参阅在哪里讨论计算机科学?在meta上。
hammar 2011年

Answers:


154

在计算机科学的上下文中,单词符号的串联。使用的符号称为字母。例如,字母表中的形成了一些字{0,1,2,3,4,5,6,7,8,9}将是12125431000,和002

一个语言是那么的所有可能的字的一个子集。例如,我们可能想定义一种捕获所有精英MI6代理的语言。这些全部用双0开始,所以在语言中的单词是007001005,和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,也可以0042420012345),但可以使用恒定内存进行测试:要测试单词是否属于其中,请检查第一个符号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 Ñ,对于任意Ñ)不是正则的-你需要超过存储器的恒定量(=状态的恒定数)存储1s的数量,以决定一个单词是否在该语言中。

通常应在理论计算机科学课程中对此进行解释。幸运的是,维基百科很好地解释了正式语言常规语言


谢谢,我理解了除非常规语言之外的所有知识。您需要内存来存储1s是吗,但是在MI6示例中,您是否不需要内存来记住前两个字符为0?
FBryant87

2
@ user666254始终允许使用固定数量的内存,因为可以将其编码为状态。问题是,当n接近无穷大时,您需要更多的内存来测试1 ^ n2 ^ n 。形式上,通常对常规语言使用泵送引理,以表明语言不是常规语言。
phihag 2011年

1
更具体地说,您需要3n + 1状态来确定字符串是否为1n2n语言。
laike9m

4
我个人认为,如果没有研究过数学符号,维基百科就不能很好地解释常规语言。即使他们解释了一些符号和变量,他们也吸收了一些附加内容,并且不解释它们。这篇文章可能对那些不需要它的人更具可读性,但对我们其他人来说则需要澄清。
安德鲁S

1
@ P.Soutzikevich不,以相同的方式,可以使用比例尺来确定车辆是汽车还是卡车(> 12吨),但是该比例尺并未定义汽车。还有许多其他方法可以证明某种语言是不规则的。您是对的,因为常规语言的抽动引理与常规语言的定义密切相关。它只是没有定义常规语言。
phihag

5

这是Wikipedia的一些等效定义:

常规语言是一种形式语言(即,可能来自有限字母的符号的有限序列的无限集合),其满足以下等效属性:

  • 它可以被确定性有限状态机接受。
  • 它可以被不确定的有限状态机接受
  • 可以用正式的正则表达式来描述。

    注意,许多编程语言提供的“正则表达式”功能都增加了使其能够识别非正则语言的功能,因此并不严格等同于正则表达式。

首先要注意的是,常规语言是形式语言,但有一些限制。形式语言本质上是(可能是无限的)字符串集合。例如,正式语言Java是所有可能的Java文件的集合,它是所有可能的文本文件的集合的子集。

最重要的特征之一是,与上下文无关的语言不同,常规语言不支持任意嵌套/递归,但是您确实具有任意重复。

语言始终具有基础字母,即所允许的符号集。例如,一种编程语言的字母通常是ASCII或Unicode,但是在形式语言理论中,也可以将语言与其他字母进行讨论,例如,仅允许使用0和的二进制字母1

在我的大学里,我们在编译器课程中教过一些形式语言理论,但这在不同的学校之间可能有所不同。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.