Просмотр здесь в основном показывает простые примеры спецификаций действий, где вы ссылаетесь на следующее состояние, используя '
, например:
UponV1(self) ==
/\ pc[self] = "V1"
/\ pc' = [pc EXCEPT ![self] = "AC"]
/\ sent' = sent \cup { <<self, "ECHO">> }
/\ nCrashed' = nCrashed
/\ Corr' = Corr
Например, /\ nCrashed' = nCrashed
являетсялогическое утверждение, говорящее «... И далее (nCrashed) == this (nCrashed)`. Таким образом, в основном, вышеупомянутая функция устанавливает несколько переменных «в следующем состоянии». Но все это происходит по существу за один шаг (по крайней мере, логически).
Меня интересует, как определить что-то, что происходит за несколько шагов. Скажем, 10 шагов.
UpdateWithTenSteps(self) ==
/\ foo' = foo + 1
/\ bar'' = foo' + 1
/\ baz''' = bar'' + 1
/\ ...
....
Итак, "в третьем состоянии впереди, baz будет установлензапретить во втором состоянии плюс один. ". Нечто подобное. Но это не имеет никакого смысла. На императивном языке вы бы просто сделали что-то вроде этого:
function updateInTenSteps() {
incFoo()
incBar()
incBaz()
}
Но это имеет смыслпотому что каждый вызов функции происходит после предыдущего, но я не вижу, как представить это в TLA +.
Интересно, как вы должны выполнить вещи, которые занимают более одного шага во временной логике Actions +.Другим примером будет цикл while.