【问题标题】:What is a regular language?什么是常规语言?
【发布时间】:2011-10-06 18:53:58
【问题描述】:

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

我可以很容易地查到这个,但我找到的所有解释都是一堆符号和谈论 sets。我有两个问题:

  1. 您能用语言描述什么是常规语言,以及这些语言有何不同吗?

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

这是example

属于这个集合的任何语言都是字母表中的常规语言。

一种语言怎么能“超越”任何东西?

【问题讨论】:

标签: syntax programming-languages bnf regular-language formal-languages


【解决方案1】:

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

语言是所有可能单词的子集。例如,我们可能想要定义一种语言来捕获所有精英军情六处特工。它们都以双 0 开头,因此语言中的单词是 0070010050012,但不是 0715。为简单起见,我们说一种语言是“ 一个字母表”,而不是“由一个字母表中的符号 串联而成的单词的子集”。

在计算机科学中,我们现在想要对语言进行分类。如果可以通过一个接一个地检查单词中的所有符号来确定一个单词是否属于具有恒定(有限)内存的算法/机器,我们称之为语言常规。仅由单词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 语言包含无限数量的单词(007008,还有0042420012345),但可以用常量内存进行测试:要测试一个单词是否属于其中,请检查是否第一个符号是0,第二个符号是否是0。如果是这样,请接受它。如果单词短于三个或不以00 开头,则不是军情六处代号。

形式上,finite-state machineregular 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 的数量来决定一个单词是否属于该语言。

这通常应该在理论计算机科学课程中解释。幸运的是,维基百科很好地解释了formalregular languages

【讨论】:

  • @user666254 始终允许恒定数量的内存,因为它可以编码为状态。问题是当 n 接近无穷大时,您需要比任何恒定数量的内存来测试 1^n2^n 更多。形式上,您通常使用pumping lemma for regular langauges 来表示语言不规则。
  • 更具体地说,你需要3n+1个状态来判断一个字符串是否是1n2n语言。
  • 我个人认为,如果没有研究过数学符号,维基百科就不能很好地解释常规语言。即使他们解释了一些符号和变量,他们也会添加一些额外的东西而不解释它们。这篇文章对于那些不需要它的人来说可能更具可读性,但对于我们其他人来说,它需要澄清。
  • @P.Soutzikevich 不,同样可以使用秤来确定车辆是汽车还是卡车(>12 吨),但秤并不能定义汽车。 There are a number of other ways to prove a language is not regular。您是正确的,因为常规语言的抽水引理与常规语言的定义密切相关。它只是没有定义常规语言。
  • @ap 在表达式中,右括号的数量必须与左括号的数量相匹配。 ((( 1))) 是有效的 Python 代码,但 (1)) 不是。因此(以及许多其他原因),Python 编程语言的语法不会形成常规语言。
【解决方案2】:

以下是来自Wikipedia 的一些等效定义:

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

  • 它可以被确定性有限状态机接受。

  • 它可以被一个不确定的有限状态机接受

  • 可以用正式的正则表达式来描述。

    请注意,许多编程语言都提供“正则表达式”功能 增加了使他们能够识别的特征 不规则的语言,因此不严格 相当于正式的正则表达式。

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

其中一个最重要的特征是,与context-free languages 不同,常规语言不支持任意嵌套/递归,但您可以任意重复。

一种语言总是有一个底层字母表,它是一组允许的符号。例如,编程语言的字母表通常是 ASCII 或 Unicode,但在形式语言理论中,将语言置于其他字母表之上也是可以的,例如二进制字母表,其中唯一允许的字符是 0 和 @987654325 @。

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

【讨论】:

    猜你喜欢
    • 2021-03-24
    • 2015-06-11
    • 2013-09-13
    • 2016-08-03
    • 2022-06-28
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多