From 4db82b1afc142a6eadf089a86b52ef5d58e61684 Mon Sep 17 00:00:00 2001 From: Patrick Stevens Date: Fri, 8 Nov 2019 18:00:16 +0000 Subject: [PATCH] Tidy up groups more (#68) --- Everything/Safe.agda | 1 + Groups/Cyclic/Definition.agda | 39 ++++ Groups/Cyclic/Lemmas.agda | 50 +++++ Groups/CyclicGroups.agda | 66 +------ Groups/Examples/Examples.agda | 245 +++++++++++++----------- Groups/Groups2.agda | 122 +----------- Groups/Homomorphisms/Image.agda | 64 +++++++ Groups/Homomorphisms/Lemmas.agda | 4 + Groups/Subgroups/Normal/Definition.agda | 29 +++ Groups/Subgroups/Normal/Lemmas.agda | 82 ++++++++ 10 files changed, 418 insertions(+), 284 deletions(-) create mode 100644 Groups/Cyclic/Definition.agda create mode 100644 Groups/Cyclic/Lemmas.agda create mode 100644 Groups/Homomorphisms/Image.agda create mode 100644 Groups/Subgroups/Normal/Definition.agda create mode 100644 Groups/Subgroups/Normal/Lemmas.agda diff --git a/Everything/Safe.agda b/Everything/Safe.agda index 25dbc7d..bdd02a3 100644 --- a/Everything/Safe.agda +++ b/Everything/Safe.agda @@ -26,6 +26,7 @@ open import Groups.SymmetricGroups.Definition open import Groups.Actions.Stabiliser open import Groups.Actions.Orbit open import Groups.SymmetricGroups.Lemmas +open import Groups.Cyclic.Definition open import Fields.Fields open import Fields.Orders.Partial.Definition diff --git a/Groups/Cyclic/Definition.agda b/Groups/Cyclic/Definition.agda new file mode 100644 index 0000000..eb37bdc --- /dev/null +++ b/Groups/Cyclic/Definition.agda @@ -0,0 +1,39 @@ +{-# OPTIONS --safe --warning=error --without-K #-} + +open import LogicalFormulae +open import Setoids.Setoids +open import Sets.EquivalenceRelations +open import Functions +open import Agda.Primitive using (Level; lzero; lsuc; _⊔_) +open import Numbers.Naturals.Naturals +open import Numbers.Integers.Integers +open import Numbers.Integers.Addition +open import Sets.FinSet +open import Groups.Homomorphisms.Definition +open import Groups.Groups +open import Groups.Subgroups.Definition +open import Groups.Abelian.Definition +open import Groups.Definition + +module Groups.Cyclic.Definition {m n : _} {A : Set m} {S : Setoid {m} {n} A} {_·_ : A → A → A} (G : Group S _·_) where + +open Setoid S +open Group G +open Equivalence eq + +positiveEltPower : (x : A) (i : ℕ) → A +positiveEltPower x 0 = Group.0G G +positiveEltPower x (succ i) = x · (positiveEltPower x i) + +positiveEltPowerCollapse : (x : A) (i j : ℕ) → Setoid._∼_ S ((positiveEltPower x i) · (positiveEltPower x j)) (positiveEltPower x (i +N j)) +positiveEltPowerCollapse x zero j = Group.identLeft G +positiveEltPowerCollapse x (succ i) j = transitive (symmetric +Associative) (+WellDefined reflexive (positiveEltPowerCollapse x i j)) + +elementPower : (x : A) (i : ℤ) → A +elementPower x (nonneg i) = positiveEltPower x i +elementPower x (negSucc i) = Group.inverse G (positiveEltPower x (succ i)) + +record CyclicGroup : Set (m ⊔ n) where + field + generator : A + cyclic : {a : A} → (Sg ℤ (λ i → Setoid._∼_ S (elementPower generator i) a)) diff --git a/Groups/Cyclic/Lemmas.agda b/Groups/Cyclic/Lemmas.agda new file mode 100644 index 0000000..517731c --- /dev/null +++ b/Groups/Cyclic/Lemmas.agda @@ -0,0 +1,50 @@ +{-# OPTIONS --safe --warning=error --without-K #-} + +open import LogicalFormulae +open import Setoids.Setoids +open import Sets.EquivalenceRelations +open import Functions +open import Agda.Primitive using (Level; lzero; lsuc; _⊔_) +open import Numbers.Naturals.Naturals +open import Numbers.Integers.Integers +open import Numbers.Integers.Addition +open import Sets.FinSet +open import Groups.Homomorphisms.Definition +open import Groups.Groups +open import Groups.Subgroups.Definition +open import Groups.Abelian.Definition +open import Groups.Definition +open import Groups.Cyclic.Definition + +module Groups.Cyclic.Lemmas where + +elementPowerCollapse : {m n : _} {A : Set m} {S : Setoid {m} {n} A} {_·_ : A → A → A} (G : Group S _·_) (x : A) (i j : ℤ) → Setoid._∼_ S ((elementPower G x i) · (elementPower G x j)) (elementPower G x (i +Z j)) +elementPowerCollapse G x (nonneg a) (nonneg b) rewrite equalityCommutative (+Zinherits a b) = positiveEltPowerCollapse G x a b +elementPowerCollapse G x (nonneg a) (negSucc b) = {!!} +elementPowerCollapse G x (negSucc a) (nonneg b) = {!!} +elementPowerCollapse G x (negSucc a) (negSucc b) = {!!} + +elementPowerHom : {m n : _} {A : Set m} {S : Setoid {m} {n} A} {_·_ : A → A → A} (G : Group S _·_) (x : A) → GroupHom ℤGroup G (λ i → elementPower G x i) +GroupHom.groupHom (elementPowerHom {S = S} G x) {a} {b} = symmetric (elementPowerCollapse G x a b) + where + open Equivalence (Setoid.eq S) +GroupHom.wellDefined (elementPowerHom {S = S} G x) {.y} {y} refl = reflexive + where + open Equivalence (Setoid.eq S) + +subgroupOfCyclicIsCyclic : {a b c d : _} {A : Set a} {B : Set b} {S : Setoid {a} {c} A} {T : Setoid {b} {d} B} {_+A_ : A → A → A} {_+B_ : B → B → B} {G : Group S _+A_} {H : Group T _+B_} {f : B → A} {fHom : GroupHom H G f} → Subgroup G H fHom → CyclicGroup G → CyclicGroup H +CyclicGroup.generator (subgroupOfCyclicIsCyclic {f = f} subgrp record { generator = generator ; cyclic = cyclic }) = {!f generator!} +CyclicGroup.cyclic (subgroupOfCyclicIsCyclic subgrp gCyclic) = {!!} + +-- Prefer to prove that subgroup of cyclic is cyclic, then deduce this like with abelian groups +{- +cyclicIsGroupProperty : {m n o p : _} {A : Set m} {B : Set o} {S : Setoid {m} {n} A} {T : Setoid {o} {p} B} {_+_ : A → A → A} {_*_ : B → B → B} {G : Group S _+_} {H : Group T _*_} → GroupsIsomorphic G H → CyclicGroup G → CyclicGroup H +CyclicGroup.generator (cyclicIsGroupProperty {H = H} iso G) = GroupsIsomorphic.isomorphism iso (CyclicGroup.generator G) +CyclicGroup.cyclic (cyclicIsGroupProperty {H = H} iso G) {a} with GroupIso.surj (GroupsIsomorphic.proof iso) {a} +CyclicGroup.cyclic (cyclicIsGroupProperty {H = H} iso G) {a} | a' , b with CyclicGroup.cyclic G {a'} +... | pow , prPow = pow , {!!} +-} + +-- Proof of abelianness of cyclic groups: a cyclic group is the image of elementPowerHom into Z, so is isomorphic to a subgroup of Z. All subgroups of an abelian group are abelian. +cyclicGroupIsAbelian : {m n : _} {A : Set m} {S : Setoid {m} {n} A} {_+_ : A → A → A} {G : Group S _+_} (cyclic : CyclicGroup G) → AbelianGroup G +cyclicGroupIsAbelian cyclic = {!!} diff --git a/Groups/CyclicGroups.agda b/Groups/CyclicGroups.agda index b06fad1..7985065 100644 --- a/Groups/CyclicGroups.agda +++ b/Groups/CyclicGroups.agda @@ -1,67 +1,19 @@ -{-# OPTIONS --safe --warning=error #-} +{-# OPTIONS --safe --warning=error --without-K #-} open import LogicalFormulae open import Setoids.Setoids +open import Sets.EquivalenceRelations open import Functions open import Agda.Primitive using (Level; lzero; lsuc; _⊔_) -open import Numbers.Naturals -open import Numbers.Integers +open import Numbers.Naturals.Naturals +open import Numbers.Integers.Integers +open import Numbers.Integers.Addition open import Sets.FinSet +open import Groups.Homomorphisms.Definition open import Groups.Groups +open import Groups.Subgroups.Definition +open import Groups.Abelian.Definition open import Groups.Definition -module Groups.CyclicGroups where +module Groups.CyclicGroups {m n : _} {A : Set m} {S : Setoid {m} {n} A} {_·_ : A → A → A} (G : Group S _·_) where - positiveEltPower : {m n : _} {A : Set m} {S : Setoid {m} {n} A} {_·_ : A → A → A} (G : Group S _·_) (x : A) (i : ℕ) → A - positiveEltPower G x 0 = Group.identity G - positiveEltPower {_·_ = _·_} G x (succ i) = x · (positiveEltPower G x i) - - positiveEltPowerCollapse : {m n : _} {A : Set m} {S : Setoid {m} {n} A} {_+_ : A → A → A} (G : Group S _+_) (x : A) (i j : ℕ) → Setoid._∼_ S ((positiveEltPower G x i) + (positiveEltPower G x j)) (positiveEltPower G x (i +N j)) - positiveEltPowerCollapse G x zero j = Group.multIdentLeft G - positiveEltPowerCollapse {S = S} G x (succ i) j = transitive (symmetric multAssoc) (wellDefined reflexive (positiveEltPowerCollapse G x i j)) - where - open Setoid S - open Group G - open Transitive (Equivalence.transitiveEq eq) - open Symmetric (Equivalence.symmetricEq eq) - open Reflexive (Equivalence.reflexiveEq eq) - - elementPower : {m n : _} {A : Set m} {S : Setoid {m} {n} A} {_·_ : A → A → A} (G : Group S _·_) (x : A) (i : ℤ) → A - elementPower G x (nonneg i) = positiveEltPower G x i - elementPower {_·_ = _·_} G x (negSucc i) = Group.inverse G (positiveEltPower G x (succ i)) - - record CyclicGroup {m n : _} {A : Set m} {S : Setoid {m} {n} A} {_·_ : A → A → A} (G : Group S _·_) : Set (m ⊔ n) where - field - generator : A - cyclic : {a : A} → (Sg ℤ (λ i → Setoid._∼_ S (elementPower G generator i) a)) - - elementPowerCollapse : {m n : _} {A : Set m} {S : Setoid {m} {n} A} {_·_ : A → A → A} (G : Group S _·_) (x : A) (i j : ℤ) → Setoid._∼_ S ((elementPower G x i) · (elementPower G x j)) (elementPower G x (i +Z j)) - elementPowerCollapse {S = S} {_+_} G x (nonneg a) (nonneg b) rewrite addingNonnegIsHom a b = positiveEltPowerCollapse G x a b - elementPowerCollapse G x (nonneg a) (negSucc b) = {!!} - elementPowerCollapse G x (negSucc a) (nonneg b) = {!!} - elementPowerCollapse G x (negSucc a) (negSucc b) = {!!} - - elementPowerHom : {m n : _} {A : Set m} {S : Setoid {m} {n} A} {_·_ : A → A → A} (G : Group S _·_) (x : A) → GroupHom ℤGroup G (λ i → elementPower G x i) - GroupHom.groupHom (elementPowerHom {S = S} G x) {a} {b} = symmetric (elementPowerCollapse G x a b) - where - open Setoid S - open Group G - open Symmetric (Equivalence.symmetricEq eq) - GroupHom.wellDefined (elementPowerHom {S = S} G x) {.y} {y} refl = Reflexive.reflexive (Equivalence.reflexiveEq (Setoid.eq S)) - - subgroupOfCyclicIsCyclic : {a b c d : _} {A : Set a} {B : Set b} {S : Setoid {a} {c} A} {T : Setoid {b} {d} B} {_+A_ : A → A → A} {_+B_ : B → B → B} {G : Group S _+A_} {H : Group T _+B_} {f : B → A} {fHom : GroupHom H G f} → Subgroup G H fHom → CyclicGroup G → CyclicGroup H - CyclicGroup.generator (subgroupOfCyclicIsCyclic {f = f} subgrp record { generator = generator ; cyclic = cyclic }) = {!f generator!} - CyclicGroup.cyclic (subgroupOfCyclicIsCyclic subgrp gCyclic) = {!!} - --- Prefer to prove that subgroup of cyclic is cyclic, then deduce this like with abelian groups -{- - cyclicIsGroupProperty : {m n o p : _} {A : Set m} {B : Set o} {S : Setoid {m} {n} A} {T : Setoid {o} {p} B} {_+_ : A → A → A} {_*_ : B → B → B} {G : Group S _+_} {H : Group T _*_} → GroupsIsomorphic G H → CyclicGroup G → CyclicGroup H - CyclicGroup.generator (cyclicIsGroupProperty {H = H} iso G) = GroupsIsomorphic.isomorphism iso (CyclicGroup.generator G) - CyclicGroup.cyclic (cyclicIsGroupProperty {H = H} iso G) {a} with GroupIso.surj (GroupsIsomorphic.proof iso) {a} - CyclicGroup.cyclic (cyclicIsGroupProperty {H = H} iso G) {a} | a' , b with CyclicGroup.cyclic G {a'} - ... | pow , prPow = pow , {!!} - -} - --- Proof of abelianness of cyclic groups: a cyclic group is the image of elementPowerHom into Z, so is isomorphic to a subgroup of Z. All subgroups of an abelian group are abelian. - cyclicGroupIsAbelian : {m n : _} {A : Set m} {S : Setoid {m} {n} A} {_+_ : A → A → A} {G : Group S _+_} (cyclic : CyclicGroup G) → AbelianGroup G - cyclicGroupIsAbelian cyclic = {!!} diff --git a/Groups/Examples/Examples.agda b/Groups/Examples/Examples.agda index 8c9634a..4e2b32d 100644 --- a/Groups/Examples/Examples.agda +++ b/Groups/Examples/Examples.agda @@ -1,128 +1,157 @@ -{-# OPTIONS --safe --warning=error #-} +{-# OPTIONS --safe --warning=error --with-K #-} +open import Sets.EquivalenceRelations open import Groups.Definition open import Orders -open import Numbers.Integers +open import Rings.Definition +open import Numbers.Integers.Integers +open import Numbers.Integers.Multiplication open import Setoids.Setoids open import LogicalFormulae open import Sets.FinSet open import Functions -open import Numbers.Naturals -open import IntegersModN +open import Numbers.Naturals.Naturals +open import Numbers.Naturals.WithK +open import Numbers.Modulo.Definition +open import Numbers.Modulo.Addition +open import Numbers.Modulo.Group open import Rings.Examples.Examples -open import PrimeNumbers -open import Groups.Groups2 -open import Groups.CyclicGroups +open import Numbers.Primes.PrimeNumbers +open import Groups.Lemmas +open import Groups.Homomorphisms.Definition +open import Groups.Homomorphisms.Lemmas +open import Groups.Isomorphisms.Definition +open import Groups.Cyclic.Definition +open import Groups.QuotientGroup.Definition +open import Groups.Subgroups.Definition +open import Groups.Subgroups.Normal.Definition module Groups.Examples.Examples where - elementPowZ : (n : ℕ) → (elementPower ℤGroup (nonneg 1) n) ≡ nonneg n - elementPowZ zero = refl - elementPowZ (succ n) rewrite elementPowZ n = refl - ℤCyclic : CyclicGroup ℤGroup - CyclicGroup.generator ℤCyclic = nonneg 1 - CyclicGroup.cyclic ℤCyclic {nonneg x} = inl (x , elementPowZ x) - CyclicGroup.cyclic ℤCyclic {negSucc x} = inr (succ x , ans) - where - ans : additiveInverseZ (nonneg 1 +Z elementPower ℤGroup (nonneg 1) x) ≡ negSucc x - ans rewrite elementPowZ x = refl +trivialGroup : Group (reflSetoid (FinSet 1)) λ _ _ → fzero +Group.+WellDefined trivialGroup _ _ = refl +Group.0G trivialGroup = fzero +Group.inverse trivialGroup _ = fzero +Group.+Associative trivialGroup = refl +Group.identRight trivialGroup {fzero} = refl +Group.identRight trivialGroup {fsucc ()} +Group.identLeft trivialGroup {fzero} = refl +Group.identLeft trivialGroup {fsucc ()} +Group.invLeft trivialGroup = refl +Group.invRight trivialGroup = refl - elementPowZn : (n : ℕ) → {pr : 0