equal
deleted
inserted
replaced
5 *) |
5 *) |
6 |
6 |
7 header {* Finite sets *} |
7 header {* Finite sets *} |
8 |
8 |
9 theory Finite_Set |
9 theory Finite_Set |
10 imports Power Divides Inductive Lattices |
10 imports Divides |
11 begin |
11 begin |
12 |
12 |
13 subsection {* Definition and basic properties *} |
13 subsection {* Definition and basic properties *} |
14 |
14 |
15 inductive2 finite :: "'a set => bool" |
15 inductive2 finite :: "'a set => bool" |
1637 apply (cases "finite A") |
1637 apply (cases "finite A") |
1638 apply (erule finite_induct) |
1638 apply (erule finite_induct) |
1639 apply (auto simp add: ring_distrib add_ac) |
1639 apply (auto simp add: ring_distrib add_ac) |
1640 done |
1640 done |
1641 |
1641 |
1642 |
|
1643 lemma setprod_constant: "finite A ==> (\<Prod>x\<in> A. (y::'a::{recpower, comm_monoid_mult})) = y^(card A)" |
1642 lemma setprod_constant: "finite A ==> (\<Prod>x\<in> A. (y::'a::{recpower, comm_monoid_mult})) = y^(card A)" |
1644 apply (erule finite_induct) |
1643 apply (erule finite_induct) |
1645 apply (auto simp add: power_Suc) |
1644 apply (auto simp add: power_Suc) |
1646 done |
1645 done |
1647 |
1646 |
2586 |
2585 |
2587 lemma univ_sum [code func]: |
2586 lemma univ_sum [code func]: |
2588 "UNIV = (UNIV \<Colon> 'a\<Colon>finite set) <+> (UNIV \<Colon> 'b\<Colon>finite set)" |
2587 "UNIV = (UNIV \<Colon> 'a\<Colon>finite set) <+> (UNIV \<Colon> 'b\<Colon>finite set)" |
2589 unfolding UNIV_Plus_UNIV .. |
2588 unfolding UNIV_Plus_UNIV .. |
2590 |
2589 |
|
2590 lemma insert_None_conv_UNIV: "insert None (range Some) = UNIV" |
|
2591 by (rule set_ext, case_tac x, auto) |
|
2592 |
|
2593 instance option :: (finite) finite |
|
2594 proof |
|
2595 have "finite (UNIV :: 'a set)" by (rule finite) |
|
2596 hence "finite (insert None (Some ` (UNIV :: 'a set)))" by simp |
|
2597 also have "insert None (Some ` (UNIV :: 'a set)) = UNIV" |
|
2598 by (rule insert_None_conv_UNIV) |
|
2599 finally show "finite (UNIV :: 'a option set)" . |
|
2600 qed |
|
2601 |
|
2602 lemma univ_option [code func]: |
|
2603 "UNIV = insert (None \<Colon> 'a\<Colon>finite option) (image Some UNIV)" |
|
2604 unfolding insert_None_conv_UNIV .. |
|
2605 |
2591 instance set :: (finite) finite |
2606 instance set :: (finite) finite |
2592 proof |
2607 proof |
2593 have "finite (UNIV :: 'a set)" by (rule finite) |
2608 have "finite (UNIV :: 'a set)" by (rule finite) |
2594 hence "finite (Pow (UNIV :: 'a set))" |
2609 hence "finite (Pow (UNIV :: 'a set))" |
2595 by (rule finite_Pow_iff [THEN iffD2]) |
2610 by (rule finite_Pow_iff [THEN iffD2]) |