我想编写一个java程序,为任何具有任何字母表的语言构建动态有限自动机,然后测试机器接受或拒绝任何给定的单词。
我输入了状态数字,字母,开始状态和最终状态,但是在写入有限自动机主要关注的转换时停止了。
答案 0 :(得分:0)
这是一个不错的项目。正如您所说,您首先需要仔细定义输入语言来描述任何FA。除了你已经拥有的,你还需要状态转换。这通常以两种方式之一完成:
表单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
时拒绝。