【问题标题】:Check that branches are executed检查分支是否已执行
【发布时间】:2017-12-10 21:56:41
【问题描述】:

程序可以从 START 分支到 LEFT 或 RIGHT 分支。如何检查是否有左分支的执行路径和右分支的另一个执行路径?

------------------------------ MODULE WFBranch ------------------------------

VARIABLE state

START == "start"
LEFT == "left"
RIGHT == "right"

Init == state = START

Next ==
    \/  /\ state = START
        /\  \/ state' = LEFT
            \/ state' = RIGHT
    \/  /\ state \in {LEFT, RIGHT}
        /\ state' = START

Spec ==
    /\ Init
    /\ [][Next]_<<state>>
    /\ WF_<<state>>(Next) \* Avoid stuttering at start

(*
This passes, but it does not ensure that there exist different paths covering both
branches - e.g. state might never be LEFT.
*)
CheckEventualStates == \/ (state = START) ~> (state = RIGHT)
                       \/ (state = START) ~> (state = LEFT)

=============================================================================

【问题讨论】:

    标签: formal-verification tla+


    【解决方案1】:

    在完全一般的情况下,没有办法检查对于每个状态,至少有一个行为最终到达它。这是因为 TLA+ 基于线性时序逻辑,它无法表达在多种不同行为之间保持的属性。

    根据具体的情况,有时您可以做一些替代品。例如,我们可以写

    Left == 
      /\ state = START
      /\ state' = LEFT
    
    Right ==
      /\ state = START
      /\ state' = RIGHT
    
    Next ==
        \/  /\ state = START
            /\  \/ Left
                \/ Right
        \/  /\ state \in {LEFT, RIGHT}
            /\ state' = START
    

    然后你可以检查有两个分支

    CheckEventualStates ==
        /\ <>(ENABLED Left)
        /\ <>(ENABLED Right)
    

    【讨论】:

    • FTR, ENABLED 在“指定系统”8.4 弱公平性中有描述
    猜你喜欢
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2017-08-06
    • 2018-12-23
    • 2021-10-30
    相关资源
    最近更新 更多