annotate exercises/src/SetPairList.hs @ 24:34fea195e238

beautify layout
author Markus Kaiser <markus.kaiser@in.tum.de>
date Fri, 21 Dec 2012 01:44:45 +0100
parents f9386825bf71
children ce9610f08925
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
24
34fea195e238 beautify layout
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
1 -- ?
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
2
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
3 -- Abstraction function
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
4 {-
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
5 alpha (S x) = undefined
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
6
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
7 To show: (10 things)
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
8 -}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
9
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
10 -- Interface
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
11 newtype Set a = S (...)
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
12
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
13 invar :: Integral a => Set a -> Bool
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
14 invar (S s) = undefined
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
15
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
16 empty :: Set a
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
17 empty = undefined
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
18
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
19 insert :: Integral a => a -> Set a -> Set a
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
20 insert n (S s) = undefined
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
21
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
22 isin :: Integral a => a -> Set a -> Bool
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
23 isin n (S s) = undefined
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
24
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
25 size :: Integral a => Set a -> Integer
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
26 size (S s) = undefined
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
27
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
28 union :: Integral a => Set a -> Set a -> Set a
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
29 union (S s1) (S s2) = undefined
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
30
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
31 delete :: Integral a => a -> Set a -> Set a
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
32 delete n (S s) = undefined
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
33
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
34 -- Implementation
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
35 type PairList a = [(a, a)]
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
36
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
37 invarPL :: Integral a => PairList a -> Bool
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
38 invarPL [] = True
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
39 invarPL [(m,n)] = m <= n
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
40 invarPL ((m1,n1):(m2,n2):ms) =
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
41 m1 <= n1 && n1 + 1 < m2 && invarPL ((m2,n2):ms)
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
42
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
43 emptyPL :: PairList a
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
44 emptyPL = []
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
45
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
46 insertPL :: Integral a => a -> PairList a -> PairList a
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
47 insertPL n [] = [(n,n)]
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
48 insertPL n ((k1,l1) : (k2,l2) : ks)
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
49 | l1 + 1 == n && n + 1 == k2 = (k1,l2) : ks
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
50 insertPL n ((k,l) : ks)
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
51 | n + 1 == k = (n,l) : ks
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
52 | n < k = (n,n) : (k,l) : ks
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
53 | k <= n && n <= l = (k,l) : ks
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
54 | l + 1 == n = (k,n) : ks
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
55 | otherwise = (k,l) : insertPL n ks
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
56
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
57 isinPL :: Ord a => a -> PairList a -> Bool
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
58 isinPL n = any (\(k,l) -> k <= n && n <= l)
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
59
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
60 sizePL :: Integral a => PairList a -> Integer
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
61 sizePL [] = 0
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
62 sizePL ((k,l) : s) = toInteger (l - k + 1) + sizePL s
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
63
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
64 unionPL :: Integral a => PairList a -> PairList a -> PairList a
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
65 unionPL [] ls = ls
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
66 unionPL ks [] = ks
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
67 unionPL ((k1,l1):ks) ((k2,l2):ls) =
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
68 if k1 <= k2
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
69 then if l1 + 1 < k2 then (k1,l1) : unionPL ks ((k2, l2):ls)
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
70 else if l1 <= l2 then unionPL ks ((k1,l2):ls)
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
71 else {- l1 > l2 -} unionPL ((k1,l1):ks) ls
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
72 else if k1 <= l2 + 1
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
73 then if l1 <= l2 then unionPL ks ((k2,l2):ls)
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
74 else {- l1 > l2 -} unionPL ((k2,l1):ks) ls
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
75 else (k2,l2) : unionPL ((k1,l1):ks) ls
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
76
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
77 deletePL :: Integral a => a -> PairList a -> PairList a
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
78 deletePL n [] = []
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
79 deletePL n ((k,l) : ks)
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
80 | n < k = (k,l) : ks
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
81 | n == k = if k < l then (k+1,l) : ks else ks
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
82 | k < n && n < l = (k,n-1) : (n+1,l) : ks
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
83 | n == l = if k < l then (k,l-1) : ks else ks
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
84 | otherwise = (k,l) : deletePL n ks
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
85