ausdruck der zeitlichen Logik von Handlungen in Erlang.irgendein natürlicher Weg?

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

  •  14-11-2019
  •  | 
  •  

Frage

Ich möchte einige Aktionen übersetzen, die in angegeben sind TLA in Erlang.Können Sie sich eine natürliche Möglichkeit vorstellen, dies direkt in Erlang zu tun, oder ein dafür verfügbares Framework?Kurz gesagt (eine sehr kleine) sind TLA-Aktionen Bedingungen für Variablen, von denen einige grundiert sind, was bedeutet, dass sie die Werte der Variablen im nächsten Zustand darstellen.Beispielsweise:

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

Diese Aktion bedeutet, dass immer dann, wenn der Zustand des Systems so ist, dass PredicateA ist wahr für variable x und entweder PredicateB ist wahr für y oder PredicateC ist wahr für z, dann kann das System seinen Zustand ändern, so dass alles gleich bleibt, außer dass x ändert den aktuellen Wert plus 1.

Das in Erlang auszudrücken erfordert viel Klempnerarbeit, zumindest so, wie ich es gefunden habe.Zum Beispiel durch eine Schleife, die Bedingungen auswertet, bevor sie ausgelöst werden, wie z:

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

Ich denke darüber nach, einen Rahmen zu schreiben, um diese Installation zu verbergen und die Weitergabe von Nachrichten in die get_new_info() funktionieren und es hoffentlich immer noch OTP-konform machen.Wenn Sie ein Framework kennen, das dies bereits tut, oder wenn Sie sich eine einfache Möglichkeit vorstellen können, dies zu implementieren, würde ich mich freuen, davon zu hören.

War es hilfreich?

Lösung

Ich glaube gen_fsm(3) verhalten könnte Ihnen wahrscheinlich das Leben etwas erleichtern.

FSM von Zustandsmaschine, kein fliegendes Spaghettimonster, obwohl letzteres auch helfen könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top