我需要一些帮助来确定给定的语言是常规的、上下文无关的还是非上下文无关的。答案中简短的非正式解释就足够了,因此无需使用抽水引理。
可以说我有以下语言:
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 个比较,我们需要更多的堆栈。
是我的推理权利吗?我很快就要考试了,需要知道我是否有这个想法。
提前致谢