常规语言演示

问题描述

考虑这个函数

Faro(x,z) 假设值:z if x = ε and a.faro(z,y) if x = ay
递归函数也是如此,例如我们有 faro(00110,0101) = 000110110

我必须证明,如果 L 和 M 是同一个字母表上的常规语言,我们有 faro(L,M) = {faro(x,z) | x 在 L 上,z 在 M 上} 是正则。

我不确定哪种方法是展示结果的最佳方法。我现在是第一次研究这种类型的问题。

创建 DFA 还是使用泵引理更方便?

解决方法

看起来这里发生的事情是 faro 函数接受两个字符串并将它们交错: faro(a1a2a3...an,b1b2b3...bm) = a1b1a2b2a3b3...anbn...bm(假设 wlog m >= n).

如果您可以证明有关 faro 函数的语义事实令您和其他人满意,那么生成一个执行相同操作的 NFA 似乎是可以实现的:

  1. 在 NFA 中为每个三元组 (q,q',s) 创建四个状态,其中 q 是 L 的 DFA 中的状态,q' 是 M 的 DFA 中的状态,s 是 L、M、L' 或 M ';
  2. 使开始状态 (q0,q0',L) 表示我们将根据 L 的 DFA 开始读取,但仍有交替可用的可能性
  3. 可能,接受状态只是那些 q 在 L 的 DFA 中接受而 q' 在 M 的 DFA 中接受的状态......但我会让你在这里完成细节
  4. 转换将按如下方式工作:
  • 当您在状态 (q,L) 中看到符号 a 时,请转到状态 (w,M) 和 (w,L'),其中 L 的 DFA 从q 到 w 在 a 上。这意味着我们可以接受来自 M 的字符串的下一个交错符号,或者我们可以只从 L 读取字符串的其余部分,而不能从 M 中获取更多的字符串

  • 当你在状态 (q,M) 中看到符号 a 时,转到状态 (q,w',L) 和 (q,M'),类似上面

  • 当你在状态 (q,L') 中看到符号 a 时,转到状态 (w,L');记住,L' 意味着我们放弃了从 M 中的字符串中读取交错符号

  • 当你在状态(q,M')中看到符号a时,转到状态(q,M'),类似上面

这是一个 NFA,所以如果至少有一个路径通过接受,则字符串被接受。这是应该的,因为如果一个字符串可以被解释为 faro(x,y) for x in L 和 y in M 的某些结果,我们的 NFA 应该接受它。我们的 NFA 通过跟踪:

  1. 到目前为止,由 (q,s) 中的分量 q 读取了多少 x
  2. 到目前为止,由 (q,s) 中的分量 q' 读取了多少 y
  3. 接下来是否需要从 x 或 y 读取符号,通过 (q,s) 中的分量 s
  4. 我们是否能够通过 (q,s) 中的分量 s 从 x 或 y 中读取

我认为接下来的步骤可能是做几个简单的例子来看看这个构造是否有效,如果是,那么继续证明这个 NFA 的语言是想要的(在这里通过归纳证明是个好主意)。一旦您证明您的语言存在 NFA,您就大功告成了。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...