这是可能的,但可能并非完全按照您的要求。首先,使用两对括号中匹配括号的所有字符串的Dyck语言,例如或更抽象地讲。D2a 1,b 1,a 2,b 2{[,],(,)}a1,b1,a2,b2
然后,可以使用同构,反同构以及与常规语言的交集从获得每种无上下文的语言。上下文无关的语言在旧书中称为“由生成的主锥” 。看到一个相关的问题:“ 单柜台计算机可以识别哪些语言? ”D 2 M(D 2)D2D2M(D2)
实际上,我们只需要每个操作之一(精心选择)。每个CFL都可以写成,其中,是同态,是常规语言。直观地讲,是PDA的程序,将每个指令映射到读取的字母,将其映射到堆栈的推入和弹出操作。最后,编码正确的堆栈行为。克ħ - [R [R 克g(h−1(D2)∩R)ghRRgD 2hD2
此结果与Chomsky–Schützenberger定理有关(或在Wikipedia中可以看到,其中之一)。维基百科(a)此处链接的语句不需要逆同构,而(b)语句不限于两对括号。这种类型的定理来自“自动机抽象族”区域,其中金斯堡(Ginsburg)和格赖巴赫(Greibach)是重要的名字。尼瓦特(Nivat)的一个相关结果表明,对于固定,形式为运算是有限状态转换。克,ħ ,řL↦g(h−1(L)∩R)g,h,R