在为动态 DFA 编写代码时如何表示转换?

how do i represent transitions when writing a code for a dynamic DFA?

我想编写一个 java 程序来为具有任何字母的任何语言构建一个动态有限自动机,然后测试机器接受或拒绝任何给定的单词。

我输入了状态编号、字母表、开始状态和最终状态,但在写转换时停了下来,这是有限自动机的主要内容。

这是一个不错的项目。正如您所说,您首先需要仔细定义一种输入语言来描述任何 FA。除了您已有的之外,您还需要状态转换。这通常通过以下两种方式之一完成:

  1. 完整过渡table。
  2. 转换图的描述,其中缺失的边被解释为到 "crash." 的转换,即到 "black hole" 状态的转换,一个具有自循环的非接受状态该语言的所有字符。

表格 1 更易于阅读,但不太方便,因为您必须明确指定所有转换。表格2更方便。我推荐表格 2。使用此表格的 DFA 描述可能如下所示:

4  # There are 4 explicit states (plus a 5th for the "black hole")
   # Assume they have state numbers 0 (the start state), 1, 2, 3.
ab # A string of characters in the FSM alphabet
1 3 # Numbers of accepting states.
5 # Number of explicit state transitions
0 1 a # From 0 to 1 on input a
1 1 a # From 1 to 1 on input a
1 2 b # From 1 to 2 on input b
2 3 a # From 2 to 3 on input a
3 3 a # From 3 to 3 on input a

您当然可以想出更奇特的语言,但这一种就足够了,而且解析起来也很简单。

请注意,具有 4 个状态和 2 个输入字符的完全指定的 DFA 具有 2(4)(4-1) = 24 个转换,而我们在此机器中只给出了其中的 5 个。要填充剩余的,请添加一个 "black hole" 状态 4。这对所有字符都有一个自循环。对于缺少某个字符 c 上的传出转换的每个节点 i,添加一个转换 i 4 c 以完成 DFA。

要在 Java 中表示 DFA,一个不错的选择是 Map<Integer, Map<Character, Integer>>。第一个映射键是州编号。第二个是输入字符。最终值是另一个状态编号。因此,如果您当前处于 s 状态并且输入字符是 c,您将获得下一个状态

nextState = transitionMap.get(s).get(c)

请注意,无需显式添加状态 4 或所有转换。相反,在评估上面的表达式时,只要 nextState 结果是 null.

就可以让机器拒绝