Tla+ 指定活跃度,使循环不会在TLA中发生+
我正在编写一个简单的客户机-服务器交互规范来学习TLA+:Tla+ 指定活跃度,使循环不会在TLA中发生+,tla+,Tla+,我正在编写一个简单的客户机-服务器交互规范来学习TLA+: -------------------------------- MODULE Bar -------------------------------- VARIABLES sessionOK, \* if session is OK or expired msg \* message currently on the wire vars == <<msg, sessionOK>>
-------------------------------- 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步骤提出一个强烈的公平性要求。但是,问题是在这种情况下,确定步骤从未启用
我可以添加一些东西,比如[]_vars,它表示最终OK总是会发生的,但这感觉像是作弊,从我收集的数据来看,使用任意的时间公式来指定活跃度——而不是弱或强的公平性——是不受欢迎的
如何使用弱公平性或强公平性来保证查询最终得到响应?或者我的模型不好?我没有主意了…我在回答我自己的问题。如果有人认为他们有更好的答案,请分享 我找到了这个名字恰如其分的线索,莱斯利·兰波特(Leslie Lamport)自己指出,我们可以在一个动作和其他公式的结合上坚持公平。在我们的场景规范中,如下所示:
Spec ==
/\ Init
/\ [][Next]_vars
/\ WF_vars(Next)
/\ SF_vars(OK)
/\ SF_vars(Query /\ (sessionOK = TRUE))
现在,这些公式中的每一个都是什么意思?前三个是非常明显的,并且包含在我定义规范的尝试中
Init在行为的第一个状态为true。
接下来是允许口吃的行为的每一步。
下一步将继续发生,如果它继续被无限期地启用,那么系统不会在消息交换的中间停止。
第四个是我的直觉:它修复了发出查询,然后会话过期的情况
如果OK被反复启用,那么它最终会发生。
第五点是缺少的东西:它修复了一开始从未启用OK的情况,因为会话在查询发生之前就已过期
如果反复出现这样的情况,即查询可以发生,并且会话同时有效,那么它最终会发生。
OK应该怎么发生?这看起来不像是下一步的一部分。啊,我的错,一定是在准备最简单的示例时犯了错误。将在一分钟内修复。如果“确定”永远无法启用,则听起来像是设计问题。你是想说如果它没有超时,那么它最终会好起来吗?是的,没错。在现实世界中,如果客户端收到未经授权的消息,它将续订会话并立即重试,并且重试所需的时间比会话的生存期短几个数量级,因此这不是问题。但我不知道如何建模,我想我在读了莱西·兰波特自己指出的这篇文章后就明白了,我们可以在科幻小说中使用连词。财产现在已经满足了。Spec=/\Init/\[[Next]\u vars/\WF\u varsNext/\SF\u varsOK/\SF\u varsQuery/\sessionOK=TRUE您认为这样可以吗?
Spec ==
/\ Init
/\ [][Next]_vars
/\ WF_vars(Next)
/\ SF_vars(OK)
/\ SF_vars(Query /\ (sessionOK = TRUE))