# Open subgroups of a topological groups #

This files builds the lattice OpenSubgroup G of open subgroups in a topological group G, and its additive version OpenAddSubgroup. This lattice has a top element, the subgroup of all elements, but no bottom element in general. The trivial subgroup which is the natural candidate bottom has no reason to be open (this happens only in discrete groups).

Note that this notion is especially relevant in a non-archimedean context, for instance for p-adic groups.

## Main declarations #

• OpenSubgroup.isClosed: An open subgroup is automatically closed.
• Subgroup.isOpen_mono: A subgroup containing an open subgroup is open. There are also versions for additive groups, submodules and ideals.
• OpenSubgroup.comap: Open subgroups can be pulled back by a continuous group morphism.

## TODO #

• Prove that the identity component of a locally path connected group is an open subgroup. Up to now this file is really geared towards non-archimedean algebra, not Lie groups.
structure OpenAddSubgroup (G : Type u_1) [] [] extends :
Type u_1

The type of open subgroups of a topological additive group.

• carrier : Set G
• add_mem' : ∀ {a b : G}, a (self).carrierb (self).carriera + b (self).carrier
• zero_mem' : 0 (self).carrier
• neg_mem' : ∀ {x : G}, x (self).carrier-x (self).carrier
• isOpen' : IsOpen (self).carrier
Instances For
theorem OpenAddSubgroup.isOpen' {G : Type u_1} [] [] (self : ) :
IsOpen (self).carrier
structure OpenSubgroup (G : Type u_1) [] [] extends :
Type u_1

The type of open subgroups of a topological group.

