Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在为动态DFA编写代码时,如何表示转换?_Java_Finite Automata_Computation Theory_Dfa - Fatal编程技术网

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

Java 在为动态DFA编写代码时,如何表示转换?,java,finite-automata,computation-theory,dfa,Java,Finite Automata,Computation Theory,Dfa,我想编写一个java程序,为任何语言和任何字母表构建一个动态有限自动机,然后测试机器接受或拒绝任何给定的单词 我输入了状态编号、字母表、开始状态和最终状态,但在编写转换时停止了,这正是有限自动机的主要功能。这是一个不错的项目。正如您所说,您首先需要仔细定义一种输入语言来描述任何FA。除了已有的,还需要状态转换。这通常通过以下两种方式之一完成: 一张完整的过渡桌 过渡图的一种描述,其中缺失的边被解释为向“崩溃”的过渡,即向“黑洞”状态的过渡,即语言的所有字符都具有自循环的不可接受状态 表单1更易于

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


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

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

  • 一张完整的过渡桌
  • 过渡图的一种描述,其中缺失的边被解释为向“崩溃”的过渡,即向“黑洞”状态的过渡,即语言的所有字符都具有自循环的不可接受状态
  • 表单1更易于阅读,但不太方便,因为必须显式指定所有转换。表格二更方便。我推荐表格二。具有此表单的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。这在所有字符上都有一个自循环。对于缺少某个字符
    c
    上的传出转换的每个节点
    i
    ,添加转换
    i 4 c
    ,以完成DFA

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

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

    请注意,不需要显式地向其添加状态4或所有转换。相反,在计算上述表达式时,只要让机器在
    nextState
    结果为
    null

    时拒绝,您就需要问一个有明确编码答案的特定问题。@PeterLawrey好的,谢谢!