从一组基本语言和闭包属性构造所有无上下文语言?


10

查看正则表达式的一种方法是对以下事实的结构性证明:可以通过从少量语言开始并通过一组固定的较小闭包属性来组合正则语言来构造正则语言。具体来说,如果我们以空语言,包含空字符串的语言以及所有单字符字符串的语言开始,则可以使用并集,串联和Kleene星号来组合所有可能的常规语言。

是否有一组基本语言和闭包属性可用于生成所有且仅上下文无关的语言?(要澄清:我不是问您是否可以为所有CFL编写正则表达式,我知道这是不可能的。相反,我想知道是否有一种方法可以基于CFL为CFL设计类似正则表达式的框架相同的基本原则。)


1
碰巧的是,我们的参考问题之一可能包含您的需求。
拉斐尔

Answers:


8

这是可能的,但可能并非完全按照您的要求。首先,使用两对括号中匹配括号的所有字符串的Dyck语言,例如或更抽象地讲。D2a 1b 1a 2b 2{[,],(,)}a1,b1,a2,b2

然后,可以使用同构,反同构以及与常规语言的交集从获得每种无上下文的语言。上下文无关的语言在旧书中称为“由生成的主锥” 。看到一个相关的问题:“ 单柜台计算机可以识别哪些语言?D 2 MD 2D2D2M(D2)

实际上,我们只需要每个操作之一(精心选择)。每个CFL都可以写成,其中,是同态,是常规语言。直观地讲,是PDA的程序,将每个指令映射到读取的字母,将其映射到堆栈的推入和弹出操作。最后,编码正确的堆栈行为。ħ - [R [R g(h1(D2)R)ghRRgD 2hD2

此结果与Chomsky–Schützenberger定理有关(或在Wikipedia中可以看到,其中之一)。维基百科(a)此处链接的语句不需要逆同构,而(b)语句不限于两对括号。这种类型的定理来自“自动机抽象族”区域,其中金斯堡(Ginsburg)和格赖巴赫(Greibach)是重要的名字。尼瓦特(Nivat)的一个相关结果表明,对于固定,形式为运算是有限状态转换。ħ řLg(h1(L)R)g,h,R


哇,那真的很有趣!如果您对此有任何参考,欢迎与我们联系!
templatetypedef

太棒了 这完全可以回答我的问题。
templatetypedef
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.