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

StackOverflow https://stackoverflow.com/questions/5020680

  •  14-11-2019
  •  | 
  •  

Вопрос

Я хотел бы перевести некоторые действия, указанные в ТЛА в Эрланг.Можете ли вы придумать какой-либо естественный способ сделать это непосредственно в 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.

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

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.Если вы знаете какой-либо фреймворк, который уже делает это, или если вы можете придумать простой способ реализации этого, я был бы признателен услышать об этом.

Это было полезно?

Решение

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

FSM от Конечный автомат, а не Летающий макаронный монстр, хотя последнее тоже могло бы помочь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top