无 ε 的 RE 到 FSA 的转换

问题描述

我有一个调节器表达式

10+(0+11)*1

如何将调节器表达式更改为有限状态自动机?

解决方法

一方面在 RE 和 NFA 之间的等价性propf 中使用了算法,另一方面在 NFA 和 DFA 之间使用了算法。这是一种选择,不需要深入了解或理解 RE 生成的语言。

另一种选择是先尝试理解该语言,然后从头开始为该语言编写 DFA。

我将向您展示的方式涉及 Myhill-Nerode 定理,该定理表明,常规语言在不可区分性关系上具有与该语言的最小 DFA 中的状态一样多的等价类。如果可以将同一组字符串附加到它们以获得语言中的某些字符串,则两个字符串在语言方面无法区分。例如,字符串 a、b 和 ba 是可区分的 w.r.t. L(ab) 因为 a 可以跟 b,b 后面只有空字符串,而 ba 后面没有(空集)以获得 L 中的字符串。这告诉我们 ab 的最小 DFA至少需要三个状态。

对于你的语言,L(10 + (0 + 11)*1,我们观察到:

  • 空字符串是我们首先查看的。它需要一个状态——DFA 的初始状态——并且可以跟在 L 中的任何字符串之后以获得 L 中的一个字符串。将此状态称为 [e]。

  • 字符串0后面可以跟1,得到语言中的字符串;这使它与空字符串不同,因此需要一个新状态。称之为 [0]。

  • 字符串1后面可以跟空字符串,得到语言中的另一个字符串;这使得它与空字符串和字符串 0 区分开来。调用它的状态 [1]。

  • 字符串 00 后面可以跟与 0 完全相同的字符串,以获取语言中的字符串。这意味着 00 不需要新状态; 00 会将我们的 DFA 带到状态 [0]。

  • 字符串 01 后面可以跟 1(0 + 11)*1 形式的字符串以获取语言中的字符串。这是新的,所以我们需要一个新的状态。叫这个[01]

  • 字符串 10 后面可以跟空字符串,只能得到 L 中的字符串。这是新的,所以调用它的状态 [10]。

  • 字符串 11 后面可以跟与 0 完全相同的字符串,以获取语言中的字符串。 11 将使我们的 DFA 状态为 [0]。

  • 字符串 010 永远不会导致该语言中的字符串;它必须在我们的最小 DFA 中导致死亡状态。叫这个[010]。

  • 字符串 011 与字符串 0 和 11 无法区分。

  • 字符串 100 和 101 不能导致语言中的字符串,因此它必须将我们的 DFA 带到死状态 [010]。

我们发现我们需要的状态是:[e]、[0]、[1]、[01]、[10] 和 [010]。转换并不难弄清楚:

  • [e] 分别在输入 0 和 1 上转换为 [0] 和 [1]
  • [0] 分别在输入 0 和 1 上转换为 [0] 和 [01]
  • [1] 分别在输入 0 和 1 上转换为 [10] 和 [0]
  • [01] 分别在输入 0 和 1 上转换为 [010] 和 [0]
  • [10] 转换为 [010] ob 输入 0 或 1
  • [010] 总是转换到自身

您现在对您的语言有一个最低限度的 DFA,以及这种最低限度的证明。

相关问答

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