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

标签 algorithm finite-automata state-machine deterministic

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

关键字 IF 的 FSA: IF

  ___        ___         _
 /   \  I   /   \  F   // \\
>| 0 |----->| 1 |----->||2||
 \___/      \___/      \\_//

ID 的 FSA: [A-Z][A-Z0-9]*

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

我可以使用什么算法将它们组合成具有三个最终状态的单个确定性有限状态自动机,由以下转换图表示:

            -----------------------
            | 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

最佳答案

教科书通常通过应用 de-morgan 给出自动机 C 使得 L(C) = L(A) U L(B)在上面,L(C) = (L(A)C [intersection] L(B)C)C
求交是通过构建笛卡尔乘积自动机完成的,求反只是简单地切换接受状态。
构建联合自动机也可以直接完成:构建笛卡尔积自动机,最终状态是状态(a,b)使得aA 的自动机中的最终状态或 bB

的自动机中的最终状态

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

问题 - 这个自动机不会是最小的(可能远非如此)。您可以尝试使用 this algorithm在生成的自动机上以最小化它。

关于algorithm - 如何合并两个有限状态自动机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11201643/

相关文章:

algorithm - 承认这种语言的最少州数是多少?

java - 如何将 NFA/DFA 转换为 java?

java - StateMachineBuilder 计时器崩溃

c - ONP 中的段错误

algorithm - 如何在 O(logn) 中查找排序数组中数字的出现次数

algorithm - 需要 Krovetz 词干提取算法 ( KStemming) 帮助

model - 可以在序言中模拟一个简单的 CPU 吗?

algorithm - 最大化回车算法的#(贪心?)

computer-science - 是否有任何程序可以绘制和测试状态机、图灵机等?

java - 如何从流程外部监控 Camel 飞行中的消息