用erlang表示动作的时态逻辑。有什么自然的方法吗?

用erlang表示动作的时态逻辑。有什么自然的方法吗?,erlang,tla+,Erlang,Tla+,我想翻译中指定的一些操作。您能想到任何直接在Erlang中实现这一点的自然方法,或者任何可用于此目的的框架吗?简言之(非常小的一个),TLA动作是变量的条件,其中一些变量已启动,这意味着它们代表下一个状态中变量的值。例如: Action(x,y,z) -> and PredicateA(x), and or PredicateB(y) or PredicateC(z) and x' = x+1 此操作意味着,当系统状态为PredicateA对变量x

我想翻译中指定的一些操作。您能想到任何直接在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\u new\u info()
函数中,希望它仍然符合OTP。如果你知道任何一个框架已经做到了这一点,或者如果你能想出一个简单的方法来实现这一点,我会很高兴听到它。

我相信行为可能会让你的生活稍微轻松一些


FSM来自,而不是飞行的意大利面怪兽,尽管后者也会有所帮助。

我上面代码片段中的State和NewState变量是gen_server意义上的状态。如果我将此代码转换为FSM,它将是一个具有两种状态的代码,“等待”和“尝试处理”,以及一系列可能要从等待状态处理的事件,将其移动到尝试状态以在实际执行之前检查所有操作的条件。我不确定这是否应该得到实施。至于其他FSM,它们对我来说太严格了:)