📅  最后修改于: 2023-12-03 15:11:47.467000             🧑  作者: Mango
自动机乔姆斯基层次结构(Automata Chomsky Hierarchy)是形式语言理论中的一个层次结构,描述了不同类型的形式语言和上下文无关文法所能够表示的语言的范围。层次结构分为四个级别,从最弱到最强分别为正则语言、上下文自由语言、上下文相关语言和递归可枚举语言。
正则语言是最简单的一类形式语言,可以被正则表达式描述。正则表达式包括基本正则表达式和扩展正则表达式两种形式,用于匹配字符串的规则。
正则语言可以被一种特殊的有限状态自动机——正则表达式自动机(Regular Expression Automaton, REA)表示,它的状态转换只依赖当前读入字符,并且每个状态只有一个输入字符对应一个状态转移的确定性自动机。
+--a--> q1
| /\
start --b--> q0 | |a | b
| \/
+--b--> q2
上述RE自动机为示例,其中q0
为初始状态,q2
为接受状态。从初始状态开始,输入字符串bab
会依次转移到q1
、q2
、q1
,最终到达接受状态q2
,因此该字符串可以被该RE自动机接受。需要注意的是,RE自动机只能表示正则语言,不能表示上下文无关语言。
上下文无关语言是比正则语言更强大的一类形式语言,包括一些常见的编程语言如C、Java、Python等。可用上下文无关文法(CFG)表示。
CFG是由一个非终结符和终结符组成的规则集合,规则形如A -> alpha
,其中A
为非终结符,alpha
为由非终结符和终结符组成的字符串。对于一个特定的CFG,可以生成该CFG所能够表示的上下文无关语言。
下面是一个由CFG表示的简单的算术表达式语法:
<expr> ::= <term> | <expr> + <term> | <expr> - <term>
<term> ::= <factor> | <term> * <factor> | <term> / <factor>
<factor> ::= ( <expr> ) | <number>
<number> ::= <digit> | <number> <digit>
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
该语法可以表示简单的四则运算表达式,例如(1 + 2) * 3
或4 / (5 - 6)
等。
上下文无关语言可以被上下文无关文法解析树描述,解析树的根节点为语言的起始符号,每个非终结符代表一棵子树,终结符代表一个叶子节点。例如,对于表达式 (1 + 2) * 3
,对应的解析树如下所示:
上下文相关语言比上下文无关语言更强,可以被一种叫做线性有界自动机(Linear Bounded Automata, LBA)的自动机所表示。LBA与CFG的区别在于,LBA使用有限控制器和一个有限的工作区来进行计算,而CFG则不具有这些限制。
由于有限控制器能够读取工作区的局部环境,LBA可以表示上下文相关语言。例如,对于句子a^n b^n c^n
,其中n>=1
,它可以被以下的LBA接受:
a
替换为XaR
。b
替换为YbR
。c
替换为ZcR
。XYZ
:X
,删除X
并将工作区移动到右一位。Y
,删除Y
并将工作区移动到右一位。Z
,删除Z
并将工作区移动到右一位。R
。如果LBA能够在结束时返回到工作区的初始状态,那么输入的句子就是符合该文法的。
递归可枚举语言是形式语言中最强大的一类,可以被Turing机表示。递归可枚举语言包括了所有可计算的语言,因此可以表示任何一个不能被其他三种形式语言表示的语言。
递归可枚举语言和上下文相关语言的区别在于,递归可枚举语言可以任意地回溯,因此可以使用Turing机带上的无限循环来表示递归算法。例如,下面的递归函数可以用Turing机来模拟:
function factorial(n: BigInteger): BigInteger {
if (n == 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
其中,Turing机可以使用带上的无限循环来实现尾递归优化,使得递归算法中的栈不会爆炸。
自动机乔姆斯基层次结构是形式语言理论中非常重要的一个层次结构,描述了不同类型的形式语言和上下文无关文法所能够表示的语言的范围。正则语言、上下文无关语言、上下文相关语言和递归可枚举语言分别代表了不同的语言级别,给了程序员更好的认识和理解程序语言的能力。