Next == sData \/ sendD \/ sendA \/ rData \/ receiveD \/
receiveC \/ receiveA \/ dataChannel \/ ackChannel
\/ (* Disjunct to prevent deadlock on completion *)
(( messOut=Message) /\ UNCHANGED vars)
(* with out Fin the model never deadlocks *)
Fin == <>(messOut = Message) (* NOT a property of every behaviour *)
(* I interpreted these two experiments as meaning the system was busy looping between more that one state and not stuttering
But TLC error-trace is
<stuttering> State num=8
<sendD > State num7 *)
Without property Fin but with deadlock checked TLC reports no errors.
With Fin TLC reports that the temporal property fails.
Am I correct that if no deadlock is found then no infinite sequence of stuttering steps are possible ??
My problem is that when a termoral property fails and an error trace ends with <stuttering> together meant that an infinite sequence of stuttering steps was the cause of the filure ??
thanks in advance
--
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+u...@googlegroups.com.
To post to this group, send email to tla...@googlegroups.com.
Visit this group at https://groups.google.com/group/tlaplus.
For more options, visit https://groups.google.com/d/optout.
Many thanks Stephan.
So withInit == x=0Inc == x<5 /\ x'=x+1Reset == x=5 /\ x'=0Spec == Init /\ [][Inc \/ Reset]_x /\ WF_x(Inc)Is it correct to say that when the the guard (x<5) is false it does not prevent the step Inc from being chosen. But if Inc is chosen and the guard is false then the system stutters.
Is it reasonable to say that a particular step, Inc in this example, is the stuttering step??
The error trace clearly indicates that stuttering occurs form state (x=5) but there is nothing on the State Graph to indicate that stuttering is possible from state (x=5) and not from other states. There are dashed loop arrows from every state. These loops do not seem to be related to any particular step. Do you know what they indicate?
You sayHowever, it fails to satisfy the property []<>(x=0) because there is a behavior that stutters infinitely at the state where x=5: since Inc is disabled at that state,But Reset is disabled when x=1 does this lead to stuttering?
I experimented with []<>(x=3) e.t.c. The results surprised me. I think of stuttering as a property of the State Machine but where stuttering is reported depends upon the property checked not upon the State machine itself. Am I mistaken to think of stuttering as a property of the state machine? If stuttering is a property of the State Machine then I would have thought that stuttering from the State (x=2) would also falsify []<>(x=0) ??
So do the dashed loops on the State Graph indicate that it can stutter from any state
My intuition was thatSpec == Init /\ [][Inc \/ Reset]_x /\ SF_x(Inc) /\ SF_x(Reset)would not stutter and experimentation confirmed this.
Thanks Jay
So a step is disabled when its guard (or precondition) is false
and although we don't say that it is the particular step that stutters it is when a guard evaluates to false that stuttering occurs.
With no fairness condition Spec == Init /\ [][Inc \/ Reset]_x then the state machine we consideredInit == x=0Inc == x<5 /\ x'=x+1Reset == x=5 /\ x'=0could stutter immediately and falsify any liveness condition.
But the error trace displayed depends on the temporal condition, it may first completes several steps before stuttering even though it could stutter immediately and falsify the condition. I misinterpreted the error trace as implying that this was the first point that stuttering could occur where as I gather that this is the first point where stuttering is checked.
TLA+ allows fairness to be defined for very specific situations but because of my background in process algebra and abstract data types all I want is to have strong fairness every where. In ADT and process algebras CSP and CCS nothing stutters by default you have to add some thing to enable stuttering.
I gather /\ WF_vars(Next) is will stop all stuttering but not sure what the effect of restricting the vars to a subset of the variables is.
Is /\ SF_vars(Next) thought enforce strong fairness throughout the state machine?
Put another way: would SF_vars(Next) imply any other fairness condition?
It certainly is not having the effect I imagined but this may be caused by the translation from PlusCal to TLA+
I misinterpreted the error trace as implying that this was the first point that stuttering could occur where as I gather that this is the first point where stuttering is checked.
In ADT and process algebras CSP and CCS nothing stutters by default you have to add some thing to enable stuttering.
(I think it's an error to restrict WF to a subset of variables, but someone more knowledgable can correct me.)
Many thanks I never thought of stuttering as only occurring when a guard was satisfied that explains a lot.
If I seem to nitpicking it is just because I am not finding debugging livenes easy.
EXTENDS Naturals
VARIABLES x
Init == x=0
Inc == x<5 /\ x'=x+1
Reset == x=5 /\ x'=0
Spec == Init /\ [][Inc \/ Reset]_x
(* /\ SF_<<x>>(Inc) *)
/\ SF_<<x>>(Reset)
When TLC reports a counter-example to an invariant, it is guaranteed to be of smallest length because the state space is explored using breadth-first search [1]. Checking liveness properties relies on exploring strongly connected components of the state graph and the above guarantee does not hold. The state graph is still the same, independently of the liveness property that you try to verify, but different counter-examples may be reported.Stephan
[1] Using default settings, and ignoring effects due to parallel exploration.
On 23 Apr 2019, at 23:49, david streader <davidis...@gmail.com> wrote:
Many thanks I never thought of stuttering as only occurring when a guard was satisfied that explains a lot.
If I seem to nitpicking it is just because I am not finding debugging livenes easy.
With specEXTENDS NaturalsVARIABLES xInit == x=0Inc == x<5 /\ x'=x+1Reset == x=5 /\ x'=0Spec == Init /\ [][Inc \/ Reset]_x(* /\ SF_<<x>>(Inc) *)/\ SF_<<x>>(Reset)where stuttering is reported depends upon what property you ask as well as the spec itself.with <> (x=2) it is after x = 1 but with <> (x=4) its is after x = 3.Consequently it was important that I stopped interpreting it to be an improvement that the spec was not stuttering so soon.Does the addition of liveness conditions change the State Graph to indicate where infinite stuttering might occur?--
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 tla...@googlegroups.com.