Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (*
- REPRESENTATION CONVENTION: Beer(n): n amount of beer.
- REPRESENTATION INVARIANT: Evidently the best beverage in the world.
- *)
- datatype beer = Beer of int
- (*
- REPRESENTATION CONVENTION: Datavetare(dvname, drunkenbeer):
- A computer scientist with the name dvname
- and the amount of beer drunk, drunkenbeer.
- REPRESENTATION INVARIANT: Probably the most 1337 student in the world.
- *)
- datatype datavetare = Datavetare of string * beer
- (*
- REPRESENTATION CONVENTION: Fadder(dv): A dv full of wisdom.
- REPRESENTATION INVARIANT: No flaws.
- *)
- datatype fadder = Fadder of datavetare
- (*
- REPRESENTATION CONVENTION: Etta(dv): A dv full of noobiness.
- REPRESENTATION INVARIANT: Too many to count.
- *)
- datatype etta = Etta of datavetare
- (*
- REPRESENTATION CONVENTION: Party(f, e): An awesome gathering of faddrar f and ettor e.
- REPRESENTATION INVARIANT: Preferably drunkenbeer >= 10 for every etta in e and
- drunkenbeer >= 20 for every fadder in f.
- *)
- datatype party = Party of (fadder list * etta list)
- (*
- REPRESENTATION CONVENTION: Wasted(dv): A dv as wasted.
- REPRESENTATION INVARIANT: Crave for munchies,
- no self-control,
- no manners,
- memory loss,
- money loss,
- unwanted fluids,
- unwanted home runs,
- unwanted tomorrow.
- *)
- datatype wasted = Wasted of datavetare
- (*
- emptyFadderList
- TYPE: 'a list
- VALUE: An empty (soon to be filled) list of faddrar.
- *)
- val emptyFadderList = []
- (*
- emptyEttaList
- TYPE: 'a list
- VALUE: An empty (soon to be filled) list of ettor.
- *)
- val emptyEttaList = []
- (*
- addFadder(l, n)
- TYPE: fadder list * string -> fadder list
- PRE: n is a real fadder.
- POST: l with another awesome fadder n.
- EXAMPLE: addFadder(emptyFadderList, "Märta") =
- [Fadder (Datavetare ("Märta", Beer 0))]: fadder list
- *)
- fun addFadder(l, n) = Fadder(Datavetare(n, Beer 0))::l
- (*
- addEtta(l, n)
- TYPE: etta list * string -> etta list
- PRE: n is a real etta.
- POST: l with another noob n.
- EXAMPLE: addEtta(emptyEttaList, "Mitra") =
- [Etta (Datavetare ("Mitra", Beer 0))]: etta list
- *)
- fun addEtta(l, n) = Etta(Datavetare(n, Beer 0))::l
- (*
- mkPartyList(f, e)
- TYPE: fadder list * etta list -> party
- PRE: (none)
- POST: f and e together as an awesome party.
- EXAMPLE: mkPartyList([Fadder (Datavetare ("Märta", Beer 0))],
- [Etta (Datavetare ("Mitra", Beer 0))]) =
- Party ([Fadder (Datavetare ("Märta", Beer 0))],
- [Etta (Datavetare ("Mitra", Beer 0))]): party
- *)
- fun mkPartyList(f, e) = Party(f, e)
- (*
- moreBeer(p, b)
- TYPE: party * beer -> party
- PRE: (none)
- POST: Adds b to drunkenbeer for every etta in p and
- b*2 to drunkenbeer for every fadder in p.
- EXAMPLE: moreBeer(Party ([Fadder (Datavetare ("Märta", Beer 0))],
- [Etta (Datavetare ("Mitra", Beer 0))]), Beer 1) =
- Party ([Fadder (Datavetare ("Märta", Beer 2))],
- [Etta (Datavetare ("Mitra", Beer 1))]): party
- *)
- fun moreBeer(Party(f, e), Beer n) =
- let
- (*
- beerToEtta e
- TYPE: etta list -> etta list
- PRE: (none)
- POST: Adds one (1) beer to drunkenbeer for every etta in e.
- EXAMPLE: beerToEtta([Etta (Datavetare ("Mitra", Beer 0))]) =
- [Etta (Datavetare ("Mitra", Beer 1))]: etta list
- *)
- (*VARIANT length e*)
- fun beerToEtta([]) = []
- | beerToEtta(Etta(Datavetare(s, Beer b))::xs) =
- Etta(Datavetare(s, Beer(b+n)))::beerToEtta(xs)
- (*
- beerToFadder f
- TYPE: fadder list -> fadder list
- PRE: (none)
- POST: Adds two (2) beers to drunkenbeer for every fadder in f.
- EXAMPLE: beerToFadder([Fadder (Datavetare ("Märta", Beer 0))]) =
- [Fadder (Datavetare ("Märta", Beer 2))]: fadder list
- *)
- (*VARIANT length f*)
- fun beerToFadder([]) = []
- | beerToFadder(Fadder(Datavetare(s, Beer b))::xs) =
- Fadder(Datavetare(s, Beer(b+2*n)))::beerToFadder(xs)
- in
- Party(beerToFadder(f), beerToEtta(e))
- end
- (*
- checkParty(p)
- TYPE: party -> bool
- PRE: (none)
- POST: True if drunkenbeer >= 10 for any etta in party, else false.
- EXAMPLE: checkParty(Party ([Fadder (Datavetare ("Märta", Beer 2))],
- [Etta (Datavetare ("Mitra", Beer 1))])) = false: bool
- *)
- fun checkParty(Party(_, [])) = false
- | checkParty(Party(f, Etta(Datavetare(s, Beer b))::xs)) =
- if b >= 10 then
- true
- else
- false
- (*
- fadderTackFest(people, b)
- TYPE: party * beer -> wasted list
- PRE: b >= 10
- POST: party people as wasted when number of beer b are more than 10.
- EXAMPLE: fadderTackFest(Party ([Fadder (Datavetare ("Märta", Beer 0))],
- [Etta (Datavetare ("Mitra", Beer 0))]), Beer 10) =
- [Wasted (Datavetare ("Märta", Beer 20)),
- Wasted (Datavetare ("Mitra", Beer 10))]: wasted list
- *)
- (*TIME COMPLEXITY: Θ (b) always*)
- fun fadderTackFest(party as Party(f, e), Beer b) =
- let
- exception notEnoughBeer
- val partyparty = moreBeer(party, Beer b)
- (*
- wastedEtta e
- TYPE: etta list -> wasted list
- PRE: (none)
- POST: e as wasted.
- EXAMPLE: wastedEtta([Etta (Datavetare ("Mitra", Beer 10))]) =
- [Wasted (Datavetare ("Mitra", Beer 10))]: wasted list
- *)
- (*VARIANT length e*)
- fun wastedEtta([]) = []
- | wastedEtta(Etta(dv)::xs) =
- Wasted(dv)::wastedEtta(xs)
- (*
- wastedFadder f
- TYPE: fadder list -> wasted list
- PRE: (none)
- POST: f as wasted.
- EXAMPLE: wastedFadder([Fadder (Datavetare ("Märta", Beer 20))]) =
- [Wasted (Datavetare ("Märta", Beer 20))]: wasted list
- *)
- (*VARIANT length f*)
- fun wastedFadder([]) = []
- | wastedFadder(Fadder(dv)::xs) =
- Wasted(dv)::wastedFadder(xs)
- (*
- fadderTackFest' people
- TYPE: party -> wasted list
- PRE: (none)
- POST: party people as wasted.
- EXAMPLE: fadderTackFest'(Party ([Fadder (Datavetare ("Märta",
- Beer 20))], [Etta (Datavetare ("Mitra", Beer 10))])) =
- [Wasted (Datavetare ("Märta", Beer 20)),
- Wasted (Datavetare ("Mitra", Beer 10))]: wasted list
- *)
- fun fadderTackFest'(Party(f', e')) =
- if checkParty(partyparty) = true then
- wastedFadder(f')@wastedEtta(e')
- else
- raise notEnoughBeer
- in
- fadderTackFest'(partyparty)
- end;
- (* Test cases for fadderTackFest. *)
- let
- val fadderList = addFadder(emptyFadderList, "Märta")
- val ettaList = addEtta(emptyEttaList, "Mitra")
- val party = mkPartyList(fadderList, ettaList)
- val fadderTackFest = fadderTackFest(party, Beer 10)
- val expectedResult = [Wasted (Datavetare ("Märta", Beer 20)),
- Wasted (Datavetare ("Mitra", Beer 10))]
- in
- print("\n\nTest case for upcoming fadderTackFest:\n");
- (1, fadderTackFest = expectedResult)
- end
Advertisement
Add Comment
Please, Sign In to add comment