我正在尝试理解语言级别的概念(常规,无上下文,上下文敏感等)。
我可以轻松地查看,但我发现的所有解释都是符号的负载,并谈论集。我有两个问题:
您能用语言描述常用语言是什么,语言有何区别?
人们在哪里学会理解这些东西?据我了解,这是正式的数学?我在大学有几个课程使用它,几乎没有人理解它作为导师只是假设我们知道它。我在哪里可以学到它以及为什么人们“期望”在如此多的资源中知道它?就像教育方面存在差距一样。
这是example:
属于此套装的任何语言都是字母表中的常规语言。
语言怎么能“超过”任何东西?
答案 0 :(得分:140)
在计算机科学的背景下,词是符号的串联。使用的符号称为字母。例如,由{0,1,2,3,4,5,6,7,8,9}
字母组成的一些单词将是1
,2
,12
,543
,1000
和{{ 1}}。
语言是所有可能单词的子集。例如,我们可能想要定义一种捕获所有精英MI6代理的语言。这些都以double-0开头,因此语言中的单词为002
,007
,001
和005
,但不是0012
或{{ 1}}。为简单起见,我们说一种语言是“ over 一个字母”,而不是“通过字母表中符号连接形成的一个词的子集”。
在计算机科学中,我们现在想要对语言进行分类。我们称之为语言常规,如果可以通过一个接一个地检查单词中的所有符号来确定一个单词是否使用算法/具有常量(有限)内存的机器的语言。由单词07
组成的语言是常规的,因为您可以决定一个单词是否在其中而不需要任意数量的内存;您只需检查第一个符号是否为4,第二个符号是否为2,以及是否还有其他数字。
所有具有有限数量单词的语言都是常规的,因为我们可以(理论上)只构建一个常量大小的控制流树(您可以将其可视化为一堆嵌套的15
- 语句来检查一个数字在另一个之后)。例如,我们可以使用以下构造测试一个单词是否在“10到99之间的素数”语言中,除了编码我们当前所在代码行的那个内容之外不需要任何内存:
42
请注意,所有有限语言都是常规语言,但并非所有常规语言都是有限的;我们的double-0语言包含无限多个单词(if
,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
,还有007
和008
),但可以使用常量内存进行测试:测试是否一个单词属于它,检查第一个符号是004242
,第二个符号是否为0012345
。如果是这种情况,请接受它。如果单词短于3或不以0
开头,则不是MI6代码名称。
正式地,finite-state machine或regular grammar的构造用于证明语言是规则的。这些与上面0
- 语句类似,但允许任意长的单词。如果有一个有限状态机,也有一个常规语法,反之亦然,所以它也足以显示。例如,我们的双0语言的有限状态机是:
00
等效的常规语法是:
if
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 n 2 n ,任意的 n )不是常规的 - 你需要不止一定量的内存(=一个常数的状态)来存储1
的数量来决定一个单词是否一个在语言中。
这应该通常在理论计算机科学课程中解释。幸运的是,维基百科很好地解释了formal和regular languages。
答案 1 :(得分:5)
以下是Wikipedia中的一些等效定义:
[...]常规语言是一种正式语言(即可能的语言) 来自有限字母表的无限有限符号序列集) 满足以下等效属性:
- 它可以被确定性有限状态机接受。
- 它可以被非确定性有限状态机接受
可以用正式的正则表达式来描述。
请注意,许多编程语言提供了“正则表达式”功能 增加了使它们能够识别的功能 语言不规则,因此不严格 相当于正式的正则表达式。
首先要注意的是,常规语言是a formal language,但有一些限制。形式语言本质上是一个(可能是无限的)字符串集合。例如,形式语言Java是所有可能的Java文件的集合,它是所有可能的文本文件集合的子集。
最重要的特征之一是,与context-free languages不同,常规语言不支持任意嵌套/递归,但您确实有任意重复。
语言总是有一个底层字母表,它是一组允许的符号。例如,编程语言的字母表通常是ASCII或Unicode,但在形式语言理论中,与其他字母表谈论语言也很好,例如二进制字母表中唯一允许的字符是0
和1
。
在我的大学里,我们在编译器课上学过一些形式语言理论,但不同学校之间可能有所不同。
答案 2 :(得分:-2)
我从"Introduction to the Theory of Computation", by Michael Sipser学到了大部分的这种东西;我觉得它真的很有用。
以下是内容:
- 简介
- 第1部分:自动机和语言
- 1。常规语言
- 2。无上下文语言
- 第2部分:可计算性理论
- 3。教会 - 图灵论文
- 4。可判定
- 5。还原性
- 6。可计算性理论高级主题
- 第3部分:复杂性理论
- 7。时间复杂性
- 8。空间复杂性
- 9。棘手
- 10。复杂性理论的高级主题。