Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.04 KB | None | 0 0
  1. sort
  2. Cart = struct Cart1 | Cart2 | Cart3 | Cart4;
  3. Section = struct Section1 | Section2 | Section3 | Section4 | Section5| Section6 | Section7 | Section8 | Section9;
  4. Refinery = struct Refinery1 | Refinery2 | Refinery3;
  5. Switch = struct Switch1 | Switch2;
  6. Message = struct CartBrokeMessage | RefineryBrokeMessage | SwitchBrokeMessage | FurnaceBrokeMessage;
  7.  
  8. map
  9. findSection: Refinery -> Section;
  10. findParkingSpot: Refinery -> Section;
  11. switchesToMove: Refinery # Bool # Bool -> List(Switch);
  12.  
  13. var
  14. isSwitched: Bool;
  15.  
  16. eqn
  17. findSection(Refinery1) = Section4;
  18. findSection(Refinery2) = Section5;
  19. findSection(Refinery3) = Section6;
  20. findParkingSpot(Refinery1) = Section7;
  21. findParkingSpot(Refinery2) = Section8;
  22. findParkingSpot(Refinery3) = Section9;
  23. switchesToMove(Refinery1, false, false) = [Switch2];
  24. switchesToMove(Refinery1, false, true) = [];
  25. switchesToMove(Refinery1, true, false) = [Switch1, Switch2];
  26. switchesToMove(Refinery1, true, true) = [Switch1];
  27. switchesToMove(Refinery2, false, false) = [];
  28. switchesToMove(Refinery2, false, true) = [Switch2];
  29. switchesToMove(Refinery2, true, false) = [Switch1];
  30. switchesToMove(Refinery2, true, true) = [Switch1, Switch2];
  31. switchesToMove(Refinery3, false, isSwitched) = [Switch1];
  32. switchesToMove(Refinery3, true, isSwitched) = [];
  33.  
  34. act
  35. furnaceStart;
  36. cartFull;
  37. moveCart: Cart # Section;
  38. askReadyRefinery: Refinery;
  39. refineryReady: Refinery;
  40. emptyCart: Cart;
  41. cartEmptied: Cart;
  42. cartDoneFilling: Refinery;
  43. cartBroken: Cart;
  44. refineryBroken: Refinery;
  45. switchBroken: Switch;
  46. furnaceBroken;
  47. refineryOrder: Refinery;
  48. moveSwitch: Switch;
  49. sectionOccupied: Cart # Section;
  50. sectionFree: Section;
  51. informMaintenanceCrew: Message;
  52. cartFixed: Cart;
  53. refineryFixed: Refinery;
  54. switchFixed: Switch;
  55. furnaceFixed;
  56.  
  57.  
  58.  
  59. sCartBroken, rCartBroken, cCartBroken: Cart;
  60. sRefineryBroken, rRefineryBroken, cRefineryBroken: Refinery;
  61. sSwitchBroken, rSwitchBroken, cSwitchBroken: Switch;
  62. sFurnaceBroken, rFurnaceBroken, cFurnaceBroken;
  63.  
  64. sCartDoneFilling, rCartDoneFilling, cCartDoneFilling: Cart;
  65. sCartEmptied, rCartEmptied, cCartEmptied: Cart;
  66. sCartSendToRefinery, rCartSendToRefinery, cCartSendToRefinery: Cart # Refinery;
  67. sCartSendToFurnace, rCartSendToFurnace, cCartSendToFurnace: Cart;
  68.  
  69. proc
  70. BlastFurnaceHandler(furnaceBroken: Bool)
  71. = ((sum c: Cart, s: Section . (s == Section2 && !furnaceBroken) -> sectionOccupied(c, s) . furnaceStart . cartFull . sCartDoneFilling(c)) . BlastFurnaceHandler(false))
  72. + (rFurnaceBroken . BlastFurnaceHandler(true))
  73. + (furnaceFixed . BlastFurnaceHandler(false));
  74.  
  75.  
  76. WaitRefineryResponse(c: Cart, r: Refinery)
  77. = askReadyRefinery(r) . (WaitRefineryResponse(c, r)
  78. + refineryReady(r) . emptyCart(c) . cartEmptied(c) . cartDoneFilling(r) . sCartEmptied(c) . RefineryHandler);
  79. RefineryHandler
  80. = (sum c: Cart, r: Refinery . rCartSendToRefinery(c, r) . WaitRefineryResponse(c, r));
  81.  
  82. BrokenPartHandler
  83. = (
  84. (sum c: Cart . cartBroken(c) . informMaintenanceCrew(CartBrokeMessage) . sCartBroken(c))
  85. + (sum r: Refinery . refineryBroken(r) . informMaintenanceCrew(RefineryBrokeMessage) . sRefineryBroken(r))
  86. + (sum s: Switch . switchBroken(s) . informMaintenanceCrew(SwitchBrokeMessage) . sSwitchBroken(s))
  87. + (furnaceBroken . informMaintenanceCrew(FurnaceBrokeMessage) . sFurnaceBroken)
  88. ) . BrokenPartHandler;
  89.  
  90. SendNonBusyCartToFurnace(orderQueue: List(Refinery), checkedCarts: List(Cart), notCheckedCarts: List(Cart), cartsBusy: Set(Cart))
  91. = (head(notCheckedCarts) in notCheckedCarts) -> sCartSendToFurnace(head(notCheckedCarts)) . Scheduler(orderQueue, checkedCarts ++ notCheckedCarts, cartsBusy + {head(notCheckedCarts)}, true)
  92. + (#notCheckedCarts != 0) -> SendNonBusyCartToFurnace(orderQueue, checkedCarts <| head(notCheckedCarts), tail(notCheckedCarts), cartsBusy);
  93.  
  94. Scheduler(orderQueue: List(Refinery), totalCarts: List(Cart), cartsBusy: Set(Cart), furnaceBusy: Bool)
  95. = (sum c: Cart . sCartBroken(c) . Scheduler(orderQueue, totalCarts, cartsBusy + {c}, furnaceBusy))
  96. + (sum c: Cart . cartFixed(c) . Scheduler(orderQueue, totalCarts, cartsBusy - {c}, furnaceBusy))
  97. + (!furnaceBusy && #orderQueue != 0) -> SendNonBusyCartToFurnace(orderQueue, [], totalCarts, cartsBusy)
  98. + (sum c: Cart . rCartEmptied(c) . Scheduler(orderQueue, totalCarts, cartsBusy - {c}, furnaceBusy))
  99. + (#orderQueue < 4) -> (sum r: Refinery . refineryOrder(r) . Scheduler(orderQueue <| r, totalCarts, cartsBusy, furnaceBusy))
  100. + (sum c: Cart . rCartDoneFilling(c) . sCartSendToRefinery(c, head(orderQueue)) . Scheduler(tail(orderQueue), totalCarts, cartsBusy, furnaceBusy));
  101.  
  102.  
  103. MoveSwitches(switches: List(Switch))
  104. = (#switches != 0) -> moveSwitch(head(switches)) . MoveSwitches(tail(switches));
  105. CarMovementHandler(carsBroken: Set(Cart), switch1Moved: Bool, switch2Moved: Bool)
  106. = (sum c: Cart, r: Refinery . (!(c in carsBroken)) -> rCartSendToRefinery(c, r) . MoveSwitches(switchesToMove(r, switch1Moved, switch2Moved)) . moveCart(c, Section3) . moveCart(c, findSection(r)));
  107.  
  108. init Scheduler([], [Cart1, Cart2, Cart3, Cart4], {}, false);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement