Я пишу спецификацию простого взаимодействия клиент-сервер для изучения TLA +:
-------------------------------- MODULE Bar --------------------------------
VARIABLES
sessionOK, \* if session is OK or expired
msg \* message currently on the wire
vars == <<msg, sessionOK>>
TypeOK ==
/\ sessionOK \in {TRUE, FALSE}
/\ msg \in {
"Query",
"OK",
"Unauthorized",
"null"
}
Init ==
/\ msg = "null"
/\ sessionOK = FALSE
Query ==
/\ msg \in {"null", "OK"}
/\ msg' = "Query"
/\ UNCHANGED <<sessionOK>>
OK ==
/\ msg = "Query"
/\ sessionOK = TRUE
/\ msg' = "OK"
/\ UNCHANGED <<sessionOK>>
Unauthorized ==
/\ msg = "Query"
/\ sessionOK = FALSE
/\ msg' = "Unauthorized"
/\ UNCHANGED <<sessionOK>>
Authorize ==
/\ msg = "Unauthorized"
/\ msg' = "null"
/\ sessionOK' = TRUE
Expire ==
/\ sessionOK = TRUE
/\ sessionOK' = FALSE
/\ UNCHANGED <<msg>>
Next ==
\/ Query
\/ Unauthorized
\/ OK
\/ Authorize
\/ Expire
Spec == Init /\ [][Next]_vars /\ WF_vars(Next)
=============================================================================
Как вы можете надеяться, клиент может выполнить некоторый запрос к серверу, и если сеанс в порядке, он получит результат, в противном случае он получит сообщение, которое ему необходимо авторизовать, а затем повторить попытку. Сессия может истечь в любой момент.
Я хочу быть уверенным, что клиент в конечном итоге получит результат, поэтому я добавил эту строку в свойства:
(msg = "Query") ~> (msg = "OK")
После проверки модели я сталкиваюсь с контрпримером, подобным этому: Init -> (Query -> Unauthorized -> Authorize -> Expire), где часть в круглых скобках повторяется бесконечно. Моей первой мыслью было сделать жесткое требование справедливости на OK
шаге. Однако проблема в том, что в этом сценарии OK
шаг никогда не включается.
Я мог бы добавить такие вещи, как []<><<OK>>_vars
(который гласит: «Всегда бывает, что в конечном итоге OK
происходит»), но это похоже на обман, и, судя по тому, что я понял, определение живучести с использованием произвольных временных формул - а не слабой или сильной справедливости - нахмурилось на.
Как я могу использовать слабую или сильную справедливость, чтобы гарантировать, что запрос в конечном итоге получит ответ? А может у меня модель плохая? У меня нет идей ...
OK
должно случиться? Не похоже, что это частьNext
. - person Hovercouch   schedule 16.03.2020OK
нельзя включить, это похоже на проблему дизайна. Вы пытаетесь сказать, что если тайм-аут не истечет, то со временем все будет в порядке? - person Hovercouch   schedule 17.03.2020Spec == /\ Init /\ [][Next]_vars /\ WF_vars(Next) /\ SF_vars(OK) /\ SF_vars(Query /\ (sessionOK = TRUE))
Как вы думаете, это нормально? - person urxvtcd   schedule 18.03.2020