Как нарисовать конечный автомат - PullRequest
0 голосов
/ 05 мая 2019

Как нарисовать конечный автомат по этому коду

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 голосов
/ 05 мая 2019

В реализации fsm в erlang:

  1. Рекурсивная функция - это state, поэтому у вашего fsm есть только одно состояние, то есть machine, которое даже незвучит как государственное название.Скорее, «машина» или «калькулятор» будет более подходящим именем для fsm (модуля).

  2. Полученное сообщение является event.

  3. action - это функция, которая вызывается в ответ на событие.

Если вы посмотрите на LYSE Ваш ФСМ по сути является котом.В вашем случае есть два пути назад к исходному состоянию, и каждый путь требует двух событий.Итак, что-то вроде этого:

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 ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...