Skip to content
Snippets Groups Projects
Commit c143df5b authored by Michael Leuschel's avatar Michael Leuschel
Browse files

add descriptions to model

parent a1b2fe56
No related branches found
No related tags found
No related merge requests found
......@@ -2,34 +2,40 @@ MACHINE TwoTrainsMA
// A small example to show how one can use LibrarySVG to flexibliy visualise
// train track zones and MAs; model contains some errors on purpose to show how visualisation can help spot them
SETS
TTDS = {ttd1,ttd2,ttd3,ttd4};
TRAINS = {tr1,tr2}
TTDS = {ttd1,ttd2,ttd3,ttd4} /*@desc "Trackside Track Detection zones" */;
TRAINS = {tr1,tr2} /*@desc "The set of trains" */
CONSTANTS
TrackElementNumber, TRACK, TTD_TrackElements
TrackElementNumber /*@desc "The maximum nr of a track element" */,
TRACK /*desc "The set of positions comprising the track" */,
TTD_TrackElements /*@desc "Mapping from TTDs to sets of positions" */
PROPERTIES
TrackElementNumber : NATURAL1
& TRACK = 0..TrackElementNumber
& TTD_TrackElements : TTDS --> FIN1(TRACK)
& TrackElementNumber = 30
& TTD_TrackElements = {ttd1 |-> 0..4 , ttd2 |-> 5..10 , ttd3 |-> 11..25, ttd4 |-> 26..30}
& 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" */,
train_front_end /*@desc "the maximal (aka right) position of a train" */,
train_ma /*@desc "the Movement Authority given to a train" */
train_ma /*@desc "the Movement Authority given to a registered train" */
INVARIANT
occ <: TTDS &
occ <: TTDS /*@desc "occ is a set of TTDs" */ &
train_rear_end : TRAINS --> TRACK &
train_front_end : TRAINS --> TRACK &
train_ma : 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 image not empty" */ &
!(t1,t2).(t1:TRAINS & t2 /= t1 => train_occ(t1) /\ train_occ(t2) = {}) /*@desc "no collision" */ &
!(t1,t2).(t1:TRAINS & t2 /= t1 => train_reserved(t1) /\ train_reserved(t2) = {}) /*@desc "reserved areas disjoint" */ ASSERTIONS
!tr.(tr:TRAINS => train_front_end(tr) >= train_rear_end(tr)) /*@desc "train positions on track 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
=> train_occ(tr) /\ TTD_TrackElements(ttd) = {}) /*@desc "TTDs marked as free are really free" */
INITIALISATION
......@@ -39,11 +45,13 @@ 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
train_ma(tr) := newMA
END;
TrainAcceptsNewMA(tr,newMA) = PRE tr:dom(train_ma) & newMA:TRACK & newMA > train_ma(tr) &
newMA mod 5 = 0 /*@desc "Restriction to restrict state space for MC" */ &
!(t2).(t2 /= tr => train_ma(tr)..newMA /\ train_reserved(t2) = {}) /*@desc "MA extension is safe" */
// TODO: use TTD info !(ttd).(ttd:occ => train_ma(tr)..newMA
THEN
......
MACHINE TwoTrainsMA
MACHINE TwoTrainsMA_Unicode
// A small example to show how one can use LibrarySVG to flexibliy visualise
// train track zones and MAs;
// unicode and corrected version of model that contains some errors on purpose to show how visualisation can help spot them
SETS
TTDS = {ttd1,ttd2,ttd3,ttd4};
TRAINS = {tr1,tr2}
TTDS = {ttd1,ttd2,ttd3,ttd4} /*@desc "Trackside Track Detection zones" */;
TRAINS = {tr1,tr2} /*@desc "The set of trains" */
CONSTANTS
TrackElementNumber, TRACK, TTD_TrackElements
TrackElementNumber /*@desc "The maximum nr of a track element" */,
TRACK /*desc "The set of positions comprising the track" */,
TTD_TrackElements /*@desc "Mapping from TTDs to sets of positions" */
PROPERTIES
TrackElementNumber ∈ NATURAL1
∧ TRACK = 0..TrackElementNumber
......@@ -23,7 +25,7 @@ VARIABLES
train_front_end /*@desc "the maximal (aka right) position of a train" */,
train_ma /*@desc "the Movement Authority given to a train" */
INVARIANT
occ ⊆ TTDS ∧
occ ⊆ TTDS /*@desc "occ is a set of TTDs" */
train_rear_end ∈ TRAINS → TRACK ∧
train_front_end ∈ TRAINS → TRACK ∧
train_ma ∈ TRAINS ⇸ TRACK ∧
......@@ -72,12 +74,3 @@ DEFINITIONS
train_length(train) == 1+train_front_end(train)-train_rear_end(train);
VISB_JSON_FILE == "TwoTrainsMA.json"
END
\ No newline at end of file
/*
Demo
1. Find deadlock, fix TrainMoveForward
2. add disjunct ∨ train_rear_end(tr) > train_front_end(t2)
3. animate and see that everything works
4. show visualisation
*/
\ No newline at end of file
......@@ -438,6 +438,18 @@
},
"goal": "-",
"shouldExecute": true
},
{
"nodesLimit": "-",
"timeLimit": "-",
"options": {
"options": [
"FIND_INVARIANT_VIOLATIONS",
"INSPECT_EXISTING_NODES"
]
},
"goal": "-",
"shouldExecute": true
}
],
"simulation": null,
......@@ -466,7 +478,7 @@
"metadata": {
"fileType": "Project",
"formatVersion": 12,
"savedAt": "2021-05-06T12:36:10.371287Z",
"savedAt": "2021-05-06T13:17:55.964399Z",
"creator": "User",
"proB2KernelVersion": "4.0.0-SNAPSHOT",
"proBCliVersion": null,
......
......@@ -6,9 +6,6 @@
"params": {},
"results": {},
"destState": {
"TTD_TrackElements": "{(ttd1↦{0,1,2,3,4}),(ttd2↦{5,6,7,8,9,10}),(ttd3↦{11,12,13,14,15,16,17,18,19,20,21,22,23,24,25}),(ttd4↦{26,27,28,29,30})}",
"TrackElementNumber": "30",
"TRACK": "{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}"
},
"destStateNotChanged": [],
"preds": []
......@@ -18,10 +15,6 @@
"params": {},
"results": {},
"destState": {
"train_rear_end": "{(tr1↦0),(tr2↦5)}",
"train_front_end": "{(tr1↦2),(tr2↦6)}",
"train_ma": "∅",
"occ": "{ttd1,ttd2}"
},
"destStateNotChanged": [],
"preds": []
......@@ -29,12 +22,12 @@
{
"name": "TrainAcceptsFirstMA",
"params": {
"newMA": "14",
"newMA": "15",
"tr": "tr2"
},
"results": {},
"destState": {
"train_ma": "{(tr2↦14)}"
"train_ma": "{(tr2↦15)}"
},
"destStateNotChanged": [
"train_front_end",
......@@ -80,12 +73,12 @@
{
"name": "TrainAcceptsFirstMA",
"params": {
"newMA": "4",
"newMA": "5",
"tr": "tr1"
},
"results": {},
"destState": {
"train_ma": "{(tr1↦4),(tr2↦14)}"
"train_ma": "{(tr1↦5),(tr2↦15)}"
},
"destStateNotChanged": [
"train_front_end",
......@@ -204,7 +197,7 @@
},
"results": {},
"destState": {
"train_ma": "{(tr1↦10),(tr2↦14)}"
"train_ma": "{(tr1↦10),(tr2↦15)}"
},
"destStateNotChanged": [
"train_front_end",
......@@ -250,12 +243,12 @@
{
"name": "TrainAcceptsNewMA",
"params": {
"newMA": "23",
"newMA": "25",
"tr": "tr2"
},
"results": {},
"destState": {
"train_ma": "{(tr1↦10),(tr2↦23)}"
"train_ma": "{(tr1↦10),(tr2↦25)}"
},
"destStateNotChanged": [
"train_front_end",
......@@ -400,23 +393,6 @@
],
"preds": []
},
{
"name": "TrainAcceptsNewMA",
"params": {
"newMA": "25",
"tr": "tr2"
},
"results": {},
"destState": {
"train_ma": "{(tr1↦10),(tr2↦25)}"
},
"destStateNotChanged": [
"train_front_end",
"train_rear_end",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
......
{
"description": "",
"transitionList": [
{
"name": "$setup_constants",
"params": {},
"results": {},
"destState": {
"TTD_TrackElements": "{(ttd1↦{0,1,2,3,4}),(ttd2↦{5,6,7,8,9,10}),(ttd3↦{11,12,13,14,15,16,17,18,19,20,21,22,23,24,25}),(ttd4↦{26,27,28,29,30})}",
"TrackElementNumber": "30",
"TRACK": "{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}"
},
"destStateNotChanged": [],
"preds": []
},
{
"name": "$initialise_machine",
"params": {},
"results": {},
"destState": {
"train_rear_end": "{(tr1↦0),(tr2↦5)}",
"train_front_end": "{(tr1↦2),(tr2↦6)}",
"train_ma": "∅",
"occ": "{ttd1,ttd2}"
},
"destStateNotChanged": [],
"preds": []
},
{
"name": "TrainAcceptsFirstMA",
"params": {
"newMA": "14",
"tr": "tr2"
},
"results": {},
"destState": {
"train_ma": "{(tr2↦14)}"
},
"destStateNotChanged": [
"train_front_end",
"train_rear_end",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "7",
"tr": "tr2"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦2),(tr2↦7)}",
"train_rear_end": "{(tr1↦0),(tr2↦6)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "8",
"tr": "tr2"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦2),(tr2↦8)}",
"train_rear_end": "{(tr1↦0),(tr2↦7)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainAcceptsFirstMA",
"params": {
"newMA": "4",
"tr": "tr1"
},
"results": {},
"destState": {
"train_ma": "{(tr1↦4),(tr2↦14)}"
},
"destStateNotChanged": [
"train_front_end",
"train_rear_end",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "9",
"tr": "tr2"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦2),(tr2↦9)}",
"train_rear_end": "{(tr1↦0),(tr2↦8)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "3",
"tr": "tr1"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦3),(tr2↦9)}",
"train_rear_end": "{(tr1↦1),(tr2↦8)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "10",
"tr": "tr2"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦3),(tr2↦10)}",
"train_rear_end": "{(tr1↦1),(tr2↦9)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "11",
"tr": "tr2"
},
"results": {},
"destState": {
"train_rear_end": "{(tr1↦1),(tr2↦10)}",
"train_front_end": "{(tr1↦3),(tr2↦11)}",
"occ": "{ttd1,ttd2,ttd3}"
},
"destStateNotChanged": [
"train_ma"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "12",
"tr": "tr2"
},
"results": {},
"destState": {
"train_rear_end": "{(tr1↦1),(tr2↦11)}",
"train_front_end": "{(tr1↦3),(tr2↦12)}",
"occ": "{ttd1,ttd3}"
},
"destStateNotChanged": [
"train_ma"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "13",
"tr": "tr2"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦3),(tr2↦13)}",
"train_rear_end": "{(tr1↦1),(tr2↦12)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainAcceptsNewMA",
"params": {
"newMA": "10",
"tr": "tr1"
},
"results": {},
"destState": {
"train_ma": "{(tr1↦10),(tr2↦14)}"
},
"destStateNotChanged": [
"train_front_end",
"train_rear_end",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "4",
"tr": "tr1"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦4),(tr2↦13)}",
"train_rear_end": "{(tr1↦2),(tr2↦12)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "5",
"tr": "tr1"
},
"results": {},
"destState": {
"train_rear_end": "{(tr1↦3),(tr2↦12)}",
"train_front_end": "{(tr1↦5),(tr2↦13)}",
"occ": "{ttd1,ttd2,ttd3}"
},
"destStateNotChanged": [
"train_ma"
],
"preds": []
},
{
"name": "TrainAcceptsNewMA",
"params": {
"newMA": "23",
"tr": "tr2"
},
"results": {},
"destState": {
"train_ma": "{(tr1↦10),(tr2↦23)}"
},
"destStateNotChanged": [
"train_front_end",
"train_rear_end",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "14",
"tr": "tr2"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦5),(tr2↦14)}",
"train_rear_end": "{(tr1↦3),(tr2↦13)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "6",
"tr": "tr1"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦6),(tr2↦14)}",
"train_rear_end": "{(tr1↦4),(tr2↦13)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "15",
"tr": "tr2"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦6),(tr2↦15)}",
"train_rear_end": "{(tr1↦4),(tr2↦14)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "7",
"tr": "tr1"
},
"results": {},
"destState": {
"train_rear_end": "{(tr1↦5),(tr2↦14)}",
"train_front_end": "{(tr1↦7),(tr2↦15)}",
"occ": "{ttd2,ttd3}"
},
"destStateNotChanged": [
"train_ma"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "16",
"tr": "tr2"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦7),(tr2↦16)}",
"train_rear_end": "{(tr1↦5),(tr2↦15)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "8",
"tr": "tr1"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦8),(tr2↦16)}",
"train_rear_end": "{(tr1↦6),(tr2↦15)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "17",
"tr": "tr2"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦8),(tr2↦17)}",
"train_rear_end": "{(tr1↦6),(tr2↦16)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "18",
"tr": "tr2"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦8),(tr2↦18)}",
"train_rear_end": "{(tr1↦6),(tr2↦17)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainAcceptsNewMA",
"params": {
"newMA": "25",
"tr": "tr2"
},
"results": {},
"destState": {
"train_ma": "{(tr1↦10),(tr2↦25)}"
},
"destStateNotChanged": [
"train_front_end",
"train_rear_end",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "19",
"tr": "tr2"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦8),(tr2↦19)}",
"train_rear_end": "{(tr1↦6),(tr2↦18)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "20",
"tr": "tr2"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦8),(tr2↦20)}",
"train_rear_end": "{(tr1↦6),(tr2↦19)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "21",
"tr": "tr2"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦8),(tr2↦21)}",
"train_rear_end": "{(tr1↦6),(tr2↦20)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "22",
"tr": "tr2"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦8),(tr2↦22)}",
"train_rear_end": "{(tr1↦6),(tr2↦21)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "9",
"tr": "tr1"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦9),(tr2↦22)}",
"train_rear_end": "{(tr1↦7),(tr2↦21)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "23",
"tr": "tr2"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦9),(tr2↦23)}",
"train_rear_end": "{(tr1↦7),(tr2↦22)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
},
{
"name": "TrainMoveForward",
"params": {
"new_front": "24",
"tr": "tr2"
},
"results": {},
"destState": {
"train_front_end": "{(tr1↦9),(tr2↦24)}",
"train_rear_end": "{(tr1↦7),(tr2↦23)}"
},
"destStateNotChanged": [
"train_ma",
"occ"
],
"preds": []
}
],
"variableNames": [
"occ",
"train_rear_end",
"train_front_end",
"train_ma"
],
"constantNames": [
"TrackElementNumber",
"TRACK",
"TTD_TrackElements"
],
"setNames": [
"TTDS",
"TRAINS"
],
"machineOperationInfos": {
"TrainMoveForward": {
"operationName": "TrainMoveForward",
"parameterNames": [
"tr",
"new_front"
],
"outputParameterNames": [],
"topLevel": true,
"type": "CLASSICAL_B",
"readVariables": [
"TRACK",
"TTD_TrackElements",
"train_front_end",
"train_ma",
"train_rear_end"
],
"writtenVariables": [
"occ",
"train_front_end",
"train_rear_end"
],
"nonDetWrittenVariables": [],
"typeMap": {
"'TTD_TrackElements'": "set(couple(global('TTDS'),set(integer)))",
"new_front": "integer",
"tr": "global('TRAINS')",
"'TRACK'": "set(integer)"
}
},
"TrainAcceptsFirstMA": {
"operationName": "TrainAcceptsFirstMA",
"parameterNames": [
"tr",
"newMA"
],
"outputParameterNames": [],
"topLevel": true,
"type": "CLASSICAL_B",
"readVariables": [
"TRACK",
"train_front_end",
"train_ma",
"train_rear_end"
],
"writtenVariables": [
"train_ma"
],
"nonDetWrittenVariables": [],
"typeMap": {
"newMA": "integer",
"tr": "global('TRAINS')",
"'TRACK'": "set(integer)"
}
},
"TrainAcceptsNewMA": {
"operationName": "TrainAcceptsNewMA",
"parameterNames": [
"tr",
"newMA"
],
"outputParameterNames": [],
"topLevel": true,
"type": "CLASSICAL_B",
"readVariables": [
"TRACK",
"train_front_end",
"train_ma",
"train_rear_end"
],
"writtenVariables": [
"train_ma"
],
"nonDetWrittenVariables": [],
"typeMap": {
"newMA": "integer",
"tr": "global('TRAINS')",
"'TRACK'": "set(integer)"
}
}
},
"globalIdentifierTypes": {
"train_ma": "set(couple(global('TRAINS'),integer))",
"train_front_end": "set(couple(global('TRAINS'),integer))",
"train_rear_end": "set(couple(global('TRAINS'),integer))",
"occ": "set(global('TTDS'))"
},
"metadata": {
"fileType": "Trace",
"formatVersion": 2,
"savedAt": "2021-05-05T08:42:50.789906Z",
"creator": "traceReplay",
"proB2KernelVersion": "4.0.0-SNAPSHOT",
"proBCliVersion": "1.11.0-nightly",
"modelName": "TwoTrainsMA"
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment