如何确定有限状态自动机是否具有确定性?

时间:2015-02-28 20:20:23

标签: finite-automata automata formal-languages

我有一个自动化课程,真的困扰我的困难。我今天花了将近5个小时,却没有真正知道它是否正确。任务是编写一个Java代码,用于确定给定的自动机是否具有确定性。我所拥有的是一个代表自动机的类,它有以下五个变量:     int alphabet_size;     int n_states;     int delta [] [];     int initial_state;     int accepting_states [];

Delta代表以下例如在实际自动机中,程序中的q1,1,q2看起来像{1,1,2}。我知道在非确定性自动机中可能存在多个可能的状态,但我不知道如何计算它。

提前致谢。

2 个答案:

答案 0 :(得分:0)

为了解决这个问题,我会这样做:

  1. 创建一个Map(字符串,字符串或整数),我将使用该键来检查实际状态>符号是什么以及跟踪事务所处状态的值(如果实际状态没有,则为null或-1)带有该符号的交易);
  2. 填充地图键和值,例如:map.put(“1> 1”,null)表示从状态1开始,符号1变为空。现在,为每种可能性设置null或-1;
  3. 迭代您的交易可能性,构建关键字符串,从地图中检索相应的值。如果它为null,则包含进入的状态的数量,否则表示存在来自相同状态的另一个事务,该事务具有相同的符号,进入不同的状态,因此它不是确定性的;
  4. 如果你可以迭代整个数组,那就是确定性的!

答案 1 :(得分:0)

使用您现在拥有的成员变量,您只能代表确定性FSA。为什么?因为NDFSA是一个存在状态 q 1 并且输入 a 以使其同时存在的

  • (q 1 ,a) - &gt; q <子> 2
  • (q 1 ,a) - &gt; q <子> 3

是三角洲。你实现了这个(q from ,input) - &gt; q to 映射为int[][],这意味着对于每个instate-input对,您只能存储一个州。

一个非常快速的解决方法是允许所有instate-input对的列表列表,如下所示:

ArrayList[][] delta;

然而,这很难看。如果您意识到delta实际上是来自 - &gt;的映射 q ,我们可以得到更好的解决方案*输入 - &gt; q to ,它可以用两种方式括起来:

  • (q from - &gt; input) - &gt; q to :这就是你所拥有的,有一点不同的符号
  • q from - &gt; (输入 - &gt; q

要认识到的另一件事是int[]在概念上与Map<Integer, Integer>相同。有了它,第二个映射可以用Java实现:

Map<Integer, Map<Integer, List<Integer>>> delta;

无论您选择哪种实现,决定FSA是否具有确定性的测试都非常简单,并且来自定义: A是DFSA iff delta中所有列表的长度是&lt; ; = 1;否则,它是NDFSA

*请注意,真正的FSA库通常使用不同的方法。例如,foma使用具有字段instate,outstate和输入字符的转换对象数组。但是,对于初学者来说,上面的那些可能更容易处理。