130 by (assume_tac 1); |
130 by (assume_tac 1); |
131 qed "finite_subset"; |
131 qed "finite_subset"; |
132 |
132 |
133 goalw Finite.thy [finite_def] "finite(F Un G) = (finite F & finite G)"; |
133 goalw Finite.thy [finite_def] "finite(F Un G) = (finite F & finite G)"; |
134 by (Simp_tac 1); |
134 by (Simp_tac 1); |
135 qed "subset_finite"; |
135 qed "finite_Un_eq"; |
136 Addsimps[subset_finite]; |
136 Addsimps[finite_Un_eq]; |
137 |
137 |
138 goalw Finite.thy [finite_def] "finite(insert a A) = finite(A)"; |
138 goalw Finite.thy [finite_def] "finite(insert a A) = finite(A)"; |
139 by (Simp_tac 1); |
139 by (Simp_tac 1); |
140 qed "insert_finite"; |
140 qed "finite_insert"; |
141 Addsimps[insert_finite]; |
141 Addsimps[finite_insert]; |
142 |
142 |
143 (* finite B ==> finite (B - Ba) *) |
143 (* finite B ==> finite (B - Ba) *) |
144 bind_thm ("finite_Diff", Diff_subset RS finite_subset); |
144 bind_thm ("finite_Diff", Diff_subset RS finite_subset); |
145 Addsimps [finite_Diff]; |
145 Addsimps [finite_Diff]; |
146 |
146 |
289 goalw Finite.thy [card_def] |
289 goalw Finite.thy [card_def] |
290 "!!A. [| finite A; x ~: A |] ==> card(insert x A) = Suc(card A)"; |
290 "!!A. [| finite A; x ~: A |] ==> card(insert x A) = Suc(card A)"; |
291 by (etac lemma 1); |
291 by (etac lemma 1); |
292 by (assume_tac 1); |
292 by (assume_tac 1); |
293 qed "card_insert_disjoint"; |
293 qed "card_insert_disjoint"; |
294 |
294 Addsimps [card_insert_disjoint]; |
295 goal Finite.thy "!!A. [| finite A; x: A |] ==> Suc(card(A-{x})) = card A"; |
|
296 by (res_inst_tac [("t", "A")] (insert_Diff RS subst) 1); |
|
297 by (assume_tac 1); |
|
298 by (asm_simp_tac (!simpset addsimps [card_insert_disjoint]) 1); |
|
299 qed "card_Suc_Diff"; |
|
300 |
|
301 goal Finite.thy "!!A. [| finite A; x: A |] ==> card(A-{x}) < card A"; |
|
302 by (rtac Suc_less_SucD 1); |
|
303 by (asm_simp_tac (!simpset addsimps [card_Suc_Diff]) 1); |
|
304 qed "card_Diff"; |
|
305 |
|
306 val [major] = goal Finite.thy |
|
307 "finite A ==> card(insert x A) = Suc(card(A-{x}))"; |
|
308 by (case_tac "x:A" 1); |
|
309 by (asm_simp_tac (!simpset addsimps [insert_absorb]) 1); |
|
310 by (dtac mk_disjoint_insert 1); |
|
311 by (etac exE 1); |
|
312 by (Asm_simp_tac 1); |
|
313 by (rtac card_insert_disjoint 1); |
|
314 by (rtac (major RSN (2,finite_subset)) 1); |
|
315 by (Blast_tac 1); |
|
316 by (Blast_tac 1); |
|
317 by (asm_simp_tac (!simpset addsimps [major RS card_insert_disjoint]) 1); |
|
318 qed "card_insert"; |
|
319 Addsimps [card_insert]; |
|
320 |
|
321 |
|
322 goal Finite.thy "!!A. finite(A) ==> inj_onto f A --> card (f `` A) = card A"; |
|
323 by (etac finite_induct 1); |
|
324 by (ALLGOALS Asm_simp_tac); |
|
325 by (Step_tac 1); |
|
326 bw inj_onto_def; |
|
327 by (Blast_tac 1); |
|
328 by (stac card_insert_disjoint 1); |
|
329 by (etac finite_imageI 1); |
|
330 by (Blast_tac 1); |
|
331 by (Blast_tac 1); |
|
332 qed_spec_mp "card_image"; |
|
333 |
|
334 |
295 |
335 goal Finite.thy "!!A. finite A ==> !B. B <= A --> card(B) <= card(A)"; |
296 goal Finite.thy "!!A. finite A ==> !B. B <= A --> card(B) <= card(A)"; |
336 by (etac finite_induct 1); |
297 by (etac finite_induct 1); |
337 by (Simp_tac 1); |
298 by (Simp_tac 1); |
338 by (strip_tac 1); |
299 by (strip_tac 1); |
342 by (rotate_tac ~1 1); |
303 by (rotate_tac ~1 1); |
343 by (asm_full_simp_tac (!simpset addsimps [subset_insert_iff,finite_subset]) 1); |
304 by (asm_full_simp_tac (!simpset addsimps [subset_insert_iff,finite_subset]) 1); |
344 by (rotate_tac ~1 1); |
305 by (rotate_tac ~1 1); |
345 by (asm_full_simp_tac (!simpset addsimps [subset_insert_iff,finite_subset]) 1); |
306 by (asm_full_simp_tac (!simpset addsimps [subset_insert_iff,finite_subset]) 1); |
346 qed_spec_mp "card_mono"; |
307 qed_spec_mp "card_mono"; |
|
308 |
|
309 goal Finite.thy "!!A B. [| finite A; finite B |]\ |
|
310 \ ==> A Int B = {} --> card(A Un B) = card A + card B"; |
|
311 by (etac finite_induct 1); |
|
312 by (ALLGOALS |
|
313 (asm_simp_tac (!simpset addsimps [Un_insert_left, Int_insert_left] |
|
314 setloop split_tac [expand_if]))); |
|
315 qed_spec_mp "card_Un_disjoint"; |
|
316 |
|
317 goal Finite.thy "!!A. [| finite A; B<=A |] ==> card A - card B = card (A - B)"; |
|
318 by (subgoal_tac "(A-B) Un B = A" 1); |
|
319 by (Blast_tac 2); |
|
320 br (add_right_cancel RS iffD1) 1; |
|
321 br (card_Un_disjoint RS subst) 1; |
|
322 be ssubst 4; |
|
323 by (Blast_tac 3); |
|
324 by (ALLGOALS |
|
325 (asm_simp_tac |
|
326 (!simpset addsimps [add_commute, not_less_iff_le, |
|
327 add_diff_inverse, card_mono, finite_subset]))); |
|
328 qed "card_Diff_subset"; |
|
329 |
|
330 goal Finite.thy "!!A. [| finite A; x: A |] ==> Suc(card(A-{x})) = card A"; |
|
331 by (res_inst_tac [("t", "A")] (insert_Diff RS subst) 1); |
|
332 by (assume_tac 1); |
|
333 by (Asm_simp_tac 1); |
|
334 qed "card_Suc_Diff"; |
|
335 |
|
336 goal Finite.thy "!!A. [| finite A; x: A |] ==> card(A-{x}) < card A"; |
|
337 by (rtac Suc_less_SucD 1); |
|
338 by (asm_simp_tac (!simpset addsimps [card_Suc_Diff]) 1); |
|
339 qed "card_Diff"; |
|
340 |
|
341 val [major] = goal Finite.thy |
|
342 "finite A ==> card(insert x A) = Suc(card(A-{x}))"; |
|
343 by (case_tac "x:A" 1); |
|
344 by (asm_simp_tac (!simpset addsimps [insert_absorb]) 1); |
|
345 by (dtac mk_disjoint_insert 1); |
|
346 by (etac exE 1); |
|
347 by (Asm_simp_tac 1); |
|
348 by (rtac card_insert_disjoint 1); |
|
349 by (rtac (major RSN (2,finite_subset)) 1); |
|
350 by (Blast_tac 1); |
|
351 by (Blast_tac 1); |
|
352 by (asm_simp_tac (!simpset addsimps [major RS card_insert_disjoint]) 1); |
|
353 qed "card_insert"; |
|
354 Addsimps [card_insert]; |
|
355 |
|
356 |
|
357 goal Finite.thy "!!A. finite(A) ==> inj_onto f A --> card (f `` A) = card A"; |
|
358 by (etac finite_induct 1); |
|
359 by (ALLGOALS Asm_simp_tac); |
|
360 by (Step_tac 1); |
|
361 bw inj_onto_def; |
|
362 by (Blast_tac 1); |
|
363 by (stac card_insert_disjoint 1); |
|
364 by (etac finite_imageI 1); |
|
365 by (Blast_tac 1); |
|
366 by (Blast_tac 1); |
|
367 qed_spec_mp "card_image"; |
|
368 |
347 |
369 |
348 goalw Finite.thy [psubset_def] |
370 goalw Finite.thy [psubset_def] |
349 "!!B. finite B ==> !A. A < B --> card(A) < card(B)"; |
371 "!!B. finite B ==> !A. A < B --> card(A) < card(B)"; |
350 by (etac finite_induct 1); |
372 by (etac finite_induct 1); |
351 by (Simp_tac 1); |
373 by (Simp_tac 1); |