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>>

我正在编写一个简单的客户机-服务器交互规范来学习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步骤提出一个强烈的公平性要求。但是,问题是在这种情况下,确定步骤从未启用

我可以添加一些东西,比如[]_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))