Проверьте, что ветви выполнены

Программа может переходить из START в левую или правую ветку. Как я могу проверить, что есть путь выполнения для ЛЕВОЙ ветви и другой путь выполнения для ПРАВОЙ ветви?

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

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

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)
Другие вопросы по тегам