【问题标题】:Deciding if a given Language is Regular/Context-Free/Non Context-Free确定给定语言是否是常规/上下文无关/非上下文无关
【发布时间】:2012-12-18 01:43:59
【问题描述】:

我需要一些帮助来确定给定语言是常规语言、上下文无关语言还是非上下文无关语言。一个简短的、非正式的解释就足够了,因此不需要使用抽引引理。

假设我有以下语言:

L1 = { w ∈ {a, b, c, d}* | #a(w) is even, #b(w) = 1 mod 3, w does not have 
                           a substring abc }

L2 = { w  ∈ {a, b, c, d}* | #a(w) is even, #b(w) < #c(w) }

L3 = { w  ∈ {a, b, c, d}* | #a(w) < #b(w) < #c(w) }

这是我的解决方案:

L1 = L2 ∩ L3 ∩ L4 where

L2 = #a(w) is even
L3 = #b(w) = 1 mod 3
L4 = w does not have a substring abc 

可以为 L2 构造一个 DFA,因为 L2 不需要无限的内存,所以 L2 是规则的。对于 L3 的推理与上述相同。对于 L4,我们可以构造一个根本不接受“abc”的 DFA,因此是常规的。

L1 是正则的,因为正则语言在 ∩ 下是封闭的。

对于L2,我们可以将语言分为:

L2 = L3 ∩ L4 where

L3 = #a(w) is even
L4 = #b(w) < #c(w)

我们知道可以为 L3 构造 DFA,因此 L3 是正则的。 L4 是上下文无关的,因为我们可以构造一个 PDA,其中使用堆栈来计算 a:s 和 b:s 的数量。

因此,L2 是上下文无关的,因为常规语言和上下文无关语言的 ∩ 导致上下文无关语言。

对于 L3,我们可以看到它是非上下文无关的,因为我们被限制为 1 个堆栈,并且要进行超过 1 个比较,我们需要更多堆栈。

我的推理有权利吗?我很快就要考试了,想知道我是否有这个想法。

提前致谢

【问题讨论】:

    标签: context-free-grammar regular-language automata formal-languages


    【解决方案1】:

    是的,您在所有三个方面都是正确的。 L1 是常规的,L2 是上下文无关的,L3 不是上下文无关的。您正确地为 L1 和 L2 应用了闭包属性,并且您的推理对于最后一个或多或少是正确的。对于最后一个,我会警告您不要使用该规则......因为可能有不止一种方法可以考虑如何识别一种语言,其中一些需要更多的堆栈,而其中一些不需要.以非上下文无关语言 L = {a^n b^n c^n} 为例。这种语言的补充是与上下文无关的,尽管草率地应用您使用的规则可能会导致您不相信(直到您正确考虑了这个问题)。

    【讨论】:

    • 非常感谢 :) 我知道 3 的推理不太好。有什么其他的论点可以用于 L3 吗?
    • L4 = { w ∈ {a, b, c, d}* | #a(w)
    • @mrjasmin 为了证明语言不是上下文无关的,最好的办法是对上下文无关语言使用泵引理。与常规语言的抽引引理不同,上下文无关语言的抽引引理为语言提供了必要的充分条件,以使语言成为上下文无关的。它可能很混乱,但它总是有效的(如果没有,那么你就是上下文无关的)。有时,您可以像常规语言一样应用闭包属性,只是上下文无关语言不会在所有相同的操作下关闭。
    • @mrjasmin 是的,L4 是常规的(因此也是无上下文的),因为您可以为它构造一个(非常大的)DFA。其实仔细想一想,L4 一定是一种有限的语言,所以它肯定是有规律的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 2014-11-07
    • 2019-04-03
    • 2011-03-31
    • 2012-04-12
    • 2015-03-09
    • 2014-02-27
    相关资源
    最近更新 更多