40 Syntax.const "_type_card" $ Syntax.term_of_typ show_sorts T; |
40 Syntax.const "_type_card" $ Syntax.term_of_typ show_sorts T; |
41 in [(@{const_syntax card}, card_univ_tr')] |
41 in [(@{const_syntax card}, card_univ_tr')] |
42 end |
42 end |
43 *} |
43 *} |
44 |
44 |
45 lemma card_unit: "CARD(unit) = 1" |
45 lemma card_unit [simp]: "CARD(unit) = 1" |
46 unfolding UNIV_unit by simp |
46 unfolding UNIV_unit by simp |
47 |
47 |
48 lemma card_bool: "CARD(bool) = 2" |
48 lemma card_bool [simp]: "CARD(bool) = 2" |
49 unfolding UNIV_bool by simp |
49 unfolding UNIV_bool by simp |
50 |
50 |
51 lemma card_prod: "CARD('a::finite \<times> 'b::finite) = CARD('a) * CARD('b)" |
51 lemma card_prod [simp]: "CARD('a \<times> 'b) = CARD('a::finite) * CARD('b::finite)" |
52 unfolding UNIV_Times_UNIV [symmetric] by (simp only: card_cartesian_product) |
52 unfolding UNIV_Times_UNIV [symmetric] by (simp only: card_cartesian_product) |
53 |
53 |
54 lemma card_sum: "CARD('a::finite + 'b::finite) = CARD('a) + CARD('b)" |
54 lemma card_sum [simp]: "CARD('a + 'b) = CARD('a::finite) + CARD('b::finite)" |
55 unfolding UNIV_Plus_UNIV [symmetric] by (simp only: finite card_Plus) |
55 unfolding UNIV_Plus_UNIV [symmetric] by (simp only: finite card_Plus) |
56 |
56 |
57 lemma card_option: "CARD('a::finite option) = Suc CARD('a)" |
57 lemma card_option [simp]: "CARD('a option) = Suc CARD('a::finite)" |
58 unfolding insert_None_conv_UNIV [symmetric] |
58 unfolding insert_None_conv_UNIV [symmetric] |
59 apply (subgoal_tac "(None::'a option) \<notin> range Some") |
59 apply (subgoal_tac "(None::'a option) \<notin> range Some") |
60 apply (simp add: card_image) |
60 apply (simp add: card_image) |
61 apply fast |
61 apply fast |
62 done |
62 done |
63 |
63 |
64 lemma card_set: "CARD('a::finite set) = 2 ^ CARD('a)" |
64 lemma card_set [simp]: "CARD('a set) = 2 ^ CARD('a::finite)" |
65 unfolding Pow_UNIV [symmetric] |
65 unfolding Pow_UNIV [symmetric] |
66 by (simp only: card_Pow finite numeral_2_eq_2) |
66 by (simp only: card_Pow finite numeral_2_eq_2) |
67 |
67 |
68 lemma card_finite_pos [simp]: "0 < CARD('a::finite)" |
68 lemma card_nat [simp]: "CARD(nat) = 0" |
|
69 by (simp add: infinite_UNIV_nat card_eq_0_iff) |
|
70 |
|
71 |
|
72 subsection {* Classes with at least 1 and 2 *} |
|
73 |
|
74 text {* Class finite already captures "at least 1" *} |
|
75 |
|
76 lemma zero_less_card_finite [simp]: "0 < CARD('a::finite)" |
69 unfolding neq0_conv [symmetric] by simp |
77 unfolding neq0_conv [symmetric] by simp |
|
78 |
|
79 lemma one_le_card_finite [simp]: "Suc 0 \<le> CARD('a::finite)" |
|
80 by (simp add: less_Suc_eq_le [symmetric]) |
|
81 |
|
82 text {* Class for cardinality "at least 2" *} |
|
83 |
|
84 class card2 = finite + |
|
85 assumes two_le_card: "2 \<le> CARD('a)" |
|
86 |
|
87 lemma one_less_card: "Suc 0 < CARD('a::card2)" |
|
88 using two_le_card [where 'a='a] by simp |
|
89 |
|
90 lemma one_less_int_card: "1 < int CARD('a::card2)" |
|
91 using one_less_card [where 'a='a] by simp |
70 |
92 |
71 |
93 |
72 subsection {* Numeral Types *} |
94 subsection {* Numeral Types *} |
73 |
95 |
74 typedef (open) num0 = "UNIV :: nat set" .. |
96 typedef (open) num0 = "UNIV :: nat set" .. |
83 typedef (open) 'a bit1 = "{0 ..< 1 + 2 * int CARD('a::finite)}" |
105 typedef (open) 'a bit1 = "{0 ..< 1 + 2 * int CARD('a::finite)}" |
84 proof |
106 proof |
85 show "0 \<in> {0 ..< 1 + 2 * int CARD('a)}" |
107 show "0 \<in> {0 ..< 1 + 2 * int CARD('a)}" |
86 by simp |
108 by simp |
87 qed |
109 qed |
|
110 |
|
111 lemma card_num0 [simp]: "CARD (num0) = 0" |
|
112 unfolding type_definition.card [OF type_definition_num0] |
|
113 by simp |
|
114 |
|
115 lemma card_num1 [simp]: "CARD(num1) = 1" |
|
116 unfolding type_definition.card [OF type_definition_num1] |
|
117 by (simp only: card_unit) |
|
118 |
|
119 lemma card_bit0 [simp]: "CARD('a bit0) = 2 * CARD('a::finite)" |
|
120 unfolding type_definition.card [OF type_definition_bit0] |
|
121 by simp |
|
122 |
|
123 lemma card_bit1 [simp]: "CARD('a bit1) = Suc (2 * CARD('a::finite))" |
|
124 unfolding type_definition.card [OF type_definition_bit1] |
|
125 by simp |
88 |
126 |
89 instance num1 :: finite |
127 instance num1 :: finite |
90 proof |
128 proof |
91 show "finite (UNIV::num1 set)" |
129 show "finite (UNIV::num1 set)" |
92 unfolding type_definition.univ [OF type_definition_num1] |
130 unfolding type_definition.univ [OF type_definition_num1] |
93 using finite by (rule finite_imageI) |
131 using finite by (rule finite_imageI) |
94 qed |
132 qed |
95 |
133 |
96 instance bit0 :: (finite) finite |
134 instance bit0 :: (finite) card2 |
97 proof |
135 proof |
98 show "finite (UNIV::'a bit0 set)" |
136 show "finite (UNIV::'a bit0 set)" |
99 unfolding type_definition.univ [OF type_definition_bit0] |
137 unfolding type_definition.univ [OF type_definition_bit0] |
100 by simp |
138 by simp |
101 qed |
139 show "2 \<le> CARD('a bit0)" |
102 |
140 by simp |
103 instance bit1 :: (finite) finite |
141 qed |
|
142 |
|
143 instance bit1 :: (finite) card2 |
104 proof |
144 proof |
105 show "finite (UNIV::'a bit1 set)" |
145 show "finite (UNIV::'a bit1 set)" |
106 unfolding type_definition.univ [OF type_definition_bit1] |
146 unfolding type_definition.univ [OF type_definition_bit1] |
107 by simp |
147 by simp |
108 qed |
148 show "2 \<le> CARD('a bit1)" |
109 |
149 by simp |
110 lemma card_num1: "CARD(num1) = 1" |
150 qed |
111 unfolding type_definition.card [OF type_definition_num1] |
|
112 by (simp only: card_unit) |
|
113 |
|
114 lemma card_bit0: "CARD('a::finite bit0) = 2 * CARD('a)" |
|
115 unfolding type_definition.card [OF type_definition_bit0] |
|
116 by simp |
|
117 |
|
118 lemma card_bit1: "CARD('a::finite bit1) = Suc (2 * CARD('a))" |
|
119 unfolding type_definition.card [OF type_definition_bit1] |
|
120 by simp |
|
121 |
|
122 lemma card_num0: "CARD (num0) = 0" |
|
123 by (simp add: infinite_UNIV_nat card_eq_0_iff type_definition.card [OF type_definition_num0]) |
|
124 |
|
125 lemmas card_univ_simps [simp] = |
|
126 card_unit |
|
127 card_bool |
|
128 card_prod |
|
129 card_sum |
|
130 card_option |
|
131 card_set |
|
132 card_num1 |
|
133 card_bit0 |
|
134 card_bit1 |
|
135 card_num0 |
|
136 |
151 |
137 |
152 |
138 subsection {* Locale for modular arithmetic subtypes *} |
153 subsection {* Locale for modular arithmetic subtypes *} |
139 |
154 |
140 locale mod_type = |
155 locale mod_type = |
286 mod_type "int CARD('a::finite bit0)" |
301 mod_type "int CARD('a::finite bit0)" |
287 "Rep_bit0 :: 'a::finite bit0 \<Rightarrow> int" |
302 "Rep_bit0 :: 'a::finite bit0 \<Rightarrow> int" |
288 "Abs_bit0 :: int \<Rightarrow> 'a::finite bit0" |
303 "Abs_bit0 :: int \<Rightarrow> 'a::finite bit0" |
289 apply (rule mod_type.intro) |
304 apply (rule mod_type.intro) |
290 apply (simp add: int_mult type_definition_bit0) |
305 apply (simp add: int_mult type_definition_bit0) |
291 apply simp |
306 apply (rule one_less_int_card) |
292 using card_finite_pos [where ?'a='a] apply arith |
|
293 apply (rule zero_bit0_def) |
307 apply (rule zero_bit0_def) |
294 apply (rule one_bit0_def) |
308 apply (rule one_bit0_def) |
295 apply (rule plus_bit0_def [unfolded Abs_bit0'_def]) |
309 apply (rule plus_bit0_def [unfolded Abs_bit0'_def]) |
296 apply (rule times_bit0_def [unfolded Abs_bit0'_def]) |
310 apply (rule times_bit0_def [unfolded Abs_bit0'_def]) |
297 apply (rule minus_bit0_def [unfolded Abs_bit0'_def]) |
311 apply (rule minus_bit0_def [unfolded Abs_bit0'_def]) |
303 mod_type "int CARD('a::finite bit1)" |
317 mod_type "int CARD('a::finite bit1)" |
304 "Rep_bit1 :: 'a::finite bit1 \<Rightarrow> int" |
318 "Rep_bit1 :: 'a::finite bit1 \<Rightarrow> int" |
305 "Abs_bit1 :: int \<Rightarrow> 'a::finite bit1" |
319 "Abs_bit1 :: int \<Rightarrow> 'a::finite bit1" |
306 apply (rule mod_type.intro) |
320 apply (rule mod_type.intro) |
307 apply (simp add: int_mult type_definition_bit1) |
321 apply (simp add: int_mult type_definition_bit1) |
308 apply simp |
322 apply (rule one_less_int_card) |
309 apply (rule zero_bit1_def) |
323 apply (rule zero_bit1_def) |
310 apply (rule one_bit1_def) |
324 apply (rule one_bit1_def) |
311 apply (rule plus_bit1_def [unfolded Abs_bit1'_def]) |
325 apply (rule plus_bit1_def [unfolded Abs_bit1'_def]) |
312 apply (rule times_bit1_def [unfolded Abs_bit1'_def]) |
326 apply (rule times_bit1_def [unfolded Abs_bit1'_def]) |
313 apply (rule minus_bit1_def [unfolded Abs_bit1'_def]) |
327 apply (rule minus_bit1_def [unfolded Abs_bit1'_def]) |
420 | bit_tr' b _ = raise Match; |
434 | bit_tr' b _ = raise Match; |
421 |
435 |
422 in [("bit0", bit_tr' 0), ("bit1", bit_tr' 1)] end; |
436 in [("bit0", bit_tr' 0), ("bit1", bit_tr' 1)] end; |
423 *} |
437 *} |
424 |
438 |
425 |
|
426 subsection {* Classes with at least 1 and 2 *} |
|
427 |
|
428 text {* Class finite already captures "at least 1" *} |
|
429 |
|
430 lemma zero_less_card_finite [simp]: |
|
431 "0 < CARD('a::finite)" |
|
432 proof (cases "CARD('a::finite) = 0") |
|
433 case False thus ?thesis by (simp del: card_0_eq) |
|
434 next |
|
435 case True |
|
436 thus ?thesis by (simp add: finite) |
|
437 qed |
|
438 |
|
439 lemma one_le_card_finite [simp]: |
|
440 "Suc 0 <= CARD('a::finite)" |
|
441 by (simp add: less_Suc_eq_le [symmetric] zero_less_card_finite) |
|
442 |
|
443 |
|
444 text {* Class for cardinality "at least 2" *} |
|
445 |
|
446 class card2 = finite + |
|
447 assumes two_le_card: "2 <= CARD('a)" |
|
448 |
|
449 lemma one_less_card: "Suc 0 < CARD('a::card2)" |
|
450 using two_le_card [where 'a='a] by simp |
|
451 |
|
452 instance bit0 :: (finite) card2 |
|
453 by intro_classes (simp add: one_le_card_finite) |
|
454 |
|
455 instance bit1 :: (finite) card2 |
|
456 by intro_classes (simp add: one_le_card_finite) |
|
457 |
|
458 subsection {* Examples *} |
439 subsection {* Examples *} |
459 |
440 |
460 lemma "CARD(0) = 0" by simp |
441 lemma "CARD(0) = 0" by simp |
461 lemma "CARD(17) = 17" by simp |
442 lemma "CARD(17) = 17" by simp |
462 lemma "8 * 11 ^ 3 - 6 = (2::5)" by simp |
443 lemma "8 * 11 ^ 3 - 6 = (2::5)" by simp |