X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fmatita%2Flibrary%2Falgebra%2Ffinite_groups.ma;h=36573a8a7d0598217d5cae8cb8c00c9d01ffc8b4;hb=4dc47c9675ffd5fa50296ffaa9b5997501518c98;hp=2b731d3026a7edb544b084d39c5329554373560e;hpb=35337934554027181913e87de11ff77745a77ebe;p=helm.git diff --git a/helm/software/matita/library/algebra/finite_groups.ma b/helm/software/matita/library/algebra/finite_groups.ma index 2b731d302..36573a8a7 100644 --- a/helm/software/matita/library/algebra/finite_groups.ma +++ b/helm/software/matita/library/algebra/finite_groups.ma @@ -12,11 +12,10 @@ (* *) (**************************************************************************) -set "baseuri" "cic:/matita/algebra/finite_groups/". - include "algebra/groups.ma". +include "nat/relevant_equations.ma". -record finite_enumerable (T:Type) : Type ≝ +record finite_enumerable (T:Type) : Type≝ { order: nat; repr: nat → T; index_of: T → nat; @@ -30,197 +29,29 @@ for @{ 'repr $C $i }. (* CSC: multiple interpretations in the same file are not considered in the right order -interpretation "Finite_enumerable representation" 'repr C i = - (cic:/matita/algebra/finite_groups/repr.con C _ i).*) +interpretation "Finite_enumerable representation" 'repr C i = (repr C _ i).*) -notation < "hvbox(|C|)" with precedence 89 -for @{ 'card $C }. - -interpretation "Finite_enumerable order" 'card C = - (cic:/matita/algebra/finite_groups/order.con C _). +interpretation "Finite_enumerable order" 'card C = (order C _). -record finite_enumerable_SemiGroup : Type ≝ +record finite_enumerable_SemiGroup : Type≝ { semigroup:> SemiGroup; is_finite_enumerable:> finite_enumerable semigroup }. -notation < "S" -for @{ 'semigroup_of_finite_enumerable_semigroup $S }. - -interpretation "Semigroup_of_finite_enumerable_semigroup" - 'semigroup_of_finite_enumerable_semigroup S -= - (cic:/matita/algebra/finite_groups/semigroup.con S). - -notation < "S" -for @{ 'magma_of_finite_enumerable_semigroup $S }. - -interpretation "Magma_of_finite_enumerable_semigroup" - 'magma_of_finite_enumerable_semigroup S -= - (cic:/matita/algebra/finite_groups/Magma_of_finite_enumerable_SemiGroup.con S). - -notation < "S" -for @{ 'type_of_finite_enumerable_semigroup $S }. - -interpretation "Type_of_finite_enumerable_semigroup" - 'type_of_finite_enumerable_semigroup S -= - (cic:/matita/algebra/finite_groups/Type_of_finite_enumerable_SemiGroup.con S). - interpretation "Finite_enumerable representation" 'repr S i = - (cic:/matita/algebra/finite_groups/repr.con S - (cic:/matita/algebra/finite_groups/is_finite_enumerable.con S) i). + (repr S (is_finite_enumerable S) i). -notation "hvbox(ι e)" with precedence 60 +notation "hvbox(\iota e)" with precedence 60 for @{ 'index_of_finite_enumerable_semigroup $e }. interpretation "Index_of_finite_enumerable representation" 'index_of_finite_enumerable_semigroup e = - (cic:/matita/algebra/finite_groups/index_of.con _ - (cic:/matita/algebra/finite_groups/is_finite_enumerable.con _) e). + (index_of _ (is_finite_enumerable _) e). (* several definitions/theorems to be moved somewhere else *) -definition ltb ≝ λn,m. leb n m ∧ notb (eqb n m). - -theorem not_eq_to_le_to_lt: ∀n,m. n≠m → n≤m → n (S_pred m); - [ apply le_S_S; - assumption - | assumption - ] -]. -qed. - -theorem le_to_le_pred: - ∀n,m. n ≤ m → pred n ≤ pred m. -intros 2; -elim n; -[ simplify; - apply le_O_n -| simplify; - generalize in match H1; - clear H1; - elim m; - [ elim (not_le_Sn_O ? H1) - | simplify; - apply le_S_S_to_le; - assumption - ] -]. -qed. - -theorem lt_n_m_to_not_lt_m_Sn: ∀n,m. n < m → m ≮ S n. -intros; -unfold Not; -intro; -unfold lt in H; -unfold lt in H1; -generalize in match (le_S_S ? ? H); -intro; -generalize in match (transitive_le ? ? ? H2 H1); -intro; -apply (not_le_Sn_n ? H3). -qed. - -theorem lt_S_S: ∀n,m. n < m → S n < S m. -intros; -unfold lt in H; -apply (le_S_S ? ? H). -qed. - -theorem lt_O_S: ∀n. O < S n. -intro; -unfold lt; -apply le_S_S; -apply le_O_n. -qed. - -theorem le_n_m_to_lt_m_Sn_to_eq_n_m: ∀n,m. n ≤ m → m < S n → n=m. -intros; -unfold lt in H1; -generalize in match (le_S_S_to_le ? ? H1); -intro; -apply cic:/matita/nat/orders/antisym_le.con; -assumption. -qed. - theorem pigeonhole: ∀n:nat.∀f:nat→nat. (∀x,y.x≤n → y≤n → f x = f y → x=y) → @@ -240,8 +71,8 @@ elim n; | clear n; letin f' ≝ (λx. - let fSn1 ≝ f (S n1) in - let fx ≝ f x in + let fSn1 ≝f (S n1) in + let fx ≝f x in match ltb fSn1 fx with [ true ⇒ pred fx | false ⇒ fx @@ -254,6 +85,7 @@ elim n; [ simplify in H5; clear Hcut; clear Hcut1; + unfold f' in H5; clear f'; elim H5; clear H5; @@ -322,6 +154,7 @@ elim n; [ simplify in H5; clear Hcut; clear Hcut1; + unfold f' in H5; clear f'; elim H5; clear H5; @@ -334,7 +167,7 @@ elim n; apply (ltb_elim (f (S n1)) (f a)); [ simplify; intros; - generalize in match (lt_S_S ? ? H5); + generalize in match (lt_to_lt_S_S ? ? H5); intro; rewrite < S_pred in H6; [ elim (lt_n_m_to_not_lt_m_Sn ? ? H4 H6) @@ -489,45 +322,45 @@ elim n; ] ]. qed. - +(* demo *) theorem finite_enumerable_SemiGroup_to_left_cancellable_to_right_cancellable_to_isMonoid: ∀G:finite_enumerable_SemiGroup. left_cancellable ? (op G) → right_cancellable ? (op G) → ∃e:G. isMonoid (mk_PreMonoid G e). intros; -letin f ≝ (λn.ι(G \sub O · G \sub n)); +letin f ≝(λn.ι(G \sub O · G \sub n)); cut (∀n.n ≤ order ? (is_finite_enumerable G) → ∃m.f m = n); -[ letin EX ≝ (Hcut O ?); +[ letin EX ≝(Hcut O ?); [ apply le_O_n | clearbody EX; clear Hcut; unfold f in EX; elim EX; clear EX; - letin HH ≝ (eq_f ? ? (repr ? (is_finite_enumerable G)) ? ? H2); + letin HH ≝(eq_f ? ? (repr ? (is_finite_enumerable G)) ? ? H2); clearbody HH; rewrite > (repr_index_of ? (is_finite_enumerable G)) in HH; apply (ex_intro ? ? (G \sub a)); - letin GOGO ≝ (refl_eq ? (repr ? (is_finite_enumerable G) O)); + letin GOGO ≝(refl_eq ? (repr ? (is_finite_enumerable G) O)); clearbody GOGO; rewrite < HH in GOGO; rewrite < HH in GOGO:(? ? % ?); rewrite > (op_associative ? G) in GOGO; - letin GaGa ≝ (H ? ? ? GOGO); + letin GaGa ≝(H ? ? ? GOGO); clearbody GaGa; clear GOGO; constructor 1; [ simplify; apply (semigroup_properties G) | unfold is_left_unit; intro; - letin GaxGax ≝ (refl_eq ? (G \sub a ·x)); - clearbody GaxGax; + letin GaxGax ≝(refl_eq ? (G \sub a ·x)); + clearbody GaxGax; (* demo *) rewrite < GaGa in GaxGax:(? ? % ?); rewrite > (op_associative ? (semigroup_properties G)) in GaxGax; apply (H ? ? ? GaxGax) | unfold is_right_unit; intro; - letin GaxGax ≝ (refl_eq ? (x·G \sub a)); + letin GaxGax ≝(refl_eq ? (x·G \sub a)); clearbody GaxGax; rewrite < GaGa in GaxGax:(? ? % ?); rewrite < (op_associative ? (semigroup_properties G)) in GaxGax; @@ -540,7 +373,7 @@ cut (∀n.n ≤ order ? (is_finite_enumerable G) → ∃m.f m = n); elim H3; assumption | intros; - change in H5 with (ι(G \sub O · G \sub x) = ι(G \sub O · G \sub y)); + simplify in H5; cut (G \sub (ι(G \sub O · G \sub x)) = G \sub (ι(G \sub O · G \sub y))); [ rewrite > (repr_index_of ? ? (G \sub O · G \sub x)) in Hcut; rewrite > (repr_index_of ? ? (G \sub O · G \sub y)) in Hcut; @@ -555,6 +388,7 @@ cut (∀n.n ≤ order ? (is_finite_enumerable G) → ∃m.f m = n); assumption ] | intros; + unfold f; apply index_of_sur ] ].