你的教科书要么有错误,要么你读错了:你命名的第二语言是常规语言。
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 表示法,但要获得您的表示法,只需将 | 替换为 + 并删除 $)。