【问题标题】:Is a language L = {s ∈ (0 + 1)* | d(s) mod 5 =2 and d(s) mod 7 !=4 } regular?是一种语言 L = {s ∈ (0 + 1)* | d(s) mod 5 =2 和 d(s) mod 7 !=4 } 常规?
【发布时间】:2011-11-04 20:15:08
【问题描述】:

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

上面提到了

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 的十进制值(例如 d(101) = 5)

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

【问题讨论】:

  • @nightcracker:不,不应该。请查看 ctheory 的常见问题解答。
  • 应该在 Math.SE 上。
  • 您似乎打算将 d(s) 作为 二进制 数的 s 值,与十进制无关。

标签: regular-language dfa


【解决方案1】:

您的教科书有错误,或者您误读了它:您命名的第二语言是常规语言。

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 表示法,但要获得您的表示法,只需将 | 替换为 + 并删除 $)。

【讨论】:

    猜你喜欢
    • 2015-06-10
    • 1970-01-01
    • 2015-07-22
    • 2020-06-29
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    相关资源
    最近更新 更多