You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python的greenery模块为有限状态机(FSM)添加往返状态A的ε迁移

解决greenery FSM中添加ε迁移的问题

我之前研究过greenery的FSM实现,刚好清楚怎么处理ε迁移的问题!greenery里的ε(空迁移)是用**空字符串''**来表示的,不需要把它加入到alphabet集合里——因为ε本身不属于输入字母表,是特殊的迁移符号。

针对你想给状态添加往返ε迁移的需求,我分两种常见场景给你示例:

场景1:给单个状态添加自环ε迁移(状态→自身的往返ε)

比如要给你原代码里的状态E添加自环ε迁移,修改后的FSM代码如下:

from greenery import fsm, lego

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

# 创建带ε自环的FSM
machine = fsm.fsm(
    alphabet = {o, z},  # 不需要加入'',ε是特殊符号
    states = {E, O},
    initial = E,
    finals = {E},
    map = {
        E : {
            z: O, 
            o: E,
            '': E  # 这里添加E到自身的ε迁移(可以随时通过ε停留在E,实现往返效果)
        },
        O : {
            o: O, 
            z: E
        },
    },
)

# 转换为正则表达式验证
rex = lego.from_fsm(machine)
print(rex)

这段代码里,E : {..., '': E}就实现了状态E的自环ε迁移——相当于在E状态时,不需要输入任何字符,就可以停留在E状态,满足“往返”的需求。

场景2:两个状态之间添加双向ε迁移(状态A↔状态B的往返ε)

如果是要在两个状态(比如新增一个状态A)之间添加双向ε迁移,示例代码如下:

from greenery import fsm, lego

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

# 创建带双向ε迁移的FSM
machine = fsm.fsm(
    alphabet = {o, z},
    states = {E, O, A},
    initial = E,
    finals = {E},
    map = {
        E : {
            z: O, 
            o: E,
            '': A  # E→A的ε迁移
        },
        O : {
            o: O, 
            z: E
        },
        A : {
            '': E  # A→E的ε迁移,实现E和A的双向往返
        }
    },
)

rex = lego.from_fsm(machine)
print(rex)

这里E可以通过ε迁移到A,A也可以通过ε迁移回到E,完美实现两个状态之间的往返ε迁移。

验证迁移是否生效

你可以通过machine.accepts()方法测试FSM的行为,比如对于场景1的FSM:

  • machine.accepts("") → 返回True(初始状态E是终态,且自环ε允许空输入)
  • machine.accepts("0") → 返回False(输入0从E到O,O不是终态)
  • machine.accepts("1") → 返回True(输入1从E到E,终态)

这样就能确认ε迁移已经正常工作了。

内容的提问来源于stack exchange,提问作者user963241

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 19:32:28