常规语言?

时间:2011-04-18 09:20:25

标签: compiler-construction regular-language nfa pumping-lemma

我有一个编译问题。

确定{(ab)^ n | n> = 0}是常规语言吗?

但我可以画出它的NFA。 但如果我使用抽水引理,我会得到一个矛盾的答案。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

我知道这个帖子已经过时了,但为了防止其他学生处于同样的情况,这里有一些讨论。这种语言是常规的,你不能使用抽取引理来证明它是非常规的。

要看到它是常规的,只需生成一个正则表达式来生成它或NFA来识别它。正则表达式是微不足道的:(ab)*。 NFA很容易:两个州;初始国家接受,其他不接受; a;从初始转换到另一个;从其他到最初的b。完成。

让我们看看为什么泵浦引理不能用于此。要使用泵浦引理,您需要选择一个候选子串来泵。对于这种语言,无论你创建多大的字符串,你总会在长度至少为2的符号范围内找到以下子字符串:ab。由于这可能总是构成循环的子串,泵浦引理存在,所以没有办法排除你有一个常规语言与(ab)*在其中的某个地方,仅使用泵浦引理。 (注意:对于足够长的字符串,您也不能排除子字符串ba)。因为你不能选择被抽取的子串(对于它可以采取的位置存在限制,但是那些是引理,而不是你决定的东西),如果任何子串工作,你输了,抽引理无法证明任何事情。

显示例如L = {a ^ k b ^ k | k> = 0}使用抽取引理是不规则的,你需要选择一个字符串,只要它满足PL的假设就与你所采用的子字符串无关。这就是为什么,例如,取一个^ n b ^ n起作用(满足PL假设的所有子串都是a +的形式,并且泵浦将改变a的数量而不改变b的数量。)