Проверьте, что ветви выполнены
Программа может переходить из 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)