X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fmatita%2Flibrary%2Falgebra%2Fgroups.ma;h=5cefa0db156a209cc9af9f26f05cf77857b87041;hb=a7063fc0997a9d9eae6c329443e67ab92c4b6a0f;hp=0f759434f85fd07b48935e418cd99a35664878e7;hpb=b5619c04607ec92594e7645847409c351129709b;p=helm.git diff --git a/helm/matita/library/algebra/groups.ma b/helm/matita/library/algebra/groups.ma index 0f759434f..5cefa0db1 100644 --- a/helm/matita/library/algebra/groups.ma +++ b/helm/matita/library/algebra/groups.ma @@ -16,19 +16,42 @@ set "baseuri" "cic:/matita/algebra/groups/". include "algebra/monoids.ma". include "nat/le_arith.ma". +include "datatypes/bool.ma". +include "nat/compare.ma". -record isGroup (M:Monoid) (opp: M -> M) : Prop ≝ - { opp_is_left_inverse: is_left_inverse M opp; - opp_is_right_inverse: is_right_inverse M opp +record PreGroup : Type ≝ + { premonoid:> PreMonoid; + opp: premonoid -> premonoid + }. + +record isGroup (G:PreGroup) : Prop ≝ + { is_monoid: isMonoid G; + opp_is_left_inverse: is_left_inverse (mk_Monoid ? is_monoid) (opp G); + opp_is_right_inverse: is_right_inverse (mk_Monoid ? is_monoid) (opp G) }. record Group : Type ≝ - { monoid: Monoid; - opp: monoid -> monoid; - group_properties: isGroup ? opp + { pregroup:> PreGroup; + group_properties:> isGroup pregroup }. - -coercion cic:/matita/algebra/groups/monoid.con. + +(*notation < "G" +for @{ 'monoid $G }. + +interpretation "Monoid coercion" 'monoid G = + (cic:/matita/algebra/groups/monoid.con G).*) + +notation < "G" +for @{ 'type_of_group $G }. + +interpretation "Type_of_group coercion" 'type_of_group G = + (cic:/matita/algebra/groups/Type_of_Group.con G). + +notation < "G" +for @{ 'magma_of_group $G }. + +interpretation "magma_of_group coercion" 'magma_of_group G = + (cic:/matita/algebra/groups/Magma_of_Group.con G). notation "hvbox(x \sup (-1))" with precedence 89 for @{ 'gopp $x }. @@ -50,11 +73,11 @@ intros; unfold left_cancellable; unfold injective; intros (x y z); -rewrite < (e_is_left_unit ? ? (monoid_properties G)); -rewrite < (e_is_left_unit ? ? (monoid_properties G) z); -rewrite < (opp_is_left_inverse ? ? (group_properties G) x); -rewrite > (semigroup_properties G); -rewrite > (semigroup_properties G); +rewrite < (e_is_left_unit ? (is_monoid ? (group_properties G))); +rewrite < (e_is_left_unit ? (is_monoid ? (group_properties G)) z); +rewrite < (opp_is_left_inverse ? (group_properties G) x); +rewrite > (associative ? (is_semi_group ? (is_monoid ? (group_properties G)))); +rewrite > (associative ? (is_semi_group ? (is_monoid ? (group_properties G)))); apply eq_f; assumption. qed. @@ -67,34 +90,440 @@ unfold right_cancellable; unfold injective; simplify;fold simplify (op G); intros (x y z); -rewrite < (e_is_right_unit ? ? (monoid_properties G)); -rewrite < (e_is_right_unit ? ? (monoid_properties G) z); -rewrite < (opp_is_right_inverse ? ? (group_properties G) x); -rewrite < (semigroup_properties G); -rewrite < (semigroup_properties G); +rewrite < (e_is_right_unit ? (is_monoid ? (group_properties G))); +rewrite < (e_is_right_unit ? (is_monoid ? (group_properties G)) z); +rewrite < (opp_is_right_inverse ? (group_properties G) x); +rewrite < (associative ? (is_semi_group ? (is_monoid ? (group_properties G)))); +rewrite < (associative ? (is_semi_group ? (is_monoid ? (group_properties G)))); rewrite > H; reflexivity. qed. -(* -record enumerable (T:Type) : Type ≝ + +record finite_enumerable (T:Type) : Type ≝ { order: nat; repr: nat → T; - repr_inj: ∀n,n'. n≤order → n'≤order → repr n ≠ repr n'; - repr_sur: ∀x.∃n.n≤order ∧ repr n = x + index_of: T → nat; + index_of_sur: ∀x.index_of x ≤ order; + index_of_repr: ∀n. n≤order → index_of (repr n) = n; + repr_index_of: ∀x. repr (index_of x) = x }. +notation "hvbox(C \sub i)" with precedence 89 +for @{ 'repr $C $i }. -theorem foo: - ∀G:SemiGroup. - enumerable (carrier G) → - left_cancellable (carrier G) (op G) → - right_cancellable (carrier G) (op G) → - ∃e:G. is_left_unit ? e. -intros (G H); -unfold left_cancellable in H1; -letin x ≝ (repr ? H O); -letin f ≝ (λy.x·(repr ? H y)); -generalize in match (H1 x); +(* CSC: multiple interpretations in the same file are not considered in the + right order +interpretation "Finite_enumerable representation" 'repr C i = + (cic:/matita/algebra/groups/repr.con C _ i).*) + +notation < "hvbox(|C|)" with precedence 89 +for @{ 'card $C }. + +interpretation "Finite_enumerable order" 'card C = + (cic:/matita/algebra/groups/order.con C _). + +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/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/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/groups/Type_of_finite_enumerable_SemiGroup.con S). + +interpretation "Finite_enumerable representation" 'repr S i = + (cic:/matita/algebra/groups/repr.con S + (cic:/matita/algebra/groups/is_finite_enumerable.con S) i). + +notation "hvbox(ι 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/groups/index_of.con _ + (cic:/matita/algebra/groups/is_finite_enumerable.con _) 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 pigeonhole: + ∀n:nat.∀f:nat→nat. + (∀x,y.x≤n → y≤n → f x = f y → x=y) → + (∀m. m ≤ n → f m ≤ n) → + ∀x. x≤n \to ∃y.f y = x ∧ y ≤ n. intro; -*) \ No newline at end of file +elim n; +[ apply (ex_intro ? ? O); + split; + [ rewrite < (le_n_O_to_eq ? H2); + rewrite < (le_n_O_to_eq ? (H1 O ?)); + [ reflexivity + | apply le_n + ] + | apply le_n + ] +| clear n; + apply (nat_compare_elim (f (S n1)) x); + [ (* TODO: caso complicato, ma simile al terzo *) + | intros; + apply (ex_intro ? ? (S n1)); + split; + [ assumption + | constructor 1 + ] + | intro; + letin f' ≝ + (λx. + let fSn1 ≝ f (S n1) in + let fx ≝ f x in + match ltb fSn1 fx with + [ true ⇒ pred fx + | false ⇒ fx + ]); + cut (∀x,y. x ≤ n1 → y ≤ n1 → f' x = f' y → x=y); + [ cut (∀x. x ≤ n1 → f' x ≤ n1); + [ elim (H f' ? ? x); + [ simplify in H5; + clear Hcut; + clear Hcut1; + clear f'; + elim H5; + clear H5; + apply (ex_intro ? ? a); + split; + [ generalize in match H4; + clear H4; + rewrite < H6; + clear H6; + apply (ltb_elim (f (S n1)) (f a)); + [ (* TODO: caso impossibile (uso l'iniettivita') *) + simplify; + | simplify; + intros; + reflexivity + ] + | apply le_S; + assumption + ] + | apply Hcut + | apply Hcut1 + | rewrite > (pred_Sn n1); + simplify; + generalize in match (H2 (S n1)); + intro; + generalize in match (lt_to_le_to_lt ? ? ? H4 (H5 (le_n ?))); + intro; + unfold lt in H6; + apply le_S_S_to_le; + assumption + ] + | unfold f'; + simplify; + intro; + apply (ltb_elim (f (S n1)) (f x1)); + simplify; + intros; + [ generalize in match (H2 x1); + intro; + change in match n1 with (pred (S n1)); + apply le_to_le_pred; + apply H7; + apply le_S; + assumption + | generalize in match (H2 (S n1) (le_n ?)); + intro; + generalize in match (not_lt_to_le ? ? H5); + intro; + generalize in match (transitive_le ? ? ? H8 H7); + intro; + cut (f x1 ≠ f (S n1)); + [ generalize in match (not_eq_to_le_to_lt ? ? Hcut1 H8); + intro; + unfold lt in H10; + generalize in match (transitive_le ? ? ? H10 H7); + intro; + apply le_S_S_to_le; + assumption + | unfold Not; + intro; + generalize in match (H1 ? ? ? ? H10); + [ intro; + rewrite > H11 in H6; + apply (not_le_Sn_n ? H6) + | apply le_S; + assumption + | apply le_n + ] + ] + ] + ] + | intros 4; + unfold f'; + simplify; + apply (ltb_elim (f (S n1)) (f x1)); + simplify; + apply (ltb_elim (f (S n1)) (f y)); + simplify; + intros; + [ cut (f x1 = f y); + [ apply (H1 ? ? ? ? Hcut); + apply le_S; + assumption + | apply eq_pred_to_eq; + [ apply (ltn_to_ltO ? ? H8) + | apply (ltn_to_ltO ? ? H7) + | assumption + ] + ] + | (* pred (f x1) = f y absurd since y ≠ S n1 and thus f y ≠ f (S n1) + so that f y < f (S n1) < f x1; hence pred (f x1) = f y is absurd *) + cut (y < S n1); + [ generalize in match (lt_to_not_eq ? ? Hcut); + intro; + cut (f y ≠ f (S n1)); + [ cut (f y < f (S n1)); + [ rewrite < H9 in Hcut2; + unfold lt in Hcut2; + unfold lt in H8; + generalize in match (le_S_S ? ? Hcut2); + intro; + generalize in match (transitive_le ? ? ? H11 H8); + intros; + rewrite < (S_pred (f x1)) in H12; + [ elim (not_le_Sn_n ? H12) + | fold simplify ((f (S n1)) < (f x1)) in H8; + apply (ltn_to_ltO ? ? H8) + ] + | apply not_eq_to_le_to_lt; + [ assumption + | apply not_lt_to_le; + assumption + ] + ] + | unfold Not; + intro; + apply H10; + apply (H1 ? ? ? ? H11); + [ apply lt_to_le; + assumption + | constructor 1 + ] + ] + | unfold lt; + apply le_S_S; + assumption + ] + | (* f x1 = pred (f y) absurd since it implies S (f x1) = f y and + f x1 ≤ f (S n1) < f y = S (f x1) so that f x1 = f (S n1); by + injectivity x1 = S n1 that is absurd since x1 ≤ n1 *) + generalize in match (eq_f ? ? S ? ? H9); + intro; + rewrite < S_pred in H10; + [ rewrite < H10 in H7; + generalize in match (not_lt_to_le ? ? H8); + intro; + unfold lt in H7; + generalize in match (le_S_S ? ? H11); + intro; + generalize in match (antisym_le ? ? H12 H7); + intro; + generalize in match (inj_S ? ? H13); + intro; + generalize in match (H1 ? ? ? ? H14); + [ intro; + rewrite > H15 in H5; + elim (not_le_Sn_n ? H5) + | apply le_S; + assumption + | apply le_n + ] + | apply (ltn_to_ltO ?? H7) + ] + | apply (H1 ? ? ? ? H9); + apply le_S; + assumption + ] + ] + ] +]. +qed. + +theorem foo: + ∀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)); +cut (∀n.n ≤ order ? (is_finite_enumerable G) → ∃m.f m = n); +[ 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); + 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)); + clearbody GOGO; + rewrite < HH in GOGO; + rewrite < HH in GOGO:(? ? % ?); + rewrite > (associative ? G) in 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; + rewrite < GaGa in GaxGax:(? ? % ?); + rewrite > (associative ? (semigroup_properties G)) in GaxGax; + apply (H ? ? ? GaxGax) + | unfold is_right_unit; intro; + letin GaxGax ≝ (refl_eq ? (x·G \sub a)); + clearbody GaxGax; + rewrite < GaGa in GaxGax:(? ? % ?); + rewrite < (associative ? (semigroup_properties G)) in GaxGax; + apply (H1 ? ? ? GaxGax) + ] + ] +| apply pigeonhole +].