diff --git a/Train/TwoTrainsMA.mch b/Train/TwoTrainsMA.mch index 95b51af80f3614e94c73a681a6e7550cca5009b9..f203f8258f5f3055a76a58579cdf511b9cd57a94 100644 --- a/Train/TwoTrainsMA.mch +++ b/Train/TwoTrainsMA.mch @@ -11,13 +11,14 @@ CONSTANTS PROPERTIES TrackElementNumber : NATURAL1 & TRACK = 0..TrackElementNumber - & TTD_TrackElements : TTDS --> FIN1(TRACK) +& !(ttd1,ttd2).(ttd1:TTDS & ttd2 /= ttd1 + => TTD_TrackElements(ttd1) /\ TTD_TrackElements(ttd2) = {}) /*desc "TTDs are disjoint" */ +& union(ran(TTD_TrackElements)) = TRACK /*desc "TTDs cover the entire track" */ +// Configuration Data (normally as refines/extends): & TrackElementNumber = 25 & TTD_TrackElements = {ttd1 |-> 0..4 , ttd2 |-> 5..10 , ttd3 |-> 11..20, ttd4 |-> 21..25} -& !(ttd1,ttd2).(ttd1:TTDS & ttd2 /= ttd1 => TTD_TrackElements(ttd1) /\ TTD_TrackElements(ttd2) = {}) /*desc "TTDs are disjoint" */ -& union(ran(TTD_TrackElements)) = TRACK /*desc "TTDs cover the entire track" */ VARIABLES occ /*@desc "the occupied TTDs" */, train_rear_end /*@desc "the minimal (aka left) position of a train" */, @@ -28,25 +29,28 @@ INVARIANT train_rear_end : TRAINS --> TRACK & train_front_end : TRAINS --> TRACK & train_ma : TRAINS +-> TRACK /*@desc "partial function associating trains with farthest point it is allowed to move" */ & - !tr.(tr:dom(train_ma) => train_front_end(tr) <= train_ma(tr)) /*@desc "trains stay within their MA" */ & - !tr.(tr:TRAINS => train_front_end(tr) >= train_rear_end(tr)) /*@desc "train positions on track not empty" */ & + /*@label "ASSUME-1" */ !tr.(tr:dom(train_ma) + => train_front_end(tr) <= train_ma(tr)) /*@desc "trains stay within their MA" */ & + /*@label "ASSUME-2" */ !tr.(tr:TRAINS + => train_front_end(tr) >= train_rear_end(tr)) /*@desc "train position not empty" */ & /*@label "SAF-1" */ !(t1,t2).(t1:TRAINS & t2 /= t1 => train_occ(t1) /\ train_occ(t2) = {}) /*@desc "no collision" */ & /*@label "SAF-2" */ !(t1,t2).(t1:TRAINS & t2 /= t1 => train_reserved(t1) /\ train_reserved(t2) = {}) /*@desc "reserved areas disjoint" */ ASSERTIONS - !(ttd,tr).(ttd /: occ & tr:TRAINS + /*@label "ASSUME-3" */ !(ttd,tr).(ttd /: occ & tr:TRAINS => train_occ(tr) /\ TTD_TrackElements(ttd) = {}) /*@desc "TTDs marked as free are really free" */ INITIALISATION - occ := {ttd1,ttd2} || - train_rear_end := {tr1 |-> 0, tr2 |-> 5} || train_front_end := {tr1 |->2, tr2|->6} || train_ma := {} + occ := {ttd1,ttd2} || + train_rear_end := {tr1 |-> 0, tr2 |-> 5} || train_front_end := {tr1 |->2, tr2|->6} || + train_ma := {} OPERATIONS - TrainAcceptsFirstMA(tr,newMA) = PRE tr/:dom(train_ma) & newMA:TRACK & newMA > train_front_end(tr) & newMA mod 5 = 0 /*@desc "Restriction to restrict state space for MC" */ & - !(t2).(t2 /= tr => train_rear_end(tr)..newMA /\ train_reserved(t2) = {}) /*@desc "MA is safe" */ THEN + !(t2).(t2:TRAINS & t2 /= tr + => train_rear_end(tr)..newMA /\ train_reserved(t2) = {}) /*@desc "MA is safe" */ THEN train_ma(tr) := newMA END; @@ -86,4 +90,5 @@ Demo 2. add disjunct or train_rear_end(tr) > train_front_end(t2) 3. animate and see that everything works 4. show visualisation + 5. Fix train bug in TrainMoveForward: new_front = train_front_end(tr) + 1 & //correct */ \ No newline at end of file