有几种算法可以执行此任务:Brzozowski 和 Mc Cluskey 的“状态消除法”、线性方程组的求解、McNaughton 和 Yamada 的方法等。它们在自动机和有理式 http://arxiv.org/abs/1502.03573作者:雅克·萨卡罗维奇。
状态消除法尤其容易理解。关键思想是您将构建一个由理性(又称正则)表达式而不是字母标记的自动机。首先,确保您有一个初始状态和一个最终状态(如果需要,您可以添加新状态和自发转换)。然后选择一个状态s进行消除,如下图的状态1。
然后考虑所有对 (p, q),其中 p 是前驱(从该状态开始转移到达图中的 s, 0),q 是后继(状态 2)。对于每个这样的对 (p, q),添加从 p 到 q 的转换,其标记为 E(p, q) + E(p, s)E(s, s)*E(s, q),其中 E(p, q) + E(p, s)E(s, s)*E(s, q) , s) 表示“标记从 p 到 s 的转换的表达式。处理完所有对 (p, q) 后,删除状态 s。在前面的示例中:
这样做直到消除所有内部状态(即保留初始状态和最终状态),然后读取从初始状态到最终状态的转换结果(此处为 d+ab*c)。
你可以使用这个算法来玩弄Vcsn http://vcsn.lrde.epita.fr,有理表达式和自动机的工具。这是一个完整的示例,您可以在以下位置复制:VCSN沙箱 http://vcsn-sandbox.lrde.epita.fr.