【问题标题】:Proving that a language is regular by giving a regular expression通过给出正则表达式证明一种语言是正则的
【发布时间】:2011-04-21 13:07:39
【问题描述】:

我被这个练习题难住了(不是为了分数):

{w 是 {a,b}* 的一个元素:a 的个数是偶数,b 的个数是偶数 }

我似乎无法弄清楚这一点。 在这种情况下,0 被认为是偶数。 一些可接受的字符串:{}、{aa}、{bb}、{aabb}、{abab}、{bbaa}、{babaabba} 等

我做过类似的例子,其中 a 必须是前缀,答案是: (aa)(bb) 但在这种情况下,它们可以按任何顺序排列。

可以使用 Kleene 星 (*)、并集 (U)、相交 (&) 和串联。

编辑:这个也有问题

{w 是 {0,1}* 的一个元素:w = 1^r 0 1^s 0 对于某些 r,s >= 1}

【问题讨论】:

  • 我没有看到问题..
  • @Kevin 在标题中
  • @Kevin 他想要一个接受 a 和 b 的字符串的正则表达式,其中两者的数量都是偶数。

标签: regex regular-language


【解决方案1】:

这有点难看,但应该可以:

ε U ( (aa) U (bb) U ((ab) U (ba) (ab) U (ba)) )*

第二个:

11*011*0

通常我会在这里使用a+ 而不是aa*

【讨论】:

  • 根据措辞/符号,这可能来自一本理论书,其中许多实际上并没有介绍+ 元字符。严格来说,它不是 RE 理论的一部分,但 Kleene 星是。无论如何,+ 只是aa* 的语法糖,类似于a? 在语义上与a U ε 相同
  • @elderathis 是的,当我学习自动机理论时,我有 + :)
  • @NullUserException 这看起来是正确的,谢谢。我确实理解这些是如何工作的,但我遇到了麻烦。您是否使用过任何流程来帮助您得出答案?
  • @Bobby eldarerathis 关于如何做到这一点有一个很好的答案,但它已被删除。如果您有超过 10k 的代表点,您将能够看到它,但显然您没有。
  • @NullUserException 我想,我只需要努力达到 10K
【解决方案2】:

编辑:未删除的回复:NullUserException 答案中的 cmets。

1)我个人认为,如果您首先构建一个可以接受字符串的 DFA,则这个更容易概念化。我还没有把它写下来,但在我脑海中,我认为你可以用 4 个状态和一个接受状态来做到这一点。从那里您可以通过使用诸如this one 的算法一次删除一个状态来创建等效的正则表达式。这是可能的,因为 DFA 和正则表达式可证明是等价的。

2) 考虑一下 Kleene 星号仅适用于最近的正则表达式这一事实。因此,如果您有两个单独的未分组原子(一个原子本身就是一个正则表达式!),它只适用于第二个(如,ab* 将匹配单个 a,然后匹配任何数字 - 包括 0 - b's)。如果您希望某物存在,但不确定有多少,您可以利用它来发挥自己的优势。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-18
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2013-11-01
    • 2011-01-31
    • 1970-01-01
    相关资源
    最近更新 更多