簡體   English   中英

如何使用 Python 向 FSM 添加 epsilon 移動?

[英]How can I add an epsilon move to FSM using Python?

我正在使用greenery模塊來實現FSM

在此處輸入圖像描述

from greenery import fsm, lego

E, O = range(2)
z, o = '0', '1'

# Create the FSM
machine = fsm.fsm(
    alphabet = {o, z},
    states   = {E, O},
    initial  = E,
    finals   = {E},
    map      = {
            E : {z: O, o: E},
            O : {o: O, z: E},
    },
)

# Convert it to a regex
rex = lego.from_fsm(machine)

print(rex)

問題是:如何添加那些進出狀態 A 的 epsilon 移動? 我找不到任何例子。

似乎greenery是一個用於確定性FSM 的 python 庫

該模塊提供確定性有限狀態機的創建和操作。

您的 FSM是非確定性的:考慮輸入 0,0:您最終可以得到以下狀態:

  1. 偶數--0-->奇數--0-->偶數
  2. 或偶數--0-->奇數--e-->A--e-->偶數--0-->奇數

要使用 greenery,您需要手動(或通過腳本)將您的 FSM 轉換為等效的無 Epsilon FSM:

如果兩個 FSM 接受完全相同的字符串集,則稱它們是等價的。 給定任何非確定性 FSM,總是有可能找到一個沒有 epsilon 轉換的等價的 事實上,給定上面定義和表示的機器,我們可以很容易地定義這樣一個等效的無 epsilon 機器。 因此,給定一個名為 mach 並在 m/4、mis/2 和 mfs/2 中定義的機器,我們將為其命名為 efree(mach) 的無 epsilon 版本定義轉換、初始狀態和最終狀態,如下所示: ...

然后 / 在您執行此操作時,計算非確定性等效 FSM

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM