Computer science 如何确定一种语言是否与上下文无关?

Computer science 如何确定一种语言是否与上下文无关?,computer-science,context-free-grammar,Computer Science,Context Free Grammar,如何知道这些语言是否与上下文无关?您需要该语言的语法来确定它是否与上下文无关。语法是上下文无关的,如果它的所有产品都有形式“(非终端)->终端和非终端的序列。”首先,你应该尝试建立一个语法,形成主语中的语言。如果所有产品的左侧仅包含一个非终端符号,则语法与上下文无关。根据定义,如果存在,则该语言与上下文无关 一个等价的构造将是一个。它与DFA相同,但有一个可用的堆栈。它可能比语法更容易构建 然而,如果你无法构建语法或自动机,这并不意味着语言不是上下文无关的;也许,仅仅是你不能构建一个足够复杂的语

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

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

首先,你应该尝试建立一个语法,形成主语中的语言。如果所有产品的左侧仅包含一个非终端符号,则语法与上下文无关。根据定义,如果存在,则该语言与上下文无关

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

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

如果您开始怀疑该语言是否与上下文无关,您应该使用所谓的。它描述了所有上下文无关语言的属性,如果您的语言违反了它,那么它肯定不是上下文无关的(请参阅Wikipedia)

这个引理是一个推论。因此,Ogden的更强大,如果你没有应用泵引理,你可以尝试Ogden的(它的使用方式相同)。

Edit

正如在证明一种语言是非CFG语言的评论中所建议的,我相信是通过使用ogdens引理。我先前的回答中固有的误解是可以原谅的:)为潜伏者保留先前的答案

旧答案


通过查看使用的语法和规则!如图所示(维基百科乔姆斯基层级提供)。只有常规语言是非上下文无关的。暗示任何仅使用A->aB或A->Ba形式的事物都不是上下文无关的。

编辑
A->aB和A->Ba的定义是用来表示左、右递归语法的,不能按字面理解。

是的,谢谢。那么0^n 1^n是上下文无关的。所以{(0^n1^n)^m | m,n>0}的补码是上下文无关的还是非上下文无关的。应该指出的是,仅仅因为你能为一种语言提出非上下文无关语法,并不意味着该语言没有上下文无关语法。简而言之,你只能用构造语法来表示一种语言是上下文无关的,而不是表示它不是上下文无关的。从技术上讲,常规语言是上下文无关的,但我同意术语“上下文无关”通常用来表示“上下文无关,但不规则”-即,图表中的标签应用于它们所在的最小封闭区域,而不是它们所在的最小圆圈。“只有常规语言是非上下文无关的。”什么?我认为你看错了图表。正则语言是上下文无关语言的子集,因此它们肯定是上下文无关的。然而,大多数上下文敏感语言都不是上下文无关的,这使得上下文敏感语言成为上下文无关语言的严格超集。例如,上下文无关语言的表达能力远远高于常规语言。常规语法不会有同样的表达能力。然而,CSL可能比CFG更具表现力。所以CSL肯定是CFG的候选语言,但RG不是。@questzen:问题是如何显示一种语言是否与上下文无关。如果语言位于图表中标记为上下文无关的区域内,则该语言是上下文无关的,包括标记为常规的区域,该区域完全包含在上下文无关区域内。如果它位于该区域之外,则它不是上下文无关的。如果OP阅读了你的答案,他可能倾向于通过证明非规则性来证明上下文无关性(这基本上是你告诉他的),这会让他不及格。@Reinierpost,我编辑了我的答案以反映更准确的标准。所有这一切都是好的,但你知道这些都不能完全决定答案,对吗?如果你找不到上下文无关的语法,而Ogden引理与你的语言的任何已知属性都不矛盾,那该怎么办?你仍然被这个问题困扰着。(我认为这很难,所以你的答案可能是最好的;只是指出它并不详尽。)@ShreevatsaR,没错。上述措施可能都不起作用。但我真的不知道在这种情况下该怎么办。