我正在解决一个问题,我迫切需要一个提示来解决一个问题:
使用union下的闭包来显示以下语言是无上下文的:
{a m b n c p d q :n = q或m <= p或m + n = p + q}
答案 0 :(得分:4)
由于您未指明问题所在,我将通过您需要了解的内容。
在联盟下关闭 - 这是什么意思?
如果我们有一种语言L
和一种语言S
并且两者都没有上下文,我们就知道语言的联合也是无上下文的。
L∪S=无语境语言
有关CFL的更多闭包属性,请参阅this,如果您有兴趣(或者您可以尝试制作自己的证明),可以在网上找到相关证明。
如何使用它来解决您的问题?
你有这个语言规范(我们称之为L
):
L = {a m b n c p d q :n = q或m < = p或m + n = p + q}
您可以将此语言拆分为其他3种语言:
A = {a m b n c p d q :n = q} > B = {a m b n c p d q :m <= p}
C = {a m b n c p d q :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..
形式的字符串,其中我们必须有相同数量的b
和d
s。
S -> AE
A -> Aa | ε
E -> bEd | C
C -> Cc | ε
S
是起始变量(或非终端),ε
是空字符串(有些人使用空符号^
,但我总是被告知使用{{1} }})。该语法应该能够生成语言ε
,因此A
是无上下文的。 (如果有人发现错误,请告诉我。我暂时没有创建CFG。)
由于这是一个练习,我会让你解决其余部分,但你应该已经知道如何去做。