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