Выражая временную логику действий в эрланге. любой естественный способ?

Я хотел бы перевести некоторые действия, указанные в TLA на Erlang. Можете ли вы придумать какой-нибудь естественный способ сделать это непосредственно в Erlang или какую-либо инфраструктуру, доступную для этого? В двух словах (очень маленький), действия TLA - это условия для переменных, некоторые из которых являются загрунтованными, то есть они представляют значения переменных в следующем состоянии. Например:

Action(x,y,z) ->
    and PredicateA(x),
    and or PredicateB(y)
        or PredicateC(z)
    and x' = x+1

Это действие означает, что всякий раз, когда состояние системы таково, что PredicateA верно для переменной x и либо PredicateB верно для y или же PredicateC верно для zто система может изменить свое состояние так, чтобы все оставалось прежним, за исключением того, что x изменяется на текущее значение плюс 1.

Выражение того, что в Эрланге требует много сантехники, по крайней мере, так, как я нашел. Например, имея цикл, который оценивает условия до их запуска, например:

what_to_do(State,NewInfo) ->
    PA = IsPredicateA(State,NewInfo),
    PB = IsPredicateB(State,NewInfo),
    PC = IsPredicateC(State,NewInfo),
    [{can_do_Action1, PA and (PB or PC}, %this is the action specified above.
     {can_do_Action2, PA and PC},        %this is some other action
     {can_do_Action3, true}]             %this is some action that may be executed at any time.

 loop(State) ->
     NewInfo = get_new_info(),
     CanDo = what_to_do(State,NewInfo),
     RandomAction = rand_action(CanDo),

     case RandDomAction of
          can_do_Action1 -> NewState = Action(x,y,z);
          can_do_Action2 -> NewState = Action2(State);
          can_do_Action3 -> NewState = Action3(State)
     end,
     NewestState = clean_up_old_info(NewState,NewInfo),
     loop(NewestState).

Я имею в виду написание основы для сокрытия этого слесарного дела, включая передачу сообщений внутри get_new_info() функционировать и, надеюсь, все еще делает его OTP-совместимым. Если вам известна какая-либо инфраструктура, которая уже делает это, или если вы можете придумать простой способ реализации этого, я был бы рад услышать об этом.

1 ответ

Решение

Я верю gen_fsm(3) поведение может сделать вашу жизнь немного проще.

FSM из Finite State Machine, а не Flying Spaghetti Monster, хотя последний тоже может помочь.

Другие вопросы по тегам