[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [tlaplus] Re: Interpreting the DieHarder error trace



Thanks, that helps a great deal!

---rdf  

On Sunday, May 28, 2017 at 2:08:28 AM UTC-4, Stephan Merz wrote:
> Your ASSUME clause restricts the constant capacities of the jugs to be positive integers, but nothing is said about the values of the variable injury. In fact, TLA+ is an untyped formalism, and there is no way to rely on a type declaration for restricting the values of variables.
> 
> I do not understand the line
> 
>     with ( poured = Min(injug[j] + injug[k], Capacity[k] - injug[k]))
> 
> How can you pour more than the contents of jug j from j to k?
> 
> Hope this helps,
> Stephan
> 
> 
> > On 27 May 2017, at 20:50, ston...@xxxxxxxxx wrote:
> > 
> > Yes, not posting the spec was definitely an error on my part (appears below)
> > 
> > This is the section highlighted by the Toolbox when I double click the error trace 
> > 
> > \/ /\ \E j \in Jugs:
> >                \E k \in Jugs \{j}:
> >                  LET poured == Min(injug[j] + injug[k], Capacity[k] - injug[k]) IN
> >                    injug' = [injug EXCEPT ![j] = injug[j] - poured,
> >                                           ![k] = injug[k] + poured]
> > 
> > I can see "mechanically" how that happens aka poured = 2. However looking at the specification, I would have thought that it was working in the domain of  
> > 
> > Nat \ {0}
> > 
> > Therefore,  wouldn't have thought the value of -2 could be successfully assigned and an error would have been signaled before the Invariant was evaluated.
> > 
> > It also appears to me (I'm not confident that I'm reading the spec correctly) that there's an error in the spec that doesn't specify a from-to relationship for the pour, so the pour occurs from a jug with nothing in it.  
> > 
> > Again, I'm not sure that either of these interpretations are appropriate & am  trying to get aligned with how tlaplus actually works.
> > 
> > 
> > 
> > _____________spec____________________
> > ----------------------------- MODULE DieHarder -----------------------------
> > EXTENDS Integers
> > 
> > Min(m,n) == IF m<n THEN m ELSE n
> > 
> > CONSTANTS Goal, Jugs, Capacity
> > 
> > ASSUME /\ Goal \in Nat
> >       /\ Capacity \in [Jugs -> Nat \ {0}]
> > 
> > (***************************************************************************
> > --algorithm DieHarder {
> >   variable injug = [j \in Jugs |-> 0 ]; 
> >   { while (TRUE)
> >      {either with (j \in Jugs) \* fill jug j
> >               {injug[j] := Capacity [j]}
> >       or     with (j \in Jugs) \* empty jug j
> >               {injug[j] := 0}
> >       or     with (j \in Jugs, k \in Jugs \{j}) \* pour from jug j into jug k
> >               { with ( poured = Min(injug[j] + injug[k], Capacity[k] - injug[k]))
> >                  { 
> >                     injug[j] := injug[j] - poured ||
> >                     injug[k] := injug[k] + poured
> > 
> > 
> >                  }
> >               }
> > 
> >      }
> >   }
> > }
> > ***************************************************************************)    
> > \* BEGIN TRANSLATION
> > VARIABLE injug
> > 
> > vars == << injug >>
> > 
> > Init == (* Global variables *)
> >        /\ injug = [j \in Jugs |-> 0 ]
> > 
> > Next == \/ /\ \E j \in Jugs:
> >                injug' = [injug EXCEPT ![j] = Capacity [j]]
> >        \/ /\ \E j \in Jugs:
> >                injug' = [injug EXCEPT ![j] = 0]
> >        \/ /\ \E j \in Jugs:
> >                \E k \in Jugs \{j}:
> >                  LET poured == Min(injug[j] + injug[k], Capacity[k] - injug[k]) IN
> >                    injug' = [injug EXCEPT ![j] = injug[j] - poured,
> >                                           ![k] = injug[k] + poured]
> > 
> > Spec == Init /\ [][Next]_vars
> > 
> > \* END TRANSLATION
> > =============================================================================
> > 
> > 
> > On Saturday, May 27, 2017 at 10:19:25 AM UTC-4, Leslie Lamport wrote:
> >> You are asking for an explanation of why your specification causes TLC to produce a particular output without showing us your specification.  I presume that's why no one bothered to answer your question.  If you double-click on the line in the error trace between the last two states, the Toolbox will show you what part of the next-state relation permitted the step from state 4 to state 5.  Understanding why that formula allowed that step should allow you to answer your question yourself.
> >> 
> >> On Wednesday, May 24, 2017 at 1:27:05 PM UTC-7, stonebits@... wrote:My "value" error trace when there's a solution (the /= Goal is violated) is the following
> >> 
> >> State (num = 1)
> >> 
> >> (small :> 0 @@ big :> 0)
> >> 
> >> 
> >> 
> >> State (num = 2)
> >> 
> >> (small :> 0 @@ big :> 5)
> >> 
> >> 
> >> 
> >> State (num = 3)
> >> 
> >> (small :> 3 @@ big :> 2)
> >> 
> >> 
> >> 
> >> State (num = 4)
> >> 
> >> (small :> 0 @@ big :> 2)
> >> 
> >> 
> >> 
> >> State (num = 5)
> >> 
> >> (small :> -2 @@ big :> 4)
> >> 
> >> 
> >> 
> >> I'm confused as to why "small" is ever negative as it is in state 5 -- any ideas?
> > 
> > --