如何绘制有限状态机

时间:2019-05-05 03:31:23

标签: erlang fsm

如何根据此代码绘制有限状态机

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

1 个答案:

答案 0 :(得分:0)

在fsm的erlang实现中:

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

  2. 收到的消息是event

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

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

enter image description here

但是,也许您的计算器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. 选择(选择操作)
  2. 添加
  3. 减法

selection state有两个事件:

  1. add
  2. sub

addition/subtraction states有一个事件:

  1. {X, Y}

加/减状态都先执行display()action,然后再转换回selection()状态。