【问题标题】:Finding regular expressions for languages otherwise described查找其他描述的语言的正则表达式
【发布时间】:2011-11-29 10:04:48
【问题描述】:

设 {a b} 为字母集,写一个正则表达式:

1) a 和 b 的个数都是奇数的所有单词的语言;

2) 所有长度为奇数且包含子字符串 ab 的单词的语言。

另外,如果可能的话,请帮我找到两种不同的表达方式,以帮助我加深对如何解决此类问题的理解。

【问题讨论】:

  • 您需要提供更多有关您的背景的信息。您是否见过 DFA --> 正则表达式缩减或抽引引理?
  • 不知道该说什么……第一次学习自动机理论,做了一点正则表达式……我可以给你一个例子,说明我能解决多少这个问题。
  • 回答第一个,a(aa)*b(bb)*+b(bb)*a(aa)* ...这将生成一个奇数的 # 的 a 和 b 的语言,但是位置不会是随机的
  • @user975411:我认为这些位置应该是“随机的”,即任意的......

标签: regex automata


【解决方案1】:

对于第一个,您可以构建一个简单的 4 态 DFA 来识别语言。然后,您可以使用可从 Kleene 定理(他说 FA 识别的所有语言都由 RE 生成的部分)中恢复的算法来获得有效的 RE……或者只是从图中推理出来。

对于第二个,您知道 (ab) 是 RE 的一部分;现在,您需要考虑所有可以添加奇数字符(正面或背面)的独特方法,并将所有这些可能性与 + 连接起来,以获得简单、正确的 RE。

我认为没有人特别喜欢只给你答案的想法。

编辑:

所以现在已经过了一段时间,我将完成第一个的答案,向感兴趣的读者展示如何做到这一点。

我们的第一个 FA 是这样的:

   Q s f(Q, s)
  -- - -------
  EE a     OE
  EE b     EO
  OE a     EE
  OE b     OO
  EO a     OO
  EO b     EE
  OO a     EO
  OO b     OE

我们将从这里删除状态并用正则表达式替换 s 以覆盖该状态。我们从一个简单的开始……让我们摆脱 OE。这是那个表...

   Q                  regex f(Q, s)
  -- ---------------------- -------
  EE                     aa      EE
  EE                     ab      OO
  EE                      b      EO
  EO                      a      OO
  EO                      b      EE
  OO                      a      EO
  OO                     ba      EE
  OO                     bb      OO

在继续之前说服自己这是正确的。接下来,我们摆脱 EO:

   Q                  regex f(Q, s)
  -- ---------------------- -------
  EE                  aa+bb      EE
  EE                  ab+ba      OO
  OO                  ab+ba      EE
  OO                  aa+bb      OO

为了让下一步更简单,我们引入了一个新的起始集 X 和一个新的接受状态 Y; OO 不再接受。我们消除了对 OO 的需求:

   Q                        regex f(Q, s)
  -- ---------------------------- -------
   X                        empty      EE
  EE aa+bb+(ab+ba)(aa+bb)*(ab+ba)      EE
  EE              (ab+ba)(aa+bb)*       Y

因此,最终的正则表达式是

  (aa+bb+(ab+ba)(aa+bb)*(ab+ba))*(ab+ba)(aa+bb)*

我们可以开始尝试列出生成的最小字符串,作为基本的健全性检查:{ab, ba, aaab, aaba, bbab, bbba, abaa, abbb, baaa, babb, ...}我!

可以将每个步骤的归约规则形式化,或者您可以仔细推理以确保您得到正确的结果。检查 Kleene 定理的证明以进行仔细分析。另外,Martin's Introduction to Formal Languages 之类的有很好的使用这种算法的例子。

【讨论】:

  • 是的,谢谢...但是我遇到的问题是我不确定如何在保持该表达式的同时进行随机化 (a(aa)*b(bb)*+b(bb)* a(aa)*) 我保持一致......也许我需要阅读我正在做的书的更多部分......
  • 你能做 DFA 吗?如果是这样,则有一种算法可以恢复 RE,您根本不需要做任何思考……只需按照步骤操作即可!可能有一个在线的 Java 应用程序可以免费进行这种转换。
  • 我仍然无法导出表达式..你能不能告诉我如何为奇数个字符绘制 DFA ..
  • 有四种状态,分别称为EE、EO、OE和OO。 EE 是开始状态。 OO 是唯一的接受状态。 E 表示“到目前为止的偶数”,O 表示“到目前为止的奇数”,第一个字母表示有多少 a,第二个字母表示多少 b。每次看到每个字母时,E 都会转到 O,反之亦然。
猜你喜欢
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
相关资源
最近更新 更多