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

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

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

7
задан Ioannis Filippidis 2 September 2017 в 10:11
поделиться