joelwe

fadderTackFest

Mar 10th, 2013
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.59 KB | None | 0 0
  1. (*
  2. REPRESENTATION CONVENTION: Beer(n): n amount of beer.
  3. REPRESENTATION INVARIANT: Evidently the best beverage in the world.
  4. *)
  5. datatype beer = Beer of int
  6.  
  7. (*
  8. REPRESENTATION CONVENTION: Datavetare(dvname, drunkenbeer):
  9. A computer scientist with the name dvname
  10. and the amount of beer drunk, drunkenbeer.
  11. REPRESENTATION INVARIANT: Probably the most 1337 student in the world.
  12. *)
  13. datatype datavetare = Datavetare of string * beer
  14.  
  15. (*
  16. REPRESENTATION CONVENTION: Fadder(dv): A dv full of wisdom.
  17. REPRESENTATION INVARIANT: No flaws.
  18. *)
  19. datatype fadder = Fadder of datavetare
  20.  
  21. (*
  22. REPRESENTATION CONVENTION: Etta(dv): A dv full of noobiness.
  23. REPRESENTATION INVARIANT: Too many to count.
  24. *)
  25. datatype etta = Etta of datavetare
  26.  
  27. (*
  28. REPRESENTATION CONVENTION: Party(f, e): An awesome gathering of faddrar f and ettor e.
  29. REPRESENTATION INVARIANT: Preferably drunkenbeer >= 10 for every etta in e and
  30. drunkenbeer >= 20 for every fadder in f.
  31.  
  32. *)
  33. datatype party = Party of (fadder list * etta list)
  34.  
  35. (*
  36. REPRESENTATION CONVENTION: Wasted(dv): A dv as wasted.
  37. REPRESENTATION INVARIANT: Crave for munchies,
  38. no self-control,
  39. no manners,
  40. memory loss,
  41. money loss,
  42. unwanted fluids,
  43. unwanted home runs,
  44. unwanted tomorrow.
  45. *)
  46. datatype wasted = Wasted of datavetare
  47.  
  48. (*
  49. emptyFadderList
  50. TYPE: 'a list
  51. VALUE: An empty (soon to be filled) list of faddrar.
  52. *)
  53. val emptyFadderList = []
  54.  
  55. (*
  56. emptyEttaList
  57. TYPE: 'a list
  58. VALUE: An empty (soon to be filled) list of ettor.
  59. *)
  60. val emptyEttaList = []
  61.  
  62. (*
  63. addFadder(l, n)
  64. TYPE: fadder list * string -> fadder list
  65. PRE: n is a real fadder.
  66. POST: l with another awesome fadder n.
  67. EXAMPLE: addFadder(emptyFadderList, "Märta") =
  68. [Fadder (Datavetare ("Märta", Beer 0))]: fadder list
  69. *)
  70. fun addFadder(l, n) = Fadder(Datavetare(n, Beer 0))::l
  71.  
  72. (*
  73. addEtta(l, n)
  74. TYPE: etta list * string -> etta list
  75. PRE: n is a real etta.
  76. POST: l with another noob n.
  77. EXAMPLE: addEtta(emptyEttaList, "Mitra") =
  78. [Etta (Datavetare ("Mitra", Beer 0))]: etta list
  79. *)
  80. fun addEtta(l, n) = Etta(Datavetare(n, Beer 0))::l
  81.  
  82. (*
  83. mkPartyList(f, e)
  84. TYPE: fadder list * etta list -> party
  85. PRE: (none)
  86. POST: f and e together as an awesome party.
  87. EXAMPLE: mkPartyList([Fadder (Datavetare ("Märta", Beer 0))],
  88. [Etta (Datavetare ("Mitra", Beer 0))]) =
  89. Party ([Fadder (Datavetare ("Märta", Beer 0))],
  90. [Etta (Datavetare ("Mitra", Beer 0))]): party
  91. *)
  92. fun mkPartyList(f, e) = Party(f, e)
  93.  
  94. (*
  95. moreBeer(p, b)
  96. TYPE: party * beer -> party
  97. PRE: (none)
  98. POST: Adds b to drunkenbeer for every etta in p and
  99. b*2 to drunkenbeer for every fadder in p.
  100. EXAMPLE: moreBeer(Party ([Fadder (Datavetare ("Märta", Beer 0))],
  101. [Etta (Datavetare ("Mitra", Beer 0))]), Beer 1) =
  102. Party ([Fadder (Datavetare ("Märta", Beer 2))],
  103. [Etta (Datavetare ("Mitra", Beer 1))]): party
  104. *)
  105. fun moreBeer(Party(f, e), Beer n) =
  106. let
  107. (*
  108. beerToEtta e
  109. TYPE: etta list -> etta list
  110. PRE: (none)
  111. POST: Adds one (1) beer to drunkenbeer for every etta in e.
  112. EXAMPLE: beerToEtta([Etta (Datavetare ("Mitra", Beer 0))]) =
  113. [Etta (Datavetare ("Mitra", Beer 1))]: etta list
  114. *)
  115. (*VARIANT length e*)
  116. fun beerToEtta([]) = []
  117. | beerToEtta(Etta(Datavetare(s, Beer b))::xs) =
  118. Etta(Datavetare(s, Beer(b+n)))::beerToEtta(xs)
  119. (*
  120. beerToFadder f
  121. TYPE: fadder list -> fadder list
  122. PRE: (none)
  123. POST: Adds two (2) beers to drunkenbeer for every fadder in f.
  124. EXAMPLE: beerToFadder([Fadder (Datavetare ("Märta", Beer 0))]) =
  125. [Fadder (Datavetare ("Märta", Beer 2))]: fadder list
  126. *)
  127. (*VARIANT length f*)
  128. fun beerToFadder([]) = []
  129. | beerToFadder(Fadder(Datavetare(s, Beer b))::xs) =
  130. Fadder(Datavetare(s, Beer(b+2*n)))::beerToFadder(xs)
  131. in
  132. Party(beerToFadder(f), beerToEtta(e))
  133. end
  134.  
  135. (*
  136. checkParty(p)
  137. TYPE: party -> bool
  138. PRE: (none)
  139. POST: True if drunkenbeer >= 10 for any etta in party, else false.
  140. EXAMPLE: checkParty(Party ([Fadder (Datavetare ("Märta", Beer 2))],
  141. [Etta (Datavetare ("Mitra", Beer 1))])) = false: bool
  142. *)
  143. fun checkParty(Party(_, [])) = false
  144. | checkParty(Party(f, Etta(Datavetare(s, Beer b))::xs)) =
  145. if b >= 10 then
  146. true
  147. else
  148. false
  149.  
  150. (*
  151. fadderTackFest(people, b)
  152. TYPE: party * beer -> wasted list
  153. PRE: b >= 10
  154. POST: party people as wasted when number of beer b are more than 10.
  155. EXAMPLE: fadderTackFest(Party ([Fadder (Datavetare ("Märta", Beer 0))],
  156. [Etta (Datavetare ("Mitra", Beer 0))]), Beer 10) =
  157. [Wasted (Datavetare ("Märta", Beer 20)),
  158. Wasted (Datavetare ("Mitra", Beer 10))]: wasted list
  159. *)
  160. (*TIME COMPLEXITY: Θ (b) always*)
  161.  
  162. fun fadderTackFest(party as Party(f, e), Beer b) =
  163. let
  164. exception notEnoughBeer
  165.  
  166. val partyparty = moreBeer(party, Beer b)
  167.  
  168. (*
  169. wastedEtta e
  170. TYPE: etta list -> wasted list
  171. PRE: (none)
  172. POST: e as wasted.
  173. EXAMPLE: wastedEtta([Etta (Datavetare ("Mitra", Beer 10))]) =
  174. [Wasted (Datavetare ("Mitra", Beer 10))]: wasted list
  175. *)
  176. (*VARIANT length e*)
  177. fun wastedEtta([]) = []
  178. | wastedEtta(Etta(dv)::xs) =
  179. Wasted(dv)::wastedEtta(xs)
  180. (*
  181. wastedFadder f
  182. TYPE: fadder list -> wasted list
  183. PRE: (none)
  184. POST: f as wasted.
  185. EXAMPLE: wastedFadder([Fadder (Datavetare ("Märta", Beer 20))]) =
  186. [Wasted (Datavetare ("Märta", Beer 20))]: wasted list
  187. *)
  188. (*VARIANT length f*)
  189. fun wastedFadder([]) = []
  190. | wastedFadder(Fadder(dv)::xs) =
  191. Wasted(dv)::wastedFadder(xs)
  192. (*
  193. fadderTackFest' people
  194. TYPE: party -> wasted list
  195. PRE: (none)
  196. POST: party people as wasted.
  197. EXAMPLE: fadderTackFest'(Party ([Fadder (Datavetare ("Märta",
  198. Beer 20))], [Etta (Datavetare ("Mitra", Beer 10))])) =
  199. [Wasted (Datavetare ("Märta", Beer 20)),
  200. Wasted (Datavetare ("Mitra", Beer 10))]: wasted list
  201. *)
  202. fun fadderTackFest'(Party(f', e')) =
  203. if checkParty(partyparty) = true then
  204. wastedFadder(f')@wastedEtta(e')
  205. else
  206. raise notEnoughBeer
  207.  
  208. in
  209. fadderTackFest'(partyparty)
  210. end;
  211.  
  212.  
  213. (* Test cases for fadderTackFest. *)
  214. let
  215. val fadderList = addFadder(emptyFadderList, "Märta")
  216. val ettaList = addEtta(emptyEttaList, "Mitra")
  217. val party = mkPartyList(fadderList, ettaList)
  218. val fadderTackFest = fadderTackFest(party, Beer 10)
  219. val expectedResult = [Wasted (Datavetare ("Märta", Beer 20)),
  220. Wasted (Datavetare ("Mitra", Beer 10))]
  221. in
  222. print("\n\nTest case for upcoming fadderTackFest:\n");
  223. (1, fadderTackFest = expectedResult)
  224. end
Advertisement
Add Comment
Please, Sign In to add comment