用erlang表示动作的时态逻辑。有什么自然的方法吗?
我想翻译中指定的一些操作。您能想到任何直接在Erlang中实现这一点的自然方法,或者任何可用于此目的的框架吗?简言之(非常小的一个),TLA动作是变量的条件,其中一些变量已启动,这意味着它们代表下一个状态中变量的值。例如:用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
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,它们对我来说太严格了:)