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
真正爲y
或PredicateC
真爲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兼容。如果你知道任何已經這樣做的框架,或者如果你能想到一個簡單的實現方法,我很樂意聽到它。
上面代碼片段中的State和NewState變量是gen_server意義上的狀態。如果我將這個代碼轉換爲FSM,它將會是一個有兩個狀態,「等待」和「嘗試處理」的狀態,以及一系列可能的事件從等待狀態處理,將其移動到嘗試狀態以檢查狀態所有行動在實際執行之前。我不確定這是應該如何實施的。至於其他密克羅尼西亞,他們對我來說太嚴格了:) – lasaro 2011-02-17 10:58:12