exprimant la logique temporelle des actions en erlang.de toute manière naturelle?

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

  •  14-11-2019
  •  | 
  •  

Question

Je voudrais traduire certaines actions spécifiées dans TLA dans Erlang.Pouvez-vous penser à une façon naturelle de faire ceci directement en Erlang ou de cadre disponibles pour de telles?En un mot, avec un très petit), LES actions sont des conditions sur les variables, dont certaines sont amorcées en ce sens qu'ils représentent les valeurs des variables dans l'état suivant.Par exemple:

Action(x,y,z) ->
    and PredicateA(x),
    and or PredicateB(y)
        or PredicateC(z)
    and x' = x+1

Cette action signifie que, chaque fois que l'état du système est telle que PredicateA est vrai pour les variables x et soit PredicateB est vrai pour les y ou PredicateC est vrai pour les z, le système peut changer d'état, de sorte que tout reste le même, sauf que x les changements de la valeur actuelle de plus de 1.

Exprimant qu'en Erlang exige beaucoup de la plomberie, au moins dans la façon que j'ai trouvé.Par exemple, en ayant une boucle qui évalue les conditions avant de déclencher, comme:

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).

Je pense à l'écriture d'un cadre pour le cacher, plomberie, en intégrant la transmission de message à l'intérieur de la get_new_info() fonction et, espérons-le, qui OTP conforme.Si vous connaissez un cadre déjà fait ou si vous pouvez penser à un moyen simple de réaliser cela, je serais heureux d'en entendre parler.

Était-ce utile?

La solution

Je crois gen_fsm(3) comportement pourrait probablement faire de votre vie un peu plus facile.

FSM de La Machine À État Fini, pas Flying Spaghetti Monster, bien que ce dernier pourrait aider, aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top