【问题标题】:How can I determine if a language is context free or not?如何确定一种语言是否与上下文无关?
【发布时间】:2011-03-31 10:06:04
【问题描述】:

我如何知道这些语言是否与上下文无关?

【问题讨论】:

    标签: computer-science context-free-grammar


    【解决方案1】:

    首先,您应该尝试构建一个构成主题语言的context-free grammar。如果所有产生式的左侧恰好包含一个非终结符,则文法是上下文无关的。根据定义,如果存在,则该语言是上下文无关的。

    等价的构造是pushdown automaton。它与 DFA 相同,但有可用的堆栈。它可能比语法更容易构建。

    但是,如果您未能构建语法或自动机,这并不意味着语言不是上下文无关的;或许,只是你的语法构建不够棘手(例如,我曾经花了大约 7 个小时来构建一个复杂语言的语法)。

    如果您开始怀疑该语言是否与上下文无关,您应该使用所谓的"pumping lemma for context-free languages"。它描述了所有上下文无关语言的属性,如果你的语言违反了它,那么它肯定不是上下文无关的(参见维基百科的usage notes)。

    这个引理是Ogden's lemma 的推论。所以 Ogden 的功能更强大,如果你没有应用抽引引理,你可以试试 Ogden 的(使用方法相同)。

    【讨论】:

    • 这一切都很好,但你确实意识到这些都不能完全决定答案,对吧?如果你找不到上下文无关的语法,并且奥格登引理与你的语言的任何已知属性不矛盾怎么办?你仍然被这个问题所困扰。 (我认为这很难,所以你的答案可能已经很好了;只是指出它并不详尽。)
    • @ShreevatsaR,确切地说。可能会发生上述任何一项都不起作用的情况。但实际上我不知道在那种情况下该怎么办。
    【解决方案2】:

    编辑

    正如 cmets 中建议的那样,证明一种语言是非 CFG 的,我相信是通过使用 ogdens 引理。我之前的答案中包含的固有误解是可以原谅的:) 为潜伏者保留之前的答案。

    旧答案

    通过查看使用的语法和规则!从图像中可以看出(由维基百科乔姆斯基层次结构提供)。只有常规语言是非上下文无关的。暗示任何仅使用 A->aB 或 A->Ba 形式的东西的东西都不是上下文无关的。

    编辑 A->aB 和 A->Ba 定义是为了表达左右递归语法,不能按字面意思理解。

    【讨论】:

    • 技术上,常规语言是上下文无关的,但我同意术语“上下文无关”通常用于表示“上下文无关,但不规则” - 即图中的标签应用于他们所在的最小封闭区域,而不是他们所在的最小圆圈。
    • "只有常规语言是非上下文无关的。"什么?我认为您正在以错误的方式阅读图表。常规语言是上下文无关语言的子集,因此它们绝对是上下文无关的。然而,大多数上下文相关语言不是上下文无关的,这使得上下文相关语言成为上下文无关语言的严格超集。
    • Sepp2k,我指的是那些表现力。例如上下文无关语言的表达能力远高于常规语言。常规语法不会具有相同的表达能力。然而,CSL 可以比 CFG 更具表现力。所以 CSL 绝对是 CFG 的候选者,但 RG 不是。
    • @questzen:问题是如何显示一种语言是否是上下文无关的。如果一种语言位于图表中标记为无上下文的区域内,则该语言是无上下文的 - 包括标记为常规的区域,该区域完全包含在无上下文区域内。如果它在区域之外,它就不是上下文无关的。如果 OP 阅读了您的答案,他可能倾向于通过证明不规则性来证明上下文无关性(这基本上是您告诉他要做的),这将使他的成绩不及格。
    • @Reinierpost,我已经编辑了我的答案以反映更准确的立场
    【解决方案3】:

    您需要该语言的语法来确定它是否是上下文无关的。如果语法的所有产生式都具有“(非终结符)-> 终结符和非终结符的序列”的形式,则该文法是上下文无关的。

    【讨论】:

    • 好的,谢谢。那么 0^n 1^n 是上下文无关的。所以 {(0^n1^n)^m | 的补码m, n > 0} 是否与上下文无关。
    • 应该指出,仅仅因为您可以为一种语言提出非上下文无关语法,并不意味着该语言没有上下文无关语法。简而言之,您只能使用构造语法来表明一种语言是上下文无关的,而不是表明它不是。
    猜你喜欢
    • 2015-04-25
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    相关资源
    最近更新 更多