【问题标题】:How to determine whether finite-state automata is deterministic?如何确定有限状态自动机是否是确定性的?
【发布时间】:2015-02-28 20:20:23
【问题描述】:

如何编写 Java 代码来确定给定的自动机是否是确定性的。我有一个代表自动机的类,它有以下五个变量:

int alphabet_size;
int n_states;
int delta[][];
int initial_state;
int accepting_states[];

Delta 表示以下,例如在真正的自动机中q1, 1, q2 在程序中看起来像{1, 1, 2}。我知道在非确定性自动机中可能有不止一种可能的状态,但我不知道如何计算。

【问题讨论】:

    标签: finite-automata automata formal-languages


    【解决方案1】:

    要解决它,我会这样做:

    1. 创建一个映射(字符串、字符串或整数),我将使用键来检查实际状态>符号是什么以及跟踪事务进入哪个状态的值(如果实际状态没有,则为 null 或 -1具有该符号的交易);
    2. 填充映射键和值,例如:map.put("1>1", null) 表示从状态 1 和符号 1 变为 null。现在,为每种可能性设置 null 或 -1;
    3. 遍历您的交易可能性,构建密钥字符串,从映射中检索相应的值。如果为空,则包含进入的状态编号,否则表示有另一个来自同一状态的具有相同符号的事务进入不同的状态,因此它不是确定性的;

    如果您可以遍历整个数组,则它是确定性的!

    【讨论】:

      【解决方案2】:

      使用您现在拥有的成员变量,您只能表示确定性 FSA。为什么?因为 NDFSA 是一个状态 q1 和输入 a 使得两者都

      • (q1, a) -> q2
      • (q1, a) -> q3

      在三角洲。您将这个 (qfrom, input) -> qto 映射实现为 int[][],这意味着对于每个 instate-input 对,您只能存储一个外州。

      一个非常快速的解决方法是允许所有状态输入对的外状态列表,如下所示:

      ArrayList[][] delta;
      

      但是,这很难看。如果您意识到 delta 实际上是 qfrom -> input -> qto 的映射,我们可以得出一个更好的解决方案*,并且它可以用两种方式括起来:

      • (qfrom -> input) -> qto:这就是你所拥有的,只是符号略有不同
      • qfrom -> (输入 -> qto)

      要意识到的另一件事是int[] 在概念上与Map<Integer, Integer> 相同。这样,第二个映射可以在 Java 中实现为:

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

      无论您选择哪种实现,决定 FSA 是否具有确定性的测试都非常简单,并且来自定义:A 是 DFSA,如果 delta 中所有列表的长度 。

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

      【讨论】:

        猜你喜欢
        • 2013-10-19
        • 1970-01-01
        • 2011-11-22
        • 2011-04-21
        • 1970-01-01
        • 2015-01-10
        • 2018-07-14
        • 2013-04-28
        • 2013-11-29
        相关资源
        最近更新 更多