上下文无关语言
上下文无关语言
关闭属性
上下文无关语言具有以下闭包属性。集合是关闭在一个操作下,如果对给定集合进行操作总是产生同一集合中的一个成员。这意味着,如果将这些封闭操作中的一个应用于与上下文无关的语言,结果也将是一种与上下文无关的语言。
- 联盟:上下文无关语言在联盟操作。这意味着如果 那么,这两种语言都是上下文无关的语言吗 也是一种上下文无关的语言。
这里证明了上下文无关语法在联合下是封闭的。[2]
让 而且 由上下文无关的语法生成, 而且 ,分别。
在不失通用性的情况下,为每个非终结符标上下标 与一个 的每个非终结符 与一个 这样 .
定义CFG, ,就会产生 如下: .
- 连接:如果 那么,这两种语言都是上下文无关的语言吗 也是与上下文无关的。字符串的连接定义如下: .
这里证明了与上下文无关的语法在连接下是封闭的。这个证明类似于并包证明。
让 而且 由上下文无关的语法生成, 而且 ,分别。
在不失通用性的情况下,为每个非终结符标上下标 与一个 的每个非终结符 与一个 这样 .
定义CFG, ,就会产生 如下: .
每一个字 生成的是一个词 接着是一个词 ,这是串联的定义。
- 克林星号:如果 那么,它是上下文无关的语言吗 也是与上下文无关的。克林星号可以重复任意次数的字符串或符号(包括0次)。Kleene星号基本上执行一个字符串与其自身的递归连接。例如, 等等......我们已经证明了节能灯在串联状态下是闭合的。
上下文无关语言是不在补语或补语下封闭十字路口.
如果CFL在交集下关闭,那么CFL就违反了上下文无关语言的泵入引理(详情见下一节),而这是不可能的。
以两种与上下文无关的语言为例 而且 .的交集 而且 , 我们将在下面的上下文无关语言的泵入引理中看到,它不是上下文无关的语言。
为了说明节能灯在补体下不是闭合的,我们将使用矛盾,交集的结果,和德摩根定律.
为了避免矛盾,假设 if是上下文无关语言吗 是一种上下文无关的语言。
我们知道节能灯在工会和德摩根定律下是关闭的:
可以改写为:
这是:
因为我们假设 而且 是否节能灯的结果是错误的陈述,我们知道节能灯并不是在补充下关闭的。
上下文无关语言的抽运引理
要证明某种东西不是一种与上下文无关的语言,要么需要找到一种与上下文无关的语法来描述该语言,要么使用另一种证明技术(尽管泵入引论是最常用的一种)。用来证明语言不是上下文无关的一个常见引理是为上下文无关语言注入引理.
的为上下文无关的语言注入引理说明如果是一种语言 是否与上下文无关,是否存在整数抽运长度 这样每个字符串 长度为 或者更多的符号, ,可以写成 在哪里 的子字符串。 这样:
所有与上下文无关的语言都是“可泵入的”,这意味着泵入引理约束对所有与上下文无关的语言都适用。如果一种语言是不可泵出的,那么它就不是一种与上下文无关的语言。然而,如果一种语言是可泵的,它就不一定是与上下文无关的语言。因为常规语言集包含在与上下文无关的语言集中,所以所有常规语言也必须是可泵取的。
本质上,抽吸引理包含任意长的弦 可以在不产生语言之外的新字符串的情况下抽取吗 .
要证明一种语言不是上下文无关的,请使用反证法还有抽吸引理。建立一个证明来证明 是上下文无关的,并且表明在上面列出的三个约束中的至少一个约束中出现了泵浦引理约束的矛盾。
基本上,上下文无关语言的泵入引理背后的思想是,为了成为上下文无关语言,语言必须遵守某些约束。您可以使用抽运引理来测试是否所有这些约束都适用于特定语言,如果不适用,则可以用矛盾来证明该语言不是与上下文无关的。
用抽吸引理来证明 不是一种上下文无关的语言。[3]
为了矛盾起见,假设 是一种上下文无关的语言。通过抽运引理,存在一个整数抽运长度 为 .我们需要一个字符串 它大于等于的长度 .当然 比 ,所以我们选择这个 字符串。这 是在 因为它已经 一个的, b的, c。
现在通过抽吸引理, .字符串中有五个可能的位置可以赋值 :
对于一些 .这意味着 只包含在a的部分中。
对于一些 而且 在哪里 这意味着 段包含在a段和b段的某个地方。
对于一些 .这意味着 只包含在b的部分中。
对于一些 而且 在哪里 这意味着 段包含在b段和c段的某个地方。
对于一些 .这意味着 只包含在c的部分中。
在这五种情况中,我们可以很容易地验证抽运引理的第三个约束,即 ,不成立。换句话说,对于这五个选项中的任意一个 ,字符串 不能以一种导致字符串具有相等数量的a、b和c(语言的定义)的方式抽取 ).
让我们以一个简短的字符串为例 而且 .
在第一种情况下,a的个数会比b和c的个数多,使得抽运后的弦,不是 .如果我们抽取这个区域,我们将得到字符串aaaaaaaabbbbbccccc:一个字符串 一个的, b的, c。很明显,这在语言中是没有的。对于第三和第五种情况,可以检查类似的证明,分别泵浦b和c区域,结果将是对称的。
对于第二种和第四种情况,我们做类似的事情。如果我们只在a和b区域的任何地方泵浦,我们将得到一个结果字符串,其中a和b比c多(对于第二种情况),b和c比a多(在第五种情况)。对于第二种情况,如果我们取 而且 在a部分抽取最后一个a,在b部分抽取前两个b,我们得到这个字符串:aaaaaabbbbbbbccccc -一个有6个a, 7个b和5个c的字符串。第五种情况有一个对称的例子。
在上面的例子中,为什么是 对于一些 , , 在哪里 的选项之一 ?
抽运引理的第一个约束条件是 .因为字符串是 ,有 A,然后是 B后面跟着 c。如果 张成a区域,b区域,c区域,它一定比 .例如,如果 只包括a区域的最后一个a,整个b区域,然后是c区域的第一个元素,它就有长度 因此是行不通的。
与其他计算模型的关系
任何可以用来生成的语言正则表达式可以由上下文无关的语法生成,但并非所有上下文无关的语言都是常规语言。我们还知道正则表达式和语言可以由有限状态机(一个简单的计算模型)。
常规语言可以“跟踪”一件事,而与上下文无关的语言最多可以“跟踪”两件事。例如,有一种常规语言可以生成具有偶数个0的所有字符串,但没有一种常规语言可以生成具有相等数量的1和0的所有字符串——然而,一种与上下文无关的语言可以做到这一点。但是,上下文无关语言或常规语言都不能为所有具有相同数量的a、b和c的字符串生成语言(请参阅上面部分中的泵入引理示例)。
有一种语法叫做上下文敏感的语法它们比常规语言和上下文无关语言更强大(意味着它们可以生成更复杂的语言,可能需要更多内存)。
上下文无关语言由上下文无关语法描述,这些语法可以由下推自动机.常规语言和有限状态机可以描述一些与上下文无关的语言,但不是全部。图灵机可以生成所有常规语言、所有上下文无关语言等等。
另请参阅
参考文献
- , J。乔姆斯基层次结构.检索2016年6月13日,从https://en.wikipedia.org/wiki/Chomsky_hierarchy
- Cappello, P。第十七章:上下文无关语言.检索自2016年6月14日http://www.cs.ucsb.edu/~cappello/136/lectures/17cfls/slides.pdf
- ,。为上下文无关的语言注入引理.检索2016年6月13日,从https://en.wikipedia.org/wiki/Pumping_lemma_for_context-free_languages