expressar a lógica temporal de ações em erlang.de qualquer maneira natural?

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

  •  14-11-2019
  •  | 
  •  

Pergunta

Eu gostaria de traduzir algumas ações especificadas no A TLA no Erlang.Você pode pensar de qualquer maneira natural de fazer isso diretamente no Erlang ou de qualquer framework disponíveis para tal?Em poucas palavras (muito pequena), a TLA ações são condições variáveis, algumas das quais estão prontos, o que significa que eles representam os valores das variáveis do próximo estado.Por exemplo:

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

Esta ação significa que, sempre que o estado do sistema é tal que PredicateA é verdade para a variável x e PredicateB é verdadeiro para y ou PredicateC é verdadeiro para z, e , em seguida, o sistema pode alterar o seu estado para que tudo permanece o mesmo, exceto que x alterações para o valor atual mais 1.

Expressando que em Erlang requer muito trabalho, pelo menos na forma como eu encontrei.Por exemplo, por ter um ciclo que avalia as condições antes de acioná-los, como:

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

Eu estou pensando em escrever um framework para ocultar este encanamento, incorporando a mensagem que passa dentro da get_new_info() função e, esperamos, ainda, tornando-OTP compatível.Se você sabe de algum framework que já faz isso ou se você pode pensar de uma maneira simples de implementar isso, eu gostaria de ouvir sobre ele.

Foi útil?

Solução

Eu acredito gen_fsm(3) comportamento provavelmente poderia fazer sua vida um pouco mais fácil.

FSM a partir de Máquina De Estado Finito, não Monstro de Espaguete Voador, embora este último pode ajudar, também.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top