annotate exercises/src/Exercise_10.hs @ 26:ce9610f08925

Merge
author Markus Kaiser <markus.kaiser@in.tum.de>
date Wed, 09 Jan 2013 19:45:47 +0100
parents 34fea195e238 ea3fba2381bc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
1 module Exercise_10 (module Join, module SafeMap) where
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 {- Library DO NOT CHANGE -}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
4 import SafeMap (SafeMap, empty, update, lookup)
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
5 import Join (Field, doJoin, doJoinFormat, parseFormat)
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
6 {- End Library -}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
7
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 {- Aufgabe G10.1 -}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
11
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
12 {-
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
13 \alpha ist wie in den Folien definiert:
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
14 alpha [] = {}
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
15 alpha (y:ys) = {y} union (alpha ys)
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
16
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
17 Simulationseigenschaften:
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 R_empty: \alpha empty = {}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
20 : a empty = {}
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
21 empty = []
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
22
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
23 a empty
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
24 == a [] -- by def of empty
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
25 == {} -- by def of alpha
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
26
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 R_insert: \alpha (insert x xs) = {x} \union \alpha xs
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
29 : a (insert x xs) = {x} union a xs
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
30 insert x xs = (x : xs)
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
31
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
32 a (insert x xs)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
33 == a (x : xs) -- by def of insert
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
34 == {x} union (a xs) -- by def of alpha
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
35
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
36 R_isin: isin x xs = x \in \alpha xs
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
37 : isin x xs = x \in a xs
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
38 isin x xs = elem x xs
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
39
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
40 isin x xs
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
41 == elem x xs -- by implementation
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
42 == x \in (a xs) -- by L_elem
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
43
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
44 R_size: size xs = |\alpha xs|
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
45 : size xs = | a xs|
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
46 size xs = length (nub xs)
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
47
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
48 size xs
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
49 == length (nub xs) -- by implementation
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
50 == |a xs| -- by L_length
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
51
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
52
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
53 Hilfslemmata:
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
54
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
55 Funktionen:
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
56
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
57 elem x [] = False -- elem_Empty
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
58 elem x (y:ys) = x == y || elem x ys -- elem_Cons
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
59
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
60 nub [] = [] -- nub_Empty
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
61 nub (y:ys) = -- nub_Cons
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
62 if y `elem` ys then nub ys
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
63 else {- not elem -} y : (nub ys)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
64
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
65 ---
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
66
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
67 L_elem(xs): elem x xs = x \in a xs
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
68 Proof by structural induction on xs
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
69
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
70 Base case: L_elem([])
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
71 To show: elem x [] = x \in a []
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
72 elem x []
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
73 == False -- by elem_Empty
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
74
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
75 x \in a []
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
76 == x \in {} -- by alpha
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
77 == False -- by {}
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
78
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
79 Induction step: L_elem(ys) => L_elem(y : ys)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
80 IH: elem x ys = x \in (a ys)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
81 To show: elem x (y:ys) = x \in a (y:ys)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
82 elem x (y:ys)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
83 == x == y || elem x ys -- by elem_Cons
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
84 == x == y || x \in (a ys) -- by IH
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
85
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
86 x \in a (y:ys)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
87 == x \in ({y} union (a ys)) -- alpha_Cons
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
88 == x \in {y} || x \in (a ys) -- by union
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
89 == x == y || x \in (a ys) -- by basic property
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
90
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
91 qed
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
92
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
93 ---
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
94
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
95
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
96 L_length(xs): length (nub xs) = |a xs|
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
97 Proof by structural induction on xs
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
98
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
99 Base case: L_length([])
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
100 To show: length (nub []) = |a []|
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
101 length (nub [])
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
102 == length [] -- by nub_Empty
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
103 == 0 -- by def of length
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
104
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
105 |a []|
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
106 == |{}| -- by alpha
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
107 == 0 -- by def of ||
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
108
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
109 Induction step: L_length(ys) => L_length(y : ys)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
110 IH: length (nub ys) = |a ys|
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
111 To show: length (nub (y:ys)) = |a (y:ys)|
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
112 Proof by cases
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
113 case: y `elem` ys
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
114 length (nub (y:ys))
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
115 == length (nub ys) -- by nub_Cons
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
116 == |a ys| -- IH
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
117
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
118 |a (y:ys)|
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
119 == |{y} union a ys| -- alpha_Cons
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
120 == |(a ys)| -- by basic property
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
121
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
122 case: not (y `elem` ys)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
123 length (nub (y:ys))
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
124 == length (y : (nub ys)) -- by nub_Cons
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
125 == 1 + length [] + length (nub ys) -- by length_Cons
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
126 == 1 + length (nub ys) -- by length_Empty
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
127 == 1 + |a ys| -- IH
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
128
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
129 |a (y:ys)|
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
130 == |{y} union a ys| -- alpha_Cons
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
131 == |{y}| + |a ys| -- by def of union, case
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
132 == 1 + |a ys| -- by def of ||
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
133
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
134 qed
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
135
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
136 -}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
137
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
138
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
139
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
140 {---------------------------------------------------------------------}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
141 {- Aufgabe G10.2 -}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
142
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
143 {- siehe SetPairList.hs -}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
144
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
145
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
146
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
147 {---------------------------------------------------------------------}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
148 {- Aufgabe G10.3 -}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
149
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
150 {- siehe Queue.hs und SuperQueue.hs -}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
151
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
152 {-
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
153 Simulationseigenschaften zu beweisen:
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
154
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
155 \alpha empty = []
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
156 isEmpty q = \alpha q == []
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
157 \alpha (enqueue x q) = \alpha q ++ [x]
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
158 ~ isEmpty q ==> \alpha (dequeue q) = (head (\alpha q), tail (\alpha q))
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
159 q == q' = \alpha q == \alpha q'
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
160
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
161 Definition von \alpha:
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
162
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
163 \alpha (Queue front kcab) = front ++ reverse kcab
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
164
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
165 Beweis fuer "empty":
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
166
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
167 \alpha empty
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
168 = \alpha (Queue [] []) -- by def of empty
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
169 = [] ++ reverse [] -- by def of \alpha
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
170 = [] -- by def of reverse, ++
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
171
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
172 Beweis fuer "isEmpty":
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
173
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
174 Hilfssatz: q == Queue [] [] = \alpha q == []
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
175
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
176 isEmpty q
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
177 = q == Queue [] [] -- by def of isEmpty
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
178 = \alpha q == [] -- by lemma
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
179
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
180 Beweis fuer "enqueue":
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
181
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
182 Sei q = Queue front kcab -- by exhaustivity of constructor
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
183
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
184 \alpha (enqueue x q)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
185 = \alpha (enqueue x (Queue front kcab))
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
186 -- by def of q
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
187 = \alpha (Queue (front (x : kcab))) -- by def of enqueue
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
188 = front ++ reverse (x : kcab) -- by def of \alpha
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
189 = front ++ (reverse kcab ++ [x]) -- by def of reverse
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
190 = (front ++ reverse kcab) ++ [x] -- by commutativity of ++
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
191 = \alpha (Queue front kcab) ++ [x] -- by def of \alpha
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
192 = \alpha q ++ [x] -- by def of q
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
193
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
194 Hilfslemma L:
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
195
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
196 Zu beweisen: \alpha (Queue [] kcab) = \alpha (Queue (reverse kcab) [])
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
197
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
198 \alpha (Queue [] kcab)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
199 = [] ++ reverse kcab -- by def of \alpha
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
200 = reverse kcab -- by def of ++
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
201
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
202 \alpha (Queue (reverse kcab) [])
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
203 = reverse kcab ++ [] -- by def of \alpha
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
204 = reverse kcab -- by def of ++
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
205
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
206 Beweis fuer "dequeue":
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
207
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
208 Annahme: ~ isEmpty q
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
209
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
210 Sei q = Queue front kcab
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
211
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
212 Fallunterscheidung auf front und kcab:
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
213
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
214 Fall front = [], kcab = []:
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
215 ~ isEmpty (Queue front kcab)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
216 = ~ isEmpty (Queue [] [])
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
217 = False
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
218 Nichts mehr zu beweisen, weil die Annahme nicht erfuellt ist.
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
219
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
220 Fall front /= []:
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
221 \alpha (dequeue q)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
222 = \alpha (dequeue (Queue front kcab))
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
223 -- def of q
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
224 = \alpha (head front, Queue (tail front) kcab)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
225 -- def of dequeue (2nd equation)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
226 = (head front, \alpha (Queue (tail front) kcab))
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
227 -- \alpha is an homomorphism
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
228
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
229 Es bleibt zu beweisen, dass
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
230
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
231 head front = head (\alpha q)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
232 \alpha (Queue (tail front) kcab) = tail (\alpha q)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
233
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
234 head (\alpha q)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
235 = head (\alpha (Queue front kcab)) -- def of q
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
236 = head (front ++ reverse kcab) -- def of \alpha
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
237 = head front -- basic prop of head, front /= []
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
238
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
239 \alpha (Queue (tail front) kcab)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
240 = tail front ++ reverse kcab -- def of \alpha
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
241
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
242 tail (\alpha q)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
243 = tail (\alpha (Queue front kcab)) -- def of q
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
244 = tail (front ++ reverse kcab) -- def of \alpha
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
245 = tail front ++ reverse kcab -- basic prop of tail, front /= []
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
246
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
247 Fall front = [], kcab /= []:
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
248 \alpha (dequeue q)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
249 = \alpha (dequeue (Queue front kcab)) -- def of q
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
250 = \alpha (dequeue (Queue [] kcab)) -- assumption front = []
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
251 = \alpha (dequeue (Queue (reverse kcab) []))
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
252 -- def of dequeue (1st equation)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
253 = (head (\alpha (Queue (reverse kcab) [])),
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
254 tail (\alpha (Queue (reverse kcab) [])))
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
255 -- by reduction to already proved
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
256 -- case, reverse kcab /= []
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
257 = (head (\alpha (Queue [] kcab)), tail (\alpha (Queue [] kcab)))
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
258 -- by lemma L (twice)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
259 = (head (\alpha q), tail (\alpha q)) -- by def of q (twice)
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
260
25
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
261 Beweis fuer ==:
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
262
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
263 Zu beweisen: q == q' = \alpha q == \alpha q'
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
264
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
265 Seien q = Queue (front kcab)
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
266 q' = Queue (front' kcab')
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
267
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
268 q == q'
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
269 = Queue (front kcab) == Queue (front' kcab')
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
270 -- by def of q, q'
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
271 = toList (Queue (front kcab)) == toList (Queue (front' kcab'))
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
272 -- by def of ==
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
273 = front ++ reverse kcab == front' ++ reverse kcab'
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
274 -- by def of toList
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
275
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
276 \alpha q == \alpha q'
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
277 = \alpha (Queue (front kcab)) == \alpha (Queue (front' kcab'))
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
278 -- by def of ==
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
279 = front ++ reverse kcab == front' ++ reverse kcab'
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
280 -- by def of \alpha
ea3fba2381bc week 10 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 23
diff changeset
281
23
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
282 -}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
283
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
284
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
285
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
286 {---------------------------------------------------------------------}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
287 {- Aufgabe H10.1 -}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
288
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
289 {- siehe SafeMap.hs -}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
290
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
291
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
292
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
293 {---------------------------------------------------------------------}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
294 {- Aufgabe H10.2 -}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
295
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
296 {- siehe Join.hs -}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
297
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
298
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
299
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
300 {---------------------------------------------------------------------}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
301 {- Aufgabe H10.3 -}
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
302
f9386825bf71 week 10
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
303 {- siehe Morsi.hs -}