Hello, all TLA+ specifications allow for finite stuttering to occur. This is particularly important for being able to represent refinement between two specifications as (validity of) implication. A specification of the form Init /\ [][Next]_vars even allows for infinite stuttering (since any steps that do not change `vars' are allowed), and this will prevent you from proving liveness properties such as `Termination' in your example. You will have to strengthen the specification by adding suitable fairness properties that assert that certain steps will occur assuming they are "often enough" enabled. I believe that in your case it will be enough to define Spec == Init /\ [][Next]_vars /\ WF_vars(Next) which asserts that the system will eventually perform a non-stuttering step (according to predicate Next) as long as such a step remains enabled. If your specification was generated from a PlusCal algorithm, you can simply write "fair algorithm" instead of "algorithm", and the PlusCal translator will add that fairness condition for you. You can learn more about stuttering invariance and about fairness in the available TLA+ documentation. Hope this helps, Stephan
--
You received this message because you are subscribed to the Google Groups "tlaplus" group. To unsubscribe from this group and stop receiving emails from it, send an email to tlaplus+unsubscribe@xxxxxxxxxxxxxxxx. To view this discussion on the web visit https://groups.google.com/d/msgid/tlaplus/2E774191-9E8A-4EF7-8816-60505E287C5A%40gmail.com. |