얼랭에서 행동의 시간적 논리를 표현합니다.어떤 자연스러운 방법이 있나요?

StackOverflow https://stackoverflow.com/questions/5020680

  •  14-11-2019
  •  | 
  •  

문제

다음에 지정된 일부 작업을 번역하고 싶습니다. 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는 아니지만 후자도 도움이 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top