| author | haftmann | 
| Tue, 10 Aug 2010 15:38:33 +0200 | |
| changeset 38318 | 1fade69519ab | 
| parent 37653 | 847e95ca9b0a | 
| child 42245 | 29e3967550d5 | 
| permissions | -rw-r--r-- | 
| 37653 | 1 | (* Title: HOL/Library/Cardinality.thy | 
| 29629 | 2 | Author: Brian Huffman | 
| 24332 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 3 | *) | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 4 | |
| 37653 | 5 | header {* Cardinality of types *}
 | 
| 24332 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 6 | |
| 37653 | 7 | theory Cardinality | 
| 30663 
0b6aff7451b2
Main is (Complex_Main) base entry point in library theories
 haftmann parents: 
30506diff
changeset | 8 | imports Main | 
| 24332 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 9 | begin | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 10 | |
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 11 | subsection {* Preliminary lemmas *}
 | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 12 | (* These should be moved elsewhere *) | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 13 | |
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 14 | lemma (in type_definition) univ: | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 15 | "UNIV = Abs ` A" | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 16 | proof | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 17 | show "Abs ` A \<subseteq> UNIV" by (rule subset_UNIV) | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 18 | show "UNIV \<subseteq> Abs ` A" | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 19 | proof | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 20 | fix x :: 'b | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 21 | have "x = Abs (Rep x)" by (rule Rep_inverse [symmetric]) | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 22 | moreover have "Rep x \<in> A" by (rule Rep) | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 23 | ultimately show "x \<in> Abs ` A" by (rule image_eqI) | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 24 | qed | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 25 | qed | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 26 | |
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 27 | lemma (in type_definition) card: "card (UNIV :: 'b set) = card A" | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 28 | by (simp add: univ card_image inj_on_def Abs_inject) | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 29 | |
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 30 | |
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 31 | subsection {* Cardinalities of types *}
 | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 32 | |
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 33 | syntax "_type_card" :: "type => nat" ("(1CARD/(1'(_')))")
 | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 34 | |
| 35431 | 35 | translations "CARD('t)" => "CONST card (CONST UNIV \<Colon> 't set)"
 | 
| 24332 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 36 | |
| 24407 | 37 | typed_print_translation {*
 | 
| 38 | let | |
| 35115 | 39 |   fun card_univ_tr' show_sorts _ [Const (@{const_syntax UNIV}, Type(_, [T, _]))] =
 | 
| 40 |     Syntax.const @{syntax_const "_type_card"} $ Syntax.term_of_typ show_sorts T;
 | |
| 28920 | 41 | in [(@{const_syntax card}, card_univ_tr')]
 | 
| 24407 | 42 | end | 
| 43 | *} | |
| 44 | ||
| 30001 | 45 | lemma card_unit [simp]: "CARD(unit) = 1" | 
| 26153 | 46 | unfolding UNIV_unit by simp | 
| 24332 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 47 | |
| 30001 | 48 | lemma card_prod [simp]: "CARD('a \<times> 'b) = CARD('a::finite) * CARD('b::finite)"
 | 
| 26153 | 49 | unfolding UNIV_Times_UNIV [symmetric] by (simp only: card_cartesian_product) | 
| 24332 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 50 | |
| 30001 | 51 | lemma card_sum [simp]: "CARD('a + 'b) = CARD('a::finite) + CARD('b::finite)"
 | 
| 26153 | 52 | unfolding UNIV_Plus_UNIV [symmetric] by (simp only: finite card_Plus) | 
| 24332 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 53 | |
| 30001 | 54 | lemma card_option [simp]: "CARD('a option) = Suc CARD('a::finite)"
 | 
| 31080 | 55 | unfolding UNIV_option_conv | 
| 24332 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 56 | apply (subgoal_tac "(None::'a option) \<notin> range Some") | 
| 29997 | 57 | apply (simp add: card_image) | 
| 24332 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 58 | apply fast | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 59 | done | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 60 | |
| 30001 | 61 | lemma card_set [simp]: "CARD('a set) = 2 ^ CARD('a::finite)"
 | 
| 26153 | 62 | unfolding Pow_UNIV [symmetric] | 
| 24332 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 63 | by (simp only: card_Pow finite numeral_2_eq_2) | 
| 
e3a2b75b1cf9
boolean algebras as locales and numbers as types by Brian Huffman
 kleing parents: diff
changeset | 64 | |
| 30001 | 65 | lemma card_nat [simp]: "CARD(nat) = 0" | 
| 66 | by (simp add: infinite_UNIV_nat card_eq_0_iff) | |
| 67 | ||
| 68 | ||
| 69 | subsection {* Classes with at least 1 and 2  *}
 | |
| 70 | ||
| 71 | text {* Class finite already captures "at least 1" *}
 | |
| 72 | ||
| 73 | lemma zero_less_card_finite [simp]: "0 < CARD('a::finite)"
 | |
| 29997 | 74 | unfolding neq0_conv [symmetric] by simp | 
| 75 | ||
| 30001 | 76 | lemma one_le_card_finite [simp]: "Suc 0 \<le> CARD('a::finite)"
 | 
| 77 | by (simp add: less_Suc_eq_le [symmetric]) | |
| 78 | ||
| 79 | text {* Class for cardinality "at least 2" *}
 | |
| 80 | ||
| 81 | class card2 = finite + | |
| 82 |   assumes two_le_card: "2 \<le> CARD('a)"
 | |
| 83 | ||
| 84 | lemma one_less_card: "Suc 0 < CARD('a::card2)"
 | |
| 85 | using two_le_card [where 'a='a] by simp | |
| 86 | ||
| 87 | lemma one_less_int_card: "1 < int CARD('a::card2)"
 | |
| 88 | using one_less_card [where 'a='a] by simp | |
| 89 | ||
| 29997 | 90 | end |