13 |
13 |
14 datatype 'a bt = |
14 datatype 'a bt = |
15 Lf |
15 Lf |
16 | Br 'a "'a bt" "'a bt" |
16 | Br 'a "'a bt" "'a bt" |
17 |
17 |
18 consts |
18 primrec n_nodes :: "'a bt => nat" where |
19 n_nodes :: "'a bt => nat" |
|
20 n_leaves :: "'a bt => nat" |
|
21 depth :: "'a bt => nat" |
|
22 reflect :: "'a bt => 'a bt" |
|
23 bt_map :: "('a => 'b) => ('a bt => 'b bt)" |
|
24 preorder :: "'a bt => 'a list" |
|
25 inorder :: "'a bt => 'a list" |
|
26 postorder :: "'a bt => 'a list" |
|
27 appnd :: "'a bt => 'a bt => 'a bt" |
|
28 |
|
29 primrec |
|
30 "n_nodes Lf = 0" |
19 "n_nodes Lf = 0" |
31 "n_nodes (Br a t1 t2) = Suc (n_nodes t1 + n_nodes t2)" |
20 | "n_nodes (Br a t1 t2) = Suc (n_nodes t1 + n_nodes t2)" |
32 |
21 |
33 primrec |
22 primrec n_leaves :: "'a bt => nat" where |
34 "n_leaves Lf = Suc 0" |
23 "n_leaves Lf = Suc 0" |
35 "n_leaves (Br a t1 t2) = n_leaves t1 + n_leaves t2" |
24 | "n_leaves (Br a t1 t2) = n_leaves t1 + n_leaves t2" |
36 |
25 |
37 primrec |
26 primrec depth :: "'a bt => nat" where |
38 "depth Lf = 0" |
27 "depth Lf = 0" |
39 "depth (Br a t1 t2) = Suc (max (depth t1) (depth t2))" |
28 | "depth (Br a t1 t2) = Suc (max (depth t1) (depth t2))" |
40 |
29 |
41 primrec |
30 primrec reflect :: "'a bt => 'a bt" where |
42 "reflect Lf = Lf" |
31 "reflect Lf = Lf" |
43 "reflect (Br a t1 t2) = Br a (reflect t2) (reflect t1)" |
32 | "reflect (Br a t1 t2) = Br a (reflect t2) (reflect t1)" |
44 |
33 |
45 primrec |
34 primrec bt_map :: "('a => 'b) => ('a bt => 'b bt)" where |
46 "bt_map f Lf = Lf" |
35 "bt_map f Lf = Lf" |
47 "bt_map f (Br a t1 t2) = Br (f a) (bt_map f t1) (bt_map f t2)" |
36 | "bt_map f (Br a t1 t2) = Br (f a) (bt_map f t1) (bt_map f t2)" |
48 |
37 |
49 primrec |
38 primrec preorder :: "'a bt => 'a list" where |
50 "preorder Lf = []" |
39 "preorder Lf = []" |
51 "preorder (Br a t1 t2) = [a] @ (preorder t1) @ (preorder t2)" |
40 | "preorder (Br a t1 t2) = [a] @ (preorder t1) @ (preorder t2)" |
52 |
41 |
53 primrec |
42 primrec inorder :: "'a bt => 'a list" where |
54 "inorder Lf = []" |
43 "inorder Lf = []" |
55 "inorder (Br a t1 t2) = (inorder t1) @ [a] @ (inorder t2)" |
44 | "inorder (Br a t1 t2) = (inorder t1) @ [a] @ (inorder t2)" |
56 |
45 |
57 primrec |
46 primrec postorder :: "'a bt => 'a list" where |
58 "postorder Lf = []" |
47 "postorder Lf = []" |
59 "postorder (Br a t1 t2) = (postorder t1) @ (postorder t2) @ [a]" |
48 | "postorder (Br a t1 t2) = (postorder t1) @ (postorder t2) @ [a]" |
60 |
49 |
61 primrec |
50 primrec append :: "'a bt => 'a bt => 'a bt" where |
62 "appnd Lf t = t" |
51 "append Lf t = t" |
63 "appnd (Br a t1 t2) t = Br a (appnd t1 t) (appnd t2 t)" |
52 | "append (Br a t1 t2) t = Br a (append t1 t) (append t2 t)" |
64 |
|
65 |
53 |
66 text {* \medskip BT simplification *} |
54 text {* \medskip BT simplification *} |
67 |
55 |
68 declare [[ sledgehammer_problem_prefix = "BT__n_leaves_reflect" ]] |
56 declare [[ sledgehammer_problem_prefix = "BT__n_leaves_reflect" ]] |
69 |
57 |
133 apply (rule ext) |
121 apply (rule ext) |
134 apply (induct_tac y) |
122 apply (induct_tac y) |
135 apply (metis bt_map.simps(1)) |
123 apply (metis bt_map.simps(1)) |
136 by (metis bt_map.simps(2)) |
124 by (metis bt_map.simps(2)) |
137 |
125 |
138 declare [[ sledgehammer_problem_prefix = "BT__bt_map_appnd" ]] |
126 declare [[ sledgehammer_problem_prefix = "BT__bt_map_append" ]] |
139 |
127 |
140 lemma bt_map_appnd: "bt_map f (appnd t u) = appnd (bt_map f t) (bt_map f u)" |
128 lemma bt_map_append: "bt_map f (append t u) = append (bt_map f t) (bt_map f u)" |
141 apply (induct t) |
129 apply (induct t) |
142 apply (metis appnd.simps(1) bt_map.simps(1)) |
130 apply (metis append.simps(1) bt_map.simps(1)) |
143 by (metis appnd.simps(2) bt_map.simps(2)) |
131 by (metis append.simps(2) bt_map.simps(2)) |
144 |
132 |
145 declare [[ sledgehammer_problem_prefix = "BT__bt_map_compose" ]] |
133 declare [[ sledgehammer_problem_prefix = "BT__bt_map_compose" ]] |
146 |
134 |
147 lemma bt_map_compose: "bt_map (f o g) t = bt_map f (bt_map g t)" |
135 lemma bt_map_compose: "bt_map (f o g) t = bt_map f (bt_map g t)" |
148 apply (induct t) |
136 apply (induct t) |
217 |
205 |
218 lemma preorder_reflect: "preorder (reflect t) = rev (postorder t)" |
206 lemma preorder_reflect: "preorder (reflect t) = rev (postorder t)" |
219 apply (induct t) |
207 apply (induct t) |
220 apply (metis Nil_is_rev_conv postorder.simps(1) preorder.simps(1) |
208 apply (metis Nil_is_rev_conv postorder.simps(1) preorder.simps(1) |
221 reflect.simps(1)) |
209 reflect.simps(1)) |
222 by (metis append.simps(1) append.simps(2) postorder.simps(2) preorder.simps(2) |
210 apply simp |
223 reflect.simps(2) rev.simps(2) rev_append rev_swap) |
211 done |
224 |
212 |
225 declare [[ sledgehammer_problem_prefix = "BT__inorder_reflect" ]] |
213 declare [[ sledgehammer_problem_prefix = "BT__inorder_reflect" ]] |
226 |
214 |
227 lemma inorder_reflect: "inorder (reflect t) = rev (inorder t)" |
215 lemma inorder_reflect: "inorder (reflect t) = rev (inorder t)" |
228 apply (induct t) |
216 apply (induct t) |
243 |
231 |
244 text {* |
232 text {* |
245 Analogues of the standard properties of the append function for lists. |
233 Analogues of the standard properties of the append function for lists. |
246 *} |
234 *} |
247 |
235 |
248 declare [[ sledgehammer_problem_prefix = "BT__appnd_assoc" ]] |
236 declare [[ sledgehammer_problem_prefix = "BT__append_assoc" ]] |
249 |
237 |
250 lemma appnd_assoc [simp]: "appnd (appnd t1 t2) t3 = appnd t1 (appnd t2 t3)" |
238 lemma append_assoc [simp]: "append (append t1 t2) t3 = append t1 (append t2 t3)" |
251 apply (induct t1) |
239 apply (induct t1) |
252 apply (metis appnd.simps(1)) |
240 apply (metis append.simps(1)) |
253 by (metis appnd.simps(2)) |
241 by (metis append.simps(2)) |
254 |
242 |
255 declare [[ sledgehammer_problem_prefix = "BT__appnd_Lf2" ]] |
243 declare [[ sledgehammer_problem_prefix = "BT__append_Lf2" ]] |
256 |
244 |
257 lemma appnd_Lf2 [simp]: "appnd t Lf = t" |
245 lemma append_Lf2 [simp]: "append t Lf = t" |
258 apply (induct t) |
246 apply (induct t) |
259 apply (metis appnd.simps(1)) |
247 apply (metis append.simps(1)) |
260 by (metis appnd.simps(2)) |
248 by (metis append.simps(2)) |
261 |
249 |
262 declare max_add_distrib_left [simp] |
250 declare max_add_distrib_left [simp] |
263 |
251 |
264 declare [[ sledgehammer_problem_prefix = "BT__depth_appnd" ]] |
252 declare [[ sledgehammer_problem_prefix = "BT__depth_append" ]] |
265 |
253 |
266 lemma depth_appnd [simp]: "depth (appnd t1 t2) = depth t1 + depth t2" |
254 lemma depth_append [simp]: "depth (append t1 t2) = depth t1 + depth t2" |
267 apply (induct t1) |
255 apply (induct t1) |
268 apply (metis appnd.simps(1) depth.simps(1) plus_nat.simps(1)) |
256 apply (metis append.simps(1) depth.simps(1) plus_nat.simps(1)) |
269 by simp |
257 by simp |
270 |
258 |
271 declare [[ sledgehammer_problem_prefix = "BT__n_leaves_appnd" ]] |
259 declare [[ sledgehammer_problem_prefix = "BT__n_leaves_append" ]] |
272 |
260 |
273 lemma n_leaves_appnd [simp]: |
261 lemma n_leaves_append [simp]: |
274 "n_leaves (appnd t1 t2) = n_leaves t1 * n_leaves t2" |
262 "n_leaves (append t1 t2) = n_leaves t1 * n_leaves t2" |
275 apply (induct t1) |
263 apply (induct t1) |
276 apply (metis appnd.simps(1) n_leaves.simps(1) nat_mult_1 plus_nat.simps(1) |
264 apply (metis append.simps(1) n_leaves.simps(1) nat_mult_1 plus_nat.simps(1) |
277 semiring_norm(111)) |
265 semiring_norm(111)) |
278 by (simp add: left_distrib) |
266 by (simp add: left_distrib) |
279 |
267 |
280 declare [[ sledgehammer_problem_prefix = "BT__bt_map_appnd" ]] |
268 declare [[ sledgehammer_problem_prefix = "BT__bt_map_append" ]] |
281 |
269 |
282 lemma (*bt_map_appnd:*) |
270 lemma (*bt_map_append:*) |
283 "bt_map f (appnd t1 t2) = appnd (bt_map f t1) (bt_map f t2)" |
271 "bt_map f (append t1 t2) = append (bt_map f t1) (bt_map f t2)" |
284 apply (induct t1) |
272 apply (induct t1) |
285 apply (metis appnd.simps(1) bt_map.simps(1)) |
273 apply (metis append.simps(1) bt_map.simps(1)) |
286 by (metis bt_map_appnd) |
274 by (metis bt_map_append) |
287 |
275 |
288 end |
276 end |