Context free grammar 确定给定语言是否为常规语言/上下文无关语言/非上下文无关语言

Context free grammar 确定给定语言是否为常规语言/上下文无关语言/非上下文无关语言,context-free-grammar,regular-language,automata,formal-languages,Context Free Grammar,Regular Language,Automata,Formal Languages,我需要一些帮助来决定给定的语言是常规语言、上下文无关语言还是非上下文无关语言。一个简短的,非正式的解释在答案中是足够的,因此不需要使用泵引理 让我们假设我有以下语言: 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, #

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

让我们假设我有以下语言:

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) }
可以为L2构造DFA,因为L2不需要无限内存,所以L2是正则的。对于L3,与上述推理相同。对于L4,我们可以构造一个不接受“abc”的DFA,因此是正则的

L1是正则的,因为正则语言在∩ .

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

L2 = L3 ∩ L4 where

L3 = #a(w) is even
L4 = #b(w) < #c(w)
L2=L3∩ L4在哪里
L3=#a(w)是偶数
L4=#b(w)<#c(w)
我们知道可以为L3构造DFA,因此L3是正则的。L4是上下文无关的,因为我们可以构造一个PDA,其中堆栈用于计算a:s和b:s的数量

因此,L2是上下文无关的,因为∩ 规则语言和上下文无关语言的结合产生了上下文无关语言

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

我的推理正确吗?我马上就要考试了,我需要知道我是否有这个想法


提前感谢

是的,您在这三个方面都是正确的。L1是规则的,L2是上下文无关的,L3不是上下文无关的。您正确地为L1和L2应用了闭包属性,并且您的推理对于最后一个来说或多或少是正确的。最后,我要提醒你不要使用这个规则。。。因为可能有不止一种方式来考虑如何识别一种语言,其中有些需要的不仅仅是堆栈,有些则不需要。以非上下文无关语言L={a^NB^NCN^n}为例。这种语言的补充是与上下文无关的,尽管草率地应用您使用的规则可能会让您产生相反的想法(直到您正确地考虑了这个问题)。

非常感谢:)我知道3的推理不太好。有没有其他参数可以用于L3?L4={w如何∈ {a,b,c,d}*|#a(w)<#b(w)<#c(w)@mrjasmin为了证明语言不是上下文无关的,最好的办法是对上下文无关的语言使用泵送引理。与常规语言的泵送引理不同,上下文无关语言的泵送引理为语言提供了上下文无关的一个充分必要条件。它可以是混乱的,但总是有效的(如果没有,那么你是上下文无关的)。有时,你可以像对常规语言那样应用闭包属性,只是上下文无关语言在所有相同的操作下都不会关闭。@Jasmin先生是的,L4是常规的(因此也是上下文无关的),因为你可以构造一个(非常大的)事实上,如果你仔细想想,L4一定是一种有限语言,因此,它肯定是正则的。
L2 = L3 ∩ L4 where

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