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