얼랭에서 행동의 시간적 논리를 표현합니다.어떤 자연스러운 방법이 있나요?
문제
다음에 지정된 일부 작업을 번역하고 싶습니다. TLA ~에 얼랭.Erlang에서 직접 이 작업을 수행하는 자연스러운 방법이나 이를 위해 사용할 수 있는 프레임워크를 생각할 수 있습니까?간단히 말해서(아주 작은 것) TLA 작업은 변수에 대한 조건이며, 그 중 일부는 프라이밍되어 다음 상태의 변수 값을 나타냅니다.예를 들어:
Action(x,y,z) ->
and PredicateA(x),
and or PredicateB(y)
or PredicateC(z)
and x' = x+1
이 작업은 시스템 상태가 다음과 같을 때마다 다음을 의미합니다. PredicateA
변수에 대해서는 true입니다. 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_new_info()
기능을 수행하며 여전히 OTP를 준수할 수 있기를 바랍니다.이미 이를 수행하는 프레임워크를 알고 있거나 이를 구현하는 간단한 방법을 생각할 수 있다면 이에 대해 듣고 싶습니다.
해결책
나는 믿는다 gen_fsm(3)
행동은 아마도 당신의 삶을 약간 더 쉽게 만들 수 있습니다.
FSM의 유한 상태 머신, Flying Spaghetti Monster는 아니지만 후자도 도움이 될 수 있습니다.