私は、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)
=============================================================================
ご覧のとおり、クライアントはサーバーに対してクエリを実行できます。セッションが OK の場合は結果が返されます。それ以外の場合は、承認してから再試行する必要があるというメッセージが表示されます。セッションはいつでも期限切れになる可能性があります。
クライアントが最終的に結果を取得できるようにしたいので、次の行をプロパティに追加しました。
(msg = "Query") ~> (msg = "OK")
モデルのチェック時に、次のような反例に直面しています: Init -> (Query -> Unauthorized -> Authorize -> Expire) で、括弧内の部分が無限に繰り返されます。私が最初に考えたのは、ステップに強い公平性を要求することでしたOK
。ただし、問題はこのシナリオのOK
ステップが有効にならないことです。
[]<><<OK>>_vars
(「最終的に発生するのは常にそうである」と読みます)のようなことを追加できますOK
が、これは不正行為のように感じられ、収集したものから、任意の一時的な式を使用してライブ性を指定すること、および弱い公平性または強い公平性ではありません.
弱い公平性または強い公平性を使用して、クエリが最終的に応答を受け取ることを保証するにはどうすればよいですか? それとも私のモデルが悪いのでしょうか?私はアイデアがありません...