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

时间:2018-04-29 23:22:11

标签: java finite-automata computation-theory dfa

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

我输入了状态数字,字母,开始状态和最终状态,但是在写入有限自动机主要关注的转换时停止了。

1 个答案:

答案 0 :(得分:0)

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

  1. 完整的转换表。
  2. 转换图的描述,其中缺失边被解释为转变为"崩溃。"即过渡到"黑洞" state,一个非接受状态,具有该语言所有字符的自循环。
  3. 表单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个。要填写其余的,请添加一个"黑洞"状态4.这对所有字符都有一个自循环。对于缺少某个字符i的外向转换的每个节点c,请添加转换i 4 c以完成DFA。

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

    之类的下一个状态
    nextState = transitionMap.get(s).get(c)
    

    请注意,无需向其明确添加状态4或所有转换。相反,在评估上述表达式时,只需使机器在nextState结果为null时拒绝。