annotate exercises/src/Exercise_9.hs @ 22:498aea38199b

week 9 tutorial
author Markus Kaiser <markus.kaiser@in.tum.de>
date Wed, 19 Dec 2012 23:20:55 +0100
parents 3fea6fff7265
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
1 module Exercise_9 where
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
2 import Test.QuickCheck
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
3 import Control.Monad
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
4
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
5 {- Library DO NOT CHANGE -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
6 data Tree a = Empty | Node a (Tree a) (Tree a)
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
7 deriving (Eq, Show)
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
8
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
9 data Tree23 a = Leaf a
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
10 | Branch2 (Tree23 a) a (Tree23 a)
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
11 | Branch3 (Tree23 a) a (Tree23 a) a (Tree23 a)
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
12 deriving Show
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
13
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
14 mirror :: Tree a -> Tree a
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
15 mirror Empty = Empty
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
16 mirror (Node x l r) = Node x (mirror r) (mirror l)
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
17
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
18 flat :: Tree a -> [a]
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
19 flat Empty = []
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
20 flat (Node x l r) = flat l ++ [x] ++ flat r
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
21
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
22 -- allow QuickCheck to generate arbitrary values of type Tree
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
23 instance Arbitrary a => Arbitrary (Tree a) where
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
24 arbitrary = sized tree
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
25 where
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
26 tree 0 = return Empty
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
27 tree n | n > 0 = oneof [return Empty,
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
28 liftM3 Node arbitrary (tree (n `div` 2)) (tree (n `div` 2))]
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
29 shrink Empty = []
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
30 shrink (Node x l r) = l : r : map (\l' -> Node x l' r) (shrink l)
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
31 ++ map (\r' -> Node x l r') (shrink r)
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
32
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
33 -- examples for G9.2
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
34 balancedTrees =
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
35 [ Empty
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
36 , Node 0 Empty Empty
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
37 , Node 0 (Node 1 Empty Empty) Empty
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
38 , Node 4 (Node 2 Empty (Node 5 Empty Empty)) (Node 0 Empty Empty)
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
39 , Node 1 (Node 0 Empty (Node 3 Empty Empty))
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
40 (Node 0 Empty (Node 3 Empty Empty))
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
41 ]
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
42
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
43 unbalancedTrees =
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
44 [ Node 3 (Node 2 Empty (Node 1 Empty Empty)) Empty
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
45 , Node 4 (Node 3 (Node 2 (Node 1 Empty Empty) Empty) Empty)
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
46 (Node 3 Empty (Node 2 Empty (Node 1 Empty Empty)))
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
47 , Node 9 (Node 8 (Node 7 Empty Empty ) Empty)
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
48 (Node 1 (Node 0 Empty (Node 3 Empty Empty))
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
49 (Node 0 Empty (Node 3 Empty Empty)))
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
50 ]
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
51 {- End Library -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
52
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
53
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
54 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
55 {- Aufgabe G9.1 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
56
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
57 {-
22
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
58 Lemma(t): mirror (mirror t) = t
21
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
59 Proof by structural induction on t
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
60
22
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
61 Base case: Lemma(Empty)
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
62 To show: mirror (mirror Empty) = Empty
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
63 mirror (mirror Empty)
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
64 = mirror Empty mirror_Empty
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
65 = Empty mirror_Empty
21
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
66
22
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
67 Induction step: Lemma(l), Lemma(r) => Lemma((Node x l r))
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
68 IH1: mirror (mirror l) = l
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
69 IH2: mirror (mirror r) = r
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
70 To show: mirror (mirror (Node x l r)) = Node x l r
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
71 mirror (mirror (Node x l r))
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
72 = mirror (Node x (mirror r) (mirror l)) mirror_Node
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
73 = Node x (mirror (mirror l)) (mirror (mirror r)) mirror_Node
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
74 = Node x l (mirror (mirror r)) IH1
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
75 = Node x l r IH2
21
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
76
22
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
77 QED!
21
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
78 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
79
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
80
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
81
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
82 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
83 {- Aufgabe G9.2 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
84
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
85 balanced :: Tree a -> Bool
22
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
86 balanced t = dist max t - dist min t <= 1
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
87 where
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
88 dist f (Node _ l r) = 1 + f (dist f l) (dist f r)
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
89 dist _ Empty = 0
21
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
90
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
91
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
92
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
93 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
94 {- Aufgabe G9.3 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
95
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
96 type Coords = (Int, Int)
22
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
97 data Shape =
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
98 Line Coords Coords
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
99 | Circle Coords Int
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
100
21
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
101
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
102 move :: Coords -> Shape -> Shape
22
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
103 move (x,y) (Line (a,b) (c,d)) = Line (a+x, b+y) (c+x, d+y)
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
104 move (x,y) (Circle (a,b) r) = Circle (a+x, b+y) r
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
105
21
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
106
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
107 polygon :: [Shape] -> Bool
22
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
108 polygon ((Line from to) : ss) = polygon' from to ss
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
109 where
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
110 polygon' f t [] = f == t
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
111 polygon' f t ((Line lf lt) : ss) = t == lf && polygon' f lt ss
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
112 polygon' _ _ _ = False
498aea38199b week 9 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 21
diff changeset
113 polygon _ = False
21
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
114
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
115
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
116
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
117 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
118 {- Aufgabe H9.1 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
119
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
120 {-
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
121 Proof me!
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
122 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
123
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
124
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
125
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
126 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
127 {- Aufgabe H9.2 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
128
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
129 inorder :: Tree a -> [a]
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
130 inorder = undefined
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
131
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
132 preorder :: Tree a -> [a]
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
133 preorder = undefined
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
134
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
135 postorder :: Tree a -> [a]
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
136 postorder = undefined
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
137
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
138
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
139
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
140 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
141 {- Aufgabe H9.3 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
142
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
143 -- makeBalanced :: Int -> SkeleTree
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
144 -- makeBalanced = undefined
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
145 --
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
146 -- makeAllBalanced :: Int -> SkeleTree
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
147 -- makeAllBalanced = undefined
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
148
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
149
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
150
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
151 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
152 {- Aufgabe H9.4 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
153
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
154 find23 :: Ord a => a -> Tree23 a -> Bool
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
155 find23 = undefined