Я хотел бы перевести некоторые действия, указанные в TLA в Erlang . Вы можете придумать какой-либо естественный способ сделать это прямо в Erlang или какой-либо другой фреймворк, доступный для такого рода? В двух словах (очень маленький), действия TLA - это условия для переменных, некоторые из которых имеют штриховку, что означает, что они представляют значения переменных в следующем состоянии. Например:
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. Если вы знаете какой-либо фреймворк, который уже делает это, или если вы можете придумать простой способ реализации этого, я был бы признателен за информацию об этом.