RailwayContainer ::= Route* Region*; abstract RailwayElement ::= <id:int>; Region : RailwayElement ::= TrackElement* Sensor*; Semaphore : RailwayElement ::= <Signal:Signal>; Route : RailwayElement ::= <Active:boolean> SwitchPosition*; SwitchPosition : RailwayElement ::= <Position:Position>; Sensor : RailwayElement; abstract TrackElement : RailwayElement; Segment : TrackElement ::= <Length:int> Semaphore*; Switch : TrackElement ::= <CurrentPosition:Position>; rel Route.requires* -> Sensor; rel Route.entry? -> Semaphore; rel Route.exit? -> Semaphore; rel Sensor.monitors* <-> TrackElement.monitoredBy*; rel TrackElement.connectsTo* -> TrackElement; rel SwitchPosition.target <-> Switch.positions*;