• carrier : Set G
• mul_mem' : ∀ {a b : G}, a (self).carrierb (self).carriera * b (self).carrier
• one_mem' : 1 (self).carrier
• inv_mem' : ∀ {x : G}, x (self).carrierx⁻¹ (self).carrier
• isOpen' : IsOpen (self).carrier
Instances For
theorem OpenSubgroup.isOpen' {G : Type u_1} [] [] (self : ) :
IsOpen (self).carrier
CoeTC () ()
Equations
instance OpenSubgroup.hasCoeSubgroup {G : Type u_1} [] [] :
CoeTC () ()
Equations
• OpenSubgroup.hasCoeSubgroup = { coe := OpenSubgroup.toSubgroup }
abbrev OpenAddSubgroup.toAddSubgroup_injective.match_1 {G : Type u_1} [] [] (motive : (x x_1 : ) → x = x_1Prop) :
∀ (x x_1 : ) (x_2 : x = x_1), (∀ (toSubgroup : ) (isOpen' isOpen'_1 : IsOpen toSubgroup.carrier), motive { toAddSubgroup := toSubgroup, isOpen' := isOpen' } { toAddSubgroup := toSubgroup, isOpen' := isOpen'_1 } )motive x x_1 x_2
Equations
• =
Instances For
theorem OpenSubgroup.toSubgroup_injective {G : Type u_1} [] [] :
Function.Injective OpenSubgroup.toSubgroup
theorem OpenAddSubgroup.instSetLike.proof_1 {G : Type u_1} [] [] :
∀ (x x_1 : ), (fun (U : ) => U) x = (fun (U : ) => U) x_1x = x_1
instance OpenAddSubgroup.instSetLike {G : Type u_1} [] [] :
Equations
• OpenAddSubgroup.instSetLike = { coe := fun (U : ) => U, coe_injective' := }
instance OpenSubgroup.instSetLike {G : Type u_1} [] [] :
SetLike () G
Equations
• OpenSubgroup.instSetLike = { coe := fun (U : ) => U, coe_injective' := }
Equations
• =
instance OpenSubgroup.instSubgroupClass {G : Type u_1} [] [] :
Equations
• =
def OpenAddSubgroup.toOpens {G : Type u_1} [] [] (U : ) :

Coercion from OpenAddSubgroup G to Opens G.

Equations
• U = { carrier := U, is_open' := }
Instances For
def OpenSubgroup.toOpens {G : Type u_1} [] [] (U : ) :

Coercion from OpenSubgroup G to Opens G.

Equations
• U = { carrier := U, is_open' := }
Instances For
instance OpenAddSubgroup.hasCoeOpens {G : Type u_1} [] [] :
Equations
instance OpenSubgroup.hasCoeOpens {G : Type u_1} [] [] :
Equations
• OpenSubgroup.hasCoeOpens = { coe := OpenSubgroup.toOpens }
@[simp]
theorem OpenAddSubgroup.coe_toOpens {G : Type u_1} [] [] {U : } :
U = U
@[simp]
theorem OpenSubgroup.coe_toOpens {G : Type u_1} [] [] {U : } :
U = U
@[simp]
theorem OpenAddSubgroup.coe_toAddSubgroup {G : Type u_1} [] [] {U : } :
U = U
@[simp]
theorem OpenSubgroup.coe_toSubgroup {G : Type u_1} [] [] {U : } :
U = U
@[simp]
theorem OpenAddSubgroup.mem_toOpens {G : Type u_1} [] [] {U : } {g : G} :
g U g U
@[simp]
theorem OpenSubgroup.mem_toOpens {G : Type u_1} [] [] {U : } {g : G} :
g U g U
@[simp]
theorem OpenAddSubgroup.mem_toAddSubgroup {G : Type u_1} [] [] {U : } {g : G} :
g U g U
@[simp]
theorem OpenSubgroup.mem_toSubgroup {G : Type u_1} [] [] {U : } {g : G} :
g U g U
theorem OpenAddSubgroup.ext {G : Type u_1} [] [] {U : } {V : } (h : ∀ (x : G), x U x V) :
U = V
theorem OpenSubgroup.ext {G : Type u_1} [] [] {U : } {V : } (h : ∀ (x : G), x U x V) :
U = V
theorem OpenAddSubgroup.isOpen {G : Type u_1} [] [] (U : ) :
IsOpen U
theorem OpenSubgroup.isOpen {G : Type u_1} [] [] (U : ) :
IsOpen U
theorem OpenAddSubgroup.mem_nhds_zero {G : Type u_1} [] [] (U : ) :
U nhds 0
theorem OpenSubgroup.mem_nhds_one {G : Type u_1} [] [] (U : ) :
U nhds 1
instance OpenAddSubgroup.instTop {G : Type u_1} [] [] :
Equations
• OpenAddSubgroup.instTop = { top := { toAddSubgroup := , isOpen' := } }
instance OpenSubgroup.instTop {G : Type u_1} [] [] :
Top ()
Equations
• OpenSubgroup.instTop = { top := { toSubgroup := , isOpen' := } }
@[simp]
theorem OpenAddSubgroup.mem_top {G : Type u_1} [] [] (x : G) :
@[simp]
theorem OpenSubgroup.mem_top {G : Type u_1} [] [] (x : G) :
@[simp]
theorem OpenAddSubgroup.coe_top {G : Type u_1} [] [] :
= Set.univ
@[simp]
theorem OpenSubgroup.coe_top {G : Type u_1} [] [] :
= Set.univ
@[simp]
=
@[simp]
theorem OpenSubgroup.toSubgroup_top {G : Type u_1} [] [] :
=
@[simp]
theorem OpenAddSubgroup.toOpens_top {G : Type u_1} [] [] :
=
@[simp]
theorem OpenSubgroup.toOpens_top {G : Type u_1} [] [] :
=
instance OpenAddSubgroup.instInhabited {G : Type u_1} [] [] :
Equations
• OpenAddSubgroup.instInhabited = { default := }
instance OpenSubgroup.instInhabited {G : Type u_1} [] [] :
Equations
• OpenSubgroup.instInhabited = { default := }
theorem OpenAddSubgroup.isClosed {G : Type u_1} [] [] [] (U : ) :
theorem OpenSubgroup.isClosed {G : Type u_1} [] [] [] (U : ) :
theorem OpenAddSubgroup.isClopen {G : Type u_1} [] [] [] (U : ) :
theorem OpenSubgroup.isClopen {G : Type u_1} [] [] [] (U : ) :
theorem OpenAddSubgroup.sum.proof_1 {G : Type u_1} [] [] {H : Type u_2} [] [] (U : ) (V : ) :
def OpenAddSubgroup.sum {G : Type u_1} [] [] {H : Type u_2} [] [] (U : ) (V : ) :

The product of two open subgroups as an open subgroup of the product group.

Equations
• U.sum V = { toAddSubgroup := (U).prod V, isOpen' := }
Instances For
def OpenSubgroup.prod {G : Type u_1} [] [] {H : Type u_2} [] [] (U : ) (V : ) :

The product of two open subgroups as an open subgroup of the product group.

Equations
• U.prod V = { toSubgroup := (U).prod V, isOpen' := }
Instances For
@[simp]
theorem OpenAddSubgroup.coe_sum {G : Type u_1} [] [] {H : Type u_2} [] [] (U : ) (V : ) :
(U.sum V) = U ×ˢ V
@[simp]
theorem OpenSubgroup.coe_prod {G : Type u_1} [] [] {H : Type u_2} [] [] (U : ) (V : ) :
(U.prod V) = U ×ˢ V
@[simp]
theorem OpenAddSubgroup.toAddSubgroup_sum {G : Type u_1} [] [] {H : Type u_2} [] [] (U : ) (V : ) :
(U.sum V) = (U).prod V
@[simp]
theorem OpenSubgroup.toSubgroup_prod {G : Type u_1} [] [] {H : Type u_2} [] [] (U : ) (V : ) :
(U.prod V) = (U).prod V
Equations
• OpenAddSubgroup.instInfOpenAddSubgroup = { inf := fun (U V : ) => { toAddSubgroup := U V, isOpen' := } }
theorem OpenAddSubgroup.instInfOpenAddSubgroup.proof_1 {G : Type u_1} [] [] (U : ) (V : ) :
instance OpenSubgroup.instInfOpenSubgroup {G : Type u_1} [] [] :
Inf ()
Equations
• OpenSubgroup.instInfOpenSubgroup = { inf := fun (U V : ) => { toSubgroup := U V, isOpen' := } }
@[simp]
theorem OpenAddSubgroup.coe_inf {G : Type u_1} [] [] {U : } {V : } :
(U V) = U V
@[simp]
theorem OpenSubgroup.coe_inf {G : Type u_1} [] [] {U : } {V : } :
(U V) = U V
@[simp]
theorem OpenAddSubgroup.toAddSubgroup_inf {G : Type u_1} [] [] {U : } {V : } :
(U V) = U V
@[simp]
theorem OpenSubgroup.toSubgroup_inf {G : Type u_1} [] [] {U : } {V : } :
(U V) = U V
@[simp]
theorem OpenAddSubgroup.toOpens_inf {G : Type u_1} [] [] {U : } {V : } :
(U V) = U V
@[simp]
theorem OpenSubgroup.toOpens_inf {G : Type u_1} [] [] {U : } {V : } :
(U V) = U V
@[simp]
theorem OpenAddSubgroup.mem_inf {G : Type u_1} [] [] {U : } {V : } {x : G} :
x U V x U x V
@[simp]
theorem OpenSubgroup.mem_inf {G : Type u_1} [] [] {U : } {V : } {x : G} :
x U V x U x V
Equations
Equations
• OpenSubgroup.instPartialOrderOpenSubgroup = inferInstance
Equations
theorem OpenAddSubgroup.instSemilatticeInfOpenAddSubgroup.proof_5 {G : Type u_1} [] [] (a : ) (b : ) (c : ) :
a ba ca b c
∀ (x x_1 : ), (x x_1) = (x x_1)
Equations
theorem OpenAddSubgroup.instOrderTop.proof_1 {G : Type u_1} [] [] :
∀ (x : ), x Set.univ
instance OpenAddSubgroup.instOrderTop {G : Type u_1} [] [] :
Equations
instance OpenSubgroup.instOrderTop {G : Type u_1} [] [] :
Equations
• OpenSubgroup.instOrderTop =
@[simp]
theorem OpenAddSubgroup.toAddSubgroup_le {G : Type u_1} [] [] {U : } {V : } :
U V U V
@[simp]
theorem OpenSubgroup.toSubgroup_le {G : Type u_1} [] [] {U : } {V : } :
U V U V
def OpenAddSubgroup.comap {G : Type u_1} [] [] {N : Type u_2} [] [] (f : G →+ N) (hf : ) (H : ) :

The preimage of an OpenAddSubgroup along a continuous AddMonoid homomorphism is an OpenAddSubgroup.

Equations
• = { toAddSubgroup := , isOpen' := }
Instances For
theorem OpenAddSubgroup.comap.proof_1 {G : Type u_1} [] [] {N : Type u_2} [] [] (f : G →+ N) (hf : ) (H : ) :
IsOpen (f ⁻¹' H)
def OpenSubgroup.comap {G : Type u_1} [] [] {N : Type u_2} [] [] (f : G →* N) (hf : ) (H : ) :

The preimage of an OpenSubgroup along a continuous Monoid homomorphism is an OpenSubgroup.

Equations
• = { toSubgroup := , isOpen' := }
Instances For
@[simp]
theorem OpenAddSubgroup.coe_comap {G : Type u_1} [] [] {N : Type u_2} [] [] (H : ) (f : G →+ N) (hf : ) :
() = f ⁻¹' H
@[simp]
theorem OpenSubgroup.coe_comap {G : Type u_1} [] [] {N : Type u_2} [] [] (H : ) (f : G →* N) (hf : ) :
() = f ⁻¹' H
@[simp]
theorem OpenAddSubgroup.toAddSubgroup_comap {G : Type u_1} [] [] {N : Type u_2} [] [] (H : ) (f : G →+ N) (hf : ) :
() =
@[simp]
theorem OpenSubgroup.toSubgroup_comap {G : Type u_1} [] [] {N : Type u_2} [] [] (H : ) (f : G →* N) (hf : ) :
() =
@[simp]
theorem OpenAddSubgroup.mem_comap {G : Type u_1} [] [] {N : Type u_2} [] [] {H : } {f : G →+ N} {hf : } {x : G} :
x f x H
@[simp]
theorem OpenSubgroup.mem_comap {G : Type u_1} [] [] {N : Type u_2} [] [] {H : } {f : G →* N} {hf : } {x : G} :
x f x H
theorem OpenAddSubgroup.comap_comap {G : Type u_1} [] [] {N : Type u_2} [] [] {P : Type u_3} [] [] (K : ) (f₂ : N →+ P) (hf₂ : Continuous f₂) (f₁ : G →+ N) (hf₁ : Continuous f₁) :
theorem OpenSubgroup.comap_comap {G : Type u_1} [] [] {N : Type u_2} [] [] {P : Type u_3} [] [] (K : ) (f₂ : N →* P) (hf₂ : Continuous f₂) (f₁ : G →* N) (hf₁ : Continuous f₁) :
OpenSubgroup.comap f₁ hf₁ (OpenSubgroup.comap f₂ hf₂ K) = OpenSubgroup.comap (f₂.comp f₁) K
theorem AddSubgroup.isOpen_of_mem_nhds {G : Type u_1} [] [] [] (H : ) {g : G} (hg : H nhds g) :
IsOpen H
theorem Subgroup.isOpen_of_mem_nhds {G : Type u_1} [] [] [] (H : ) {g : G} (hg : H nhds g) :
IsOpen H
theorem AddSubgroup.isOpen_mono {G : Type u_1} [] [] [] {H₁ : } {H₂ : } (h : H₁ H₂) (h₁ : IsOpen H₁) :
IsOpen H₂
theorem Subgroup.isOpen_mono {G : Type u_1} [] [] [] {H₁ : } {H₂ : } (h : H₁ H₂) (h₁ : IsOpen H₁) :
IsOpen H₂
theorem AddSubgroup.isOpen_of_openAddSubgroup {G : Type u_1} [] [] [] (H : ) {U : } (h : U H) :
IsOpen H
theorem Subgroup.isOpen_of_openSubgroup {G : Type u_1} [] [] [] (H : ) {U : } (h : U H) :
IsOpen H
theorem AddSubgroup.isOpen_of_zero_mem_interior {G : Type u_1} [] [] [] (H : ) (h_1_int : 0 interior H) :
IsOpen H

If a subgroup of an additive topological group has 0 in its interior, then it is open.

theorem Subgroup.isOpen_of_one_mem_interior {G : Type u_1} [] [] [] (H : ) (h_1_int : 1 interior H) :
IsOpen H

If a subgroup of a topological group has 1 in its interior, then it is open.

theorem OpenAddSubgroup.instSup.proof_1 {G : Type u_1} [] [] [] (U : ) (V : ) :
IsOpen (U V)
instance OpenAddSubgroup.instSup {G : Type u_1} [] [] [] :
Equations
• OpenAddSubgroup.instSup = { sup := fun (U V : ) => { toAddSubgroup := U V, isOpen' := } }
instance OpenSubgroup.instSup {G : Type u_1} [] [] [] :
Sup ()
Equations
• OpenSubgroup.instSup = { sup := fun (U V : ) => { toSubgroup := U V, isOpen' := } }
@[simp]
theorem OpenAddSubgroup.toAddSubgroup_sup {G : Type u_1} [] [] [] (U : ) (V : ) :
(U V) = U V
@[simp]
theorem OpenSubgroup.toSubgroup_sup {G : Type u_1} [] [] [] (U : ) (V : ) :
(U V) = U V
theorem OpenAddSubgroup.instLattice.proof_3 {G : Type u_1} [] [] [] (a : ) (b : ) :
b a b
theorem OpenAddSubgroup.instLattice.proof_7 {G : Type u_1} [] [] (a : ) (b : ) (c : ) :
a ba ca b c
instance OpenAddSubgroup.instLattice {G : Type u_1} [] [] [] :
Equations
• One or more equations did not get rendered due to their size.
theorem OpenAddSubgroup.instLattice.proof_1 {G : Type u_1} [] [] [] :
∀ (x x_1 : ), (x x_1) = (x x_1)
theorem OpenAddSubgroup.instLattice.proof_6 {G : Type u_1} [] [] (a : ) (b : ) :
a b b
theorem OpenAddSubgroup.instLattice.proof_4 {G : Type u_1} [] [] [] (a : ) (b : ) (c : ) :
a cb ca b c
theorem OpenAddSubgroup.instLattice.proof_2 {G : Type u_1} [] [] [] (a : ) (b : ) :
a a b
theorem OpenAddSubgroup.instLattice.proof_5 {G : Type u_1} [] [] (a : ) (b : ) :
a b a
instance OpenSubgroup.instLattice {G : Type u_1} [] [] [] :
Equations
theorem Submodule.isOpen_mono {R : Type u_1} {M : Type u_2} [] [] [] [Module R M] {U : } {P : } (h : U P) (hU : IsOpen U) :
IsOpen P
theorem Ideal.isOpen_of_isOpen_subideal {R : Type u_1} [] [] [] {U : } {I : } (h : U I) (hU : IsOpen U) :
IsOpen I