在erlang中表达动作的时间逻辑。任何自然的方式?

时间:2011-02-16 18:42:16

标签: erlang tla+

我想翻译TLAErlang中指定的某些操作。你能想到在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标准。如果你知道任何框架已经做到了这一点,或者如果你能想到一个简单的方法来实现它,我将很高兴听到它。

1 个答案:

答案 0 :(得分:5)

我相信gen_fsm(3)行为可能会让您的生活变得更轻松。

来自Finite State Machine的FSM,而不是Flying Spaghetti Monster,虽然后者也可以提供帮助。