【发布时间】:2013-04-29 08:12:40
【问题描述】:
我正在解决一个问题,我迫切需要一个提示来解决一个问题:
在 union 下使用闭包表明以下语言是上下文无关的:
{am bn cp dq : n=q 或 m
【问题讨论】:
-
由于这与编程无关,我建议在 cs.stackexchange.com 上询问。
标签: context-free-grammar formal-languages
我正在解决一个问题,我迫切需要一个提示来解决一个问题:
在 union 下使用闭包表明以下语言是上下文无关的:
{am bn cp dq : n=q 或 m
【问题讨论】:
标签: context-free-grammar formal-languages
由于您没有具体说明您的问题是什么,我将仅介绍您需要了解的内容。
在工会下关闭 - 这是什么意思?
如果我们有一种语言 L 和一种语言 S 并且两者都是上下文无关的,我们知道语言的联合也是上下文无关的。
L ∪ S = 上下文无关语言
有关 CFL 的更多闭包属性,请参阅 this,如果您有兴趣,可以在网上找到这方面的证明(或者您可以尝试制作自己的证明)。
如何使用它来解决您的问题?
你有这个语言规范(我们称之为L):
L = {am bn cp dq : n=q 或 m
您可以将此语言拆分为其他 3 种语言:
A = {am bn cp dq : n = q }
B = {am bn cp dq : m C = {am bn cp dq : m+n = p+q }
很容易看出A ∪ B ∪ C = L。
如果您可以证明 A、B 和 C 是上下文无关的,那么您可以得出结论 L 也是上下文无关的。
解决方案
要确定一种语言是否是上下文无关的,请参阅this answer。引用答案:
首先,您应该尝试构建一个构成主题语言的context-free grammar。如果所有产生式的左侧恰好包含一个非终结符,则文法是上下文无关的。根据定义,如果存在,则该语言是上下文无关的。
等效的构造是pushdown automaton。它与 DFA 相同,但有可用的堆栈。它可能比语法更容易构建。
因此,如果您可以为每种语言 A、B 和 C 构建一个 CFG(或 PDA),那么您的问题就解决了。
让我们以语言A:
我们需要一个生成a..b..c..d.. 形式的字符串的语法,其中bs 和ds 的数量必须相等。
S -> AE
A -> Aa | ε
E -> bEd | C
C -> Cc | ε
S 是起始变量(或非终端),ε 是空字符串(有些人使用空符号^,但我一直被告知使用ε)。该语法应该能够生成语言A,因此A 是上下文无关的。 (如果有人检测到错误,请告诉我。我有一段时间没有创建 CFG)。
由于这是一个练习,我会让你解决剩下的部分,但你应该知道如何去做。
【讨论】: