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

时间:2013-01-03 16:45:13

标签: 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, #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次的比较,我们需要更多的堆栈。

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

提前致谢

1 个答案:

答案 0 :(得分:3)

是的,这三项都是正确的。 L1是常规的,L2是无上下文的,L3不是无上下文的。您正确地应用了L1和L2的闭包属性,并且您的推理或多或少对于最后一个是正确的。对于最后一个,我会提醒您不要使用该规则...因为可能有多种方式来考虑如何识别语言,其中一些方法需要的不仅仅是一个堆栈,其中一些不需要#39 ;吨。例如,采用非上下文无关语言L = {a ^ n b ^ n c ^ n}。这种语言的补充是无背景的,虽然你使用的规则的草率应用可能会让你相信(直到你正确地考虑了这个问题)。