Algorithm 如何合并两个有限状态自动机?

Algorithm 如何合并两个有限状态自动机?,algorithm,finite-automata,state-machine,deterministic,Algorithm,Finite Automata,State Machine,Deterministic,假设我有两个确定性有限状态自动机,由以下转换图表示: 关键字IF的FSA:IF ___ ___ _ / \ I / \ F // \\ >| 0 |----->| 1 |----->||2|| \___/ \___/ \\_// ID的FSA:[A-Z][A-Z0-9]* ------------ ___ | _ LET | / \ LET //

假设我有两个确定性有限状态自动机,由以下转换图表示:

关键字IF的FSA:IF

  ___        ___         _
 /   \  I   /   \  F   // \\
>| 0 |----->| 1 |----->||2||
 \___/      \___/      \\_//
ID的FSA:[A-Z][A-Z0-9]*

            ------------
  ___       | _    LET |
 /   \ LET  // \\<------
>| 0 |----->||1||
 \___/      \\_//<------
            |      NUM |
            ------------
------------
___| |让|
/\LET/\\\\\\\\\\\\\\\\\\\\\\\\---->1||

\___/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。
通过建立笛卡尔积自动机来完成交集,而否定只是切换接受状态。
构建联合自动机也可以直接完成:构建笛卡尔积自动机,最终状态是状态
(a,b)
,这样
a
a
自动机的最终状态,或者
b
b
自动机的最终状态

另一种方法是通过简单地创建一个新状态来构建a(NFA),并为start(a)和start(B)添加一个epsilon路径,并使用标准算法从自动机中消除非确定性


问题是——这个自动机将不会是最小的(可能远远不是)。您可以尝试在生成的自动机上使用,以便将其最小化。

状态2和状态3之间的“NUM”转换从何而来?否则,看起来您想连接机器并添加从零状态的故障转换。忘记匆忙添加这些。您是手动绘制这些ascii艺术还是使用工具?这两种方法都很好。@Loax我手工绘制了它们。创建一个非确定性有限状态自动机并将其转换为确定性有限状态自动机是一个简单的解决方案。非常感谢。我还将学习德摩根定律
            -----------------------
            | LETTER BUT F OR NUM |   --------
  ___       | _          _   LET  v _ |  LET |
 /   \  I   // \\  F   // \\----->// \\<------
>| 0 |----->||1||----->||2||      ||3||<--------
 \___/      \\_//      \\_//----->\\_//<------ |
   |                         NUM  |      NUM | |
   | ANY LETTER OTHER THAN I      ------------ |
   ---------------------------------------------

1: ID
2: IF (IT'S ALSO AN ID, BUT THE KEYWORD IF HAS A HIGHER PRECEDENCE)
3: ID