Advertisement
Guest User

Untitled

a guest
Jan 20th, 2019
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.40 KB | None | 0 0
  1. ------------------------------ MODULE payment ------------------------------
  2. EXTENDS Integers, TLC
  3.  
  4. CONSTANT CreditCards
  5.  
  6. (* --fair algorithm payment
  7.  
  8. variables
  9. valid = CreditCards,
  10. purchases = {},
  11. processed = {},
  12. failed = {}
  13.  
  14. define
  15. allPurchasesValid == \A purchase \in purchases : purchase \in valid
  16. end define
  17.  
  18.  
  19.  
  20. fair process time = "invalidate"
  21. begin Invalidate:
  22. await valid /= {};
  23. with c \in valid do
  24. valid := valid \ {c}
  25. end with
  26. end process
  27.  
  28. fair process user \in CreditCards
  29. begin
  30. Check:
  31. if self \notin failed /\ self \in valid then
  32. purchases := purchases \cup {self}
  33. elsif self \notin valid then
  34. valid := valid \cup {self};
  35. if self \in failed then purchases := purchases \cup {self} end if
  36. end if;
  37. goto Check
  38. end process
  39.  
  40. fair process payment = "processpay"
  41. begin Process:
  42. await purchases /= {};
  43. with p \in purchases do
  44. purchases := purchases \ {p};
  45. if p \in valid then
  46. processed := processed \cup {p}
  47. else
  48. failed := failed \cup {p}
  49. end if
  50. end with;
  51. NextPurchase:
  52. processed := {};
  53. goto Process
  54. end process
  55.  
  56. end algorithm *)
  57. \* BEGIN TRANSLATION
  58. VARIABLES valid, purchases, processed, failed, pc
  59.  
  60. (* define statement *)
  61. allPurchasesValid == \A purchase \in purchases : purchase \in valid
  62.  
  63.  
  64. vars == << valid, purchases, processed, failed, pc >>
  65.  
  66. ProcSet == {"invalidate"} \cup (CreditCards) \cup {"processpay"}
  67.  
  68. Init == (* Global variables *)
  69. /\ valid = CreditCards
  70. /\ purchases = {}
  71. /\ processed = {}
  72. /\ failed = {}
  73. /\ pc = [self \in ProcSet |-> CASE self = "invalidate" -> "Invalidate"
  74. [] self \in CreditCards -> "Check"
  75. [] self = "processpay" -> "Process"]
  76.  
  77. Invalidate == /\ pc["invalidate"] = "Invalidate"
  78. /\ valid /= {}
  79. /\ \E c \in valid:
  80. valid' = valid \ {c}
  81. /\ pc' = [pc EXCEPT !["invalidate"] = "Done"]
  82. /\ UNCHANGED << purchases, processed, failed >>
  83.  
  84. time == Invalidate
  85.  
  86. Check(self) == /\ pc[self] = "Check"
  87. /\ IF self \notin failed /\ self \in valid
  88. THEN /\ purchases' = (purchases \cup {self})
  89. /\ valid' = valid
  90. ELSE /\ IF self \notin valid
  91. THEN /\ valid' = (valid \cup {self})
  92. /\ IF self \in failed
  93. THEN /\ purchases' = (purchases \cup {self})
  94. ELSE /\ TRUE
  95. /\ UNCHANGED purchases
  96. ELSE /\ TRUE
  97. /\ UNCHANGED << valid, purchases >>
  98. /\ pc' = [pc EXCEPT ![self] = "Check"]
  99. /\ UNCHANGED << processed, failed >>
  100.  
  101. user(self) == Check(self)
  102.  
  103. Process == /\ pc["processpay"] = "Process"
  104. /\ purchases /= {}
  105. /\ \E p \in purchases:
  106. /\ purchases' = purchases \ {p}
  107. /\ IF p \in valid
  108. THEN /\ processed' = (processed \cup {p})
  109. /\ UNCHANGED failed
  110. ELSE /\ failed' = (failed \cup {p})
  111. /\ UNCHANGED processed
  112. /\ pc' = [pc EXCEPT !["processpay"] = "NextPurchase"]
  113. /\ valid' = valid
  114.  
  115. NextPurchase == /\ pc["processpay"] = "NextPurchase"
  116. /\ processed' = {}
  117. /\ pc' = [pc EXCEPT !["processpay"] = "Process"]
  118. /\ UNCHANGED << valid, purchases, failed >>
  119.  
  120. payment == Process \/ NextPurchase
  121.  
  122. Next == time \/ payment
  123. \/ (\E self \in CreditCards: user(self))
  124. \/ (* Disjunct to prevent deadlock on termination *)
  125. ((\A self \in ProcSet: pc[self] = "Done") /\ UNCHANGED vars)
  126.  
  127. Spec == /\ Init /\ [][Next]_vars
  128. /\ WF_vars(Next)
  129. /\ WF_vars(time)
  130. /\ \A self \in CreditCards : WF_vars(user(self))
  131. /\ WF_vars(payment)
  132.  
  133. Termination == <>(\A self \in ProcSet: pc[self] = "Done")
  134.  
  135. \* END TRANSLATION
  136.  
  137.  
  138.  
  139. =============================================================================
  140. \* Modification History
  141. \* Last modified Sun Jan 20 22:34:58 EET 2019 by Harald
  142. \* Created Wed Jan 16 22:41:36 EET 2019 by Harald
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement