Esprimere la logica temporale delle azioni a Erlang.qualsiasi modo naturale?

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

  •  14-11-2019
  •  | 
  •  

Domanda

Vorrei tradurre alcune azioni specificate in tla in erlang . Puoi pensare a qualsiasi modo naturale di farlo direttamente in Erlang o di qualsiasi framework disponibile per tale? In poche parole (molto ridotte), le azioni TLA sono condizioni sulle variabili, alcune delle quali sono innescate, il che significa che rappresentano i valori delle variabili nello stato successivo. Ad esempio:

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

Questa azione significa che, ogni volta che lo stato del sistema è tale che PredicateA è true per x variabile e il PredicateB è vero per y o PredicateC è vero per z, il sistema potrebbe cambiare lo stato in modo che tutto rimanga lo stesso Tranne che il x cambia al valore corrente più 1.

Esprimendo che in Erlang richiede un sacco di impianti idraulici, almeno nel modo in cui ho trovato. Ad esempio, avendo un ciclo che valuta le condizioni prima di attivarle, come:

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

Sto pensando di scrivere un quadro per nascondere questo impianto idraulico, incorporando il messaggio che passa all'interno della funzione get_new_info() e, si spera, rendendolo ancora conforme a OTP. Se conosci qualsiasi framework che lo fa già o se riesci a pensare a un modo semplice per implementarlo, apprezzerei di sentirlo.

È stato utile?

Soluzione

I believe gen_fsm(3) behaviour could probably make your life slightly easier.

FSM from Finite State Machine, not Flying Spaghetti Monster, though the latter could help, too.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top