【问题标题】:How to draw a Finite state machine如何绘制有限状态机
【发布时间】:2019-05-05 03:31:23
【问题描述】:

如何根据这段代码绘制一个有限状态机

machine() ->
 receive
 {add, P} -> receive {X, Y} -> P!(X + Y), machine() end;
 {sub, P} -> receive {X, Y} -> P!(X - Y), machine() end
 end.

【问题讨论】:

    标签: erlang fsm


    【解决方案1】:

    在 fsm 的 erlang 实现中:

    1. 递归函数是state,因此您的 fsm 只有一个状态,即 machine,这听起来甚至不像是状态名称。相反,“机器”或“计算器”将是 fsm(模块)更合适的名称。

    2. 收到的消息是event

    3. action 是为响应事件而调用的函数。

    如果您查看LYSE,您的 fsm 本质上就是猫。在您的情况下,有两条路径可以返回原始状态,并且每条路径都需要两个事件。所以,是这样的:

    但是,也许你的计算器 fsm 应该看起来更像这样:

    -module(calc).
    -compile(export_all).
    
    selection() ->
        receive
            add -> addition();
            sub -> subtraction();
            _Other   -> selection()
        end.
    
    addition() ->
        receive 
            {X, Y} -> 
                display("~w + ~w = ~w", [X, Y, X+Y]),
                selection();
            _Other -> addition()
        end.
    
    subtraction() ->
        receive 
            {X, Y} -> 
                display("~w - ~w = ~w", [X, Y, X-Y]),
                selection();
            _Other -> subtraction()
        end.
    
    display(Str, Args) ->
        io:format(Str ++ "~n", Args).
    

    在这个fsm中,有三个states

    1. selection(选择操作)
    2. 补充
    3. 减法

    selection state 有两个事件:

    1. add
    2. sub

    addition/subtraction states 有一个事件:

    1. {X, Y}

    加法/减法状态在转换回 selection() 状态之前都执行 display() action

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多