【发布时间】:2016-02-23 09:38:37
【问题描述】:
在字母表 ∑ = {0, 1} 上为以下语言编写正则表达式:
- 所有不以 11 结尾的字符串的语言。
- 不包含子字符串 01 的所有字符串的语言。 还 为上述每种语言绘制有限自动机。
【问题讨论】:
-
没有。我不想。不过,说真的,你至少应该假装自己已经做出了一些努力——向我们展示你的尝试,并解释它如何没有按照你期望的方式工作......
在字母表 ∑ = {0, 1} 上为以下语言编写正则表达式:
【问题讨论】:
第一个正则表达式是e + 0 + 1 + S* (00 + 01 + 10),其中e 是空字符串,S 是字母表,* 是Kleene 闭包,+ 是联合。这是可行的,因为该语言可以分为长度小于 2 的字符串 (e + 0 + 1) 和长度至少为 2 且不以 11 结尾的字符串(这会留下结尾 00、01 和 @987654330 @)。
第二种语言的正则表达式是1*0*。请注意,我们必须将任何1s 放在所有0s 的左侧以避免子字符串01,但我们可以有任意多个。
第一个的 DFA 看起来像
q e q'
q0 0 q0
q0 1 q1
q1 0 q0
q1 1 q2
q2 0 q0
q2 1 q2
状态 q0 是初始状态,q0 和 q1 正在接受。在状态 q0 中,您要么刚开始,要么最后一次看到零;您的最后一个符号不是 1。在状态 q1 中,您的最后一个符号是 1,但倒数第二个符号不是。在状态 q2 中,您连续看到两个 1。
第二个的 DFA 如下所示:
q e q'
q0 0 q1
q0 1 q0
q1 0 q1
q1 1 q2
q2 0 q2
q2 1 q2
q0 是初始状态,q0 和 q1 正在接受。 q0 读取所有 0,q1 读取所有 1,如果我们在看到 1 之后看到 0,就会发生 q2。
【讨论】: