2011-02-16 18 views
7

我想翻譯一下TLA中指定的一些動作Erlang。你能想到在Erlang或任何可用的框架中直接使用這種方法的自然方式嗎?簡而言之(非常小的一個),TLA操作是變量的條件,其中一些已準備好,這意味着它們表示下一個狀態中變量的值。例如:表達erlang中動作的時間邏輯。任何自然的方式?

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

這個動作意味着,每當系統的狀態是這樣的:PredicateA爲可變x和任一PredicateB真正爲yPredicateC真爲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兼容。如果你知道任何已經這樣做的框架,或者如果你能想到一個簡單的實現方法,我很樂意聽到它。

回答

5

我相信gen_fsm(3)行爲可能會讓你的生活稍微容易些。

FSM從Finite State Machine,而不是飛意大利麪怪物,雖然後者也可以幫助。

+0

上面代碼片段中的State和NewState變量是gen_server意義上的狀態。如果我將這個代碼轉換爲FSM,它將會是一個有兩個狀態,「等待」和「嘗試處理」的狀態,以及一系列可能的事件從等待狀態處理,將其移動到嘗試狀態以檢查狀態所有行動在實際執行之前。我不確定這是應該如何實施的。至於其他密克羅尼西亞,他們對我來說太嚴格了:) – lasaro 2011-02-17 10:58:12