我想翻译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
或{{1}为y
为真对于PredicateC
是正确的,那么系统可能会更改它的状态,以便除了z
更改当前值加1之外,所有内容都保持不变。
表示在Erlang中需要大量的管道,至少在我发现的方式。例如,通过在触发条件之前设置一个评估条件的循环,例如:
x
我正在考虑编写一个框架来隐藏这个管道,在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).
函数中包含消息传递,并且希望仍然使它符合OTP标准。如果你知道任何框架已经做到了这一点,或者如果你能想到一个简单的方法来实现它,我将很高兴听到它。
答案 0 :(得分:5)
我相信gen_fsm(3)
行为可能会让您的生活变得更轻松。