src/HOL/Finite.ML
changeset 3352 04502e5431fb
parent 3340 a886795c9dce
child 3368 be517d000c02
equal deleted inserted replaced
3351:ed64b6799303 3352:04502e5431fb
   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);