VIP Elevator – first model A VDM++ Project Made By: Sune Wolff 11/5 - 2007 1 System Summary VIP and neighbours share elevator. Elevator moves between 5 floors. Call buttons used to call elevator. VIP has door sensor installed Turnstiles can be used to restrict access to the neighbours. VIP do not like to share the elevator. VIP do not like to wait to long. 11/5 - 2007 2 Class Diagram 11/5 - 2007 3 World class World instance variables private environment : Environment; operations public World: () ==> World World() == (environment := new Environment(5); ); public Run: () ==> () Run() == is not yet specified; end World 11/5 - 2007 4 Environment class Environment instance variables private elevator : Elevator; operations public Environment: (nat) ==> Environment Environment(max) == (elevator := new Elevator(max); ); end Environment 11/5 - 2007 5 Elevator instance variables private currentFloor private numNeighboursInside private numVipInside private maxUsersInside private innerQueue private outerQueue private tsController : Floor := <zero>; : nat := 0; : nat := 0; : nat; : Queue := new Queue(3); : Queue := new Queue(3); : Turnstile := new Turnstile(false); types public Floor = <zero> | <one> | <two> | <three> | <four>; public VipFloor = <zero> | <four>; public User = <vip> | <neighbour>; 11/5 - 2007 6 Queue instance variables private elevatorQueue private maxInQueue private VipQueue public VipInQueue : seq of Elevator`Floor := []; : nat; : Elevator`Floor; : bool := false; public PutInQueue: Elevator`Floor * Elevator`User ==> () PutInQueue(f, u) == (if (u = <vip>) then (VipInQueue := true; VipQueue := f) else (elevatorQueue := elevatorQueue ^ [f]); ) pre (len elevatorQueue < maxInQueue) post (len elevatorQueue = len elevatorQueue~ + 1); 11/5 - 2007 Notice the use of sequence concatenation 7 Queue public GetNextFromQueue: () ==> Elevator`Floor GetNextFromQueue() == (dcl tempQueue : Elevator`Floor; if (len elevatorQueue = 0 and VipInQueue = true) then return VipQueue; Notice use of sequence tail operator if (VipInQueue = false) then (tempQueue := elevatorQueue(1); elevatorQueue := tl elevatorQueue); return tempQueue; ) pre (len elevatorQueue > 0) or (VipInQueue = true) post (len elevatorQueue = len elevatorQueue~ - 1); 11/5 - 2007 8 Turnstile class Turnstile instance variables private locked : bool; operations public Turnstile: bool ==> Turnstile Turnstile(l) == (locked := l); public IsTurnstileLocked: () ==> bool IsTurnstileLocked() == (return locked); public LockTurnstile: () ==> () LockTurnstile () == (locked := true) pre locked = false post locked = true; public UnlockTurnstile: () ==> () UnlockTurnstile () == (locked := false) pre locked = true post locked = false; end Turnstile 11/5 - 2007 9 Class Diagram 11/5 - 2007 10 Future Improvements Introduce classes for buttons and sensors Make elevator more intelligent Keep track of direction Choose next floor based on direction and distance Introduce automatic test Make use of mapping Read test sequence from file Make sure the VIP receives special treatment 11/5 - 2007 No neighbours in elevator when VIP wants to use it Execute VIP order as soon as possible 11
© Copyright 2026 Paperzz