выражая временную логику действий в эрланге. любой естественный способ? - PullRequest
7 голосов
/ 16 февраля 2011

Я хотел бы перевести некоторые действия, указанные в 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 Ответ

5 голосов
/ 17 февраля 2011

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

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

...