【问题标题】:Is (0*1*)* equal to (0 | 1)*?(0*1*)* 是否等于 (0 | 1)*?
【发布时间】:2019-12-23 09:50:42
【问题描述】:

正则表达式(0*1*)*(0 | 1)*一样吗?

有人可以为此提供证据或直观的反驳吗?我觉得这是真的,但我正在努力写一个循序渐进的证明。

【问题讨论】:

  • 不,它们不一样
  • 它们都将匹配任意数量的 0 和 1(包括 0)的序列,但它们不“相等”
  • 第一个正则表达式比第二个强吗?你能提供一个例子,一个正则表达式不能满足,而另一个可以吗?
  • @AmilaSenadheera “更强”是什么意思?
  • 我的意思是一个正则表达式代表另一个正则表达式的字符串子集?

标签: state-machine regular-language automata finite-automata


【解决方案1】:

两个不同的正则表达式或两个语法可以生成相同的语言,但正则表达式或语法不一样。有一种从正则表达式构造非确定性有限状态自动机的标准方法,以及从构造确定性有限状态自动机的方法。该方法将为所讨论的正则表达式生成两个不同的自动机。虽然每个人都会识别相同的字符串,但他们会经历不同的状态。

【讨论】:

  • 那么它们应该代表相同的语言。但是 Code Maniac 说“不,它们不一样”。
  • "如果两个正则表达式 p 和 q 对应同一种语言,那么我们写 p = q,否则 p != q"。 ? 在您之前提供的示例((0?1?)*)中是什么意思?
  • @AmilaSenadheera 我不确定你在说什么。所以,让我澄清一下。我们必须区分一种语言和该语言的语法。一种给定的语言,例如任意长度的 0 和 1 的序列,可以有无限数量的文法(或者,在这种情况下,正则表达式等价于正则文法)。正是这些语法在定义上是不同的,尽管它们识别的语言是相同的。
  • 如果FAs 相同,两个正则表达式是否相等?例如0*|1* = 1*|0*,因为这些FAs 是相同的。这就是你提出的观点吗?
  • @AmilaSenadheera 不,我的意思是它们显然是不同的正则表达式,因为它们具有不同的 FSA。即使两个写法不同的正则表达式最终具有相同的 FSA(可能是由于优化),我仍然会说它们是不同的正则表达式。但是它们可以说是等价的,因为它们 (1) 识别相同的语言并且它们都是 (2) 正则表达式,因此可以构建基于有限状态自动机的识别器来识别该语言基于任一正则表达式。
【解决方案2】:

正则表达式是等价的。

我没有完全严格的证明,但随后挥手致意。

R1 = (0*1*)*R2 = (0 | 1)*。这些都是字母表上的正则表达式A = {0, 1}

第 1 部分:

0 | 1 是集合{0, 1}00*1* 的一个元素(因为 0 ∈ 0*ɛ ∈ 1*0 ∘ ɛ = 0),1 也是如此。

因此0 | 10*1* 的子集,这意味着(0 | 1)*(0*1*)* 的子集,即R2 ⊆ R1

第 2 部分:

R2 涵盖了字母表中所有可能的单词A。也就是说,每个只包含字符01 的字符串都在R2 中。 (这对我来说似乎很明显;证明可能涉及* 的定义和/或归纳。)

因此R1 ⊆ R2

通过结合第 1 部分和第 2 部分,我们得到 R1 = R2

【讨论】:

  • 我同意它们是等价的,因为它们识别相同的语言,即相同的字符串集。 但它们是不同的正则表达式。请参阅我对有关语言与该语言的许多可能语法和/或正则表达式之间区别的问题的回答。您可能会为某些编程语言(例如 Python)想出一个 LALR(1) 语法,但是如果您通过一个需要 LL(1) 语法的解析器生成器来处理它,您很快就会意识到 Python 语言和两种不同但不同的语言之间的区别“等价”语法。
  • @RonaldAaronson 这是纯数学。正则表达式不会“识别”,它们会生成字符串集。在这种情况下,它们会生成相同的集合。
  • @melpomene,你的意思是 R1 ~ R2 这个证明,但它们的语法可能与 Ronald Aaronson 所说的不同吗?
  • 那么我会说它们是等价的,因为它们生成相同的字符串集,但它们在此过程中使用不同的“重写规则”。
  • @Ronald Aaronson,再次感谢您的进一步澄清。 melpomene,当我最初要求证明时,它确实有助于我理解。
猜你喜欢
  • 2017-11-28
  • 2013-08-17
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 2012-03-28
  • 1970-01-01
相关资源
最近更新 更多