是一种语言L = {s∈(0 + 1)* | d(s)mod 5 = 2和d(s)mod 7!= 4}常规?

时间:2011-11-04 20:15:08

标签: regular-language dfa

在阅读一本书的时候,我有这个疑问。

提到

L = {s∈(0 + 1)* | n0(s)mod 7 = n1(s)mod5 = 0}是常规的 其中n0(s)= s中的0的数量,n1(s)= s中的1的数量

进一步提到

L = {s∈(0 + 1)* | d(s)mod 5 = 2和d(s)mod 7!= 4}不规则(甚至没有上下文,但它是递归的) 其中d(s)= s的decmial值(例如d(101)= 5)

为什么会这样?是因为DFA没有内存来存储(记住)s的十进制值吗?但是在那种情况下,为什么第一种语言是规则的呢?

1 个答案:

答案 0 :(得分:4)

您的教科书中有错误或者您误读了它:您所说的第二种语言是常规的。

DFA可以计算二进制数(或任何基数)的模数 m (对于任何 m )。只需将 m 状态编号为0到 m -1;读取零时,从当前状态 s 转到( s * 2)mod m ;阅读一个时,转到( s * 2 + 1)mod m 。要看到这种方法有效,只需要看一下二进制是如何工作的,那就是( a + b )mod m =( a mod m + b mod m )mod m (类似于乘法)。

要接受等于 k mod m 的数字,请使 k 成为接受状态;接受与 k mod m 不同的数字,使所有其他状态接受。 这意味着{s∈{0,1} * | d(s)mod 5 = 2}和{s∈{0,1} * | d(s)mod 7!= 4}都是常规语言。语言 L 是它们的交集,常规语言在交集下是封闭的,因此 L 是常规的。

语言{s∈{0,1} * | d(s)mod 5 = 2}被正则表达式'(((0 * 10(10 * 10)* 10 * 11 | 0 * 11)((00 | 1)(10 * 10)* 10 *接受11 | 01)*(00 | 1)(10 * 10)* 0 | 0 * 10(10 * 10)* 0)(0((00 | 1)(10 * 10)* 10 * 11 | 01)* (00 | 1)(10 * 10)* 0 | 1)* 0((00 | 1)(10 * 10)* 10 * 11 | 01)*(00 | 1)(10 * 10)* |(0 * 10(10 * 10)* 10 * 11 | 0 * 11)((00 | 1)(10 * 10)* 10 * 11 | 01)*(00 | 1)(10 * 10)* | 0 * 10 (10 * 10)*)$'(我在这里使用了Python表示法,但是为了获得你的符号,只需要替换| by +并删除$)。