import Mathlib.Logic.Equiv.Defs import Mathlib.Topology.Basic import Mathlib.Topology.Homeomorph import Rubin.LocallyDense import Rubin.Topology import Rubin.Support import Rubin.RegularSupport structure HomeoGroup (α : Type _) [TopologicalSpace α] extends Homeomorph α α variable {α : Type _} variable [TopologicalSpace α] def HomeoGroup.coe : HomeoGroup α -> Homeomorph α α := HomeoGroup.toHomeomorph def HomeoGroup.from : Homeomorph α α -> HomeoGroup α := HomeoGroup.mk instance homeoGroup_coe : Coe (HomeoGroup α) (Homeomorph α α) where coe := HomeoGroup.coe instance homeoGroup_coe₂ : Coe (Homeomorph α α) (HomeoGroup α) where coe := HomeoGroup.from def HomeoGroup.toPerm : HomeoGroup α → Equiv.Perm α := fun g => g.coe.toEquiv instance homeoGroup_coe_perm : Coe (HomeoGroup α) (Equiv.Perm α) where coe := HomeoGroup.toPerm @[simp] theorem HomeoGroup.toPerm_def (g : HomeoGroup α) : g.coe.toEquiv = (g : Equiv.Perm α) := rfl @[simp] theorem HomeoGroup.mk_coe (g : HomeoGroup α) : HomeoGroup.mk (g.coe) = g := rfl @[simp] theorem HomeoGroup.eq_iff_coe_eq {f g : HomeoGroup α} : f.coe = g.coe ↔ f = g := by constructor { intro f_eq_g rw [<-HomeoGroup.mk_coe f] rw [f_eq_g] simp } { intro f_eq_g unfold HomeoGroup.coe rw [f_eq_g] } @[simp] theorem HomeoGroup.from_toHomeomorph (m : Homeomorph α α) : (HomeoGroup.from m).toHomeomorph = m := rfl instance homeoGroup_one : One (HomeoGroup α) where one := HomeoGroup.from (Homeomorph.refl α) theorem HomeoGroup.one_def : (1 : HomeoGroup α) = (Homeomorph.refl α : HomeoGroup α) := rfl instance homeoGroup_inv : Inv (HomeoGroup α) where inv := fun g => HomeoGroup.from (g.coe.symm) @[simp] theorem HomeoGroup.inv_def (g : HomeoGroup α) : (Homeomorph.symm g.coe : HomeoGroup α) = g⁻¹ := rfl theorem HomeoGroup.coe_inv {g : HomeoGroup α} : HomeoGroup.coe (g⁻¹) = (HomeoGroup.coe g).symm := rfl instance homeoGroup_mul : Mul (HomeoGroup α) where mul := fun a b => ⟨b.toHomeomorph.trans a.toHomeomorph⟩ theorem HomeoGroup.coe_mul {f g : HomeoGroup α} : HomeoGroup.coe (f * g) = (HomeoGroup.coe g).trans (HomeoGroup.coe f) := rfl @[simp] theorem HomeoGroup.mul_def (f g : HomeoGroup α) : HomeoGroup.from ((HomeoGroup.coe g).trans (HomeoGroup.coe f)) = f * g := rfl instance homeoGroup_group : Group (HomeoGroup α) where mul_assoc := by intro a b c rw [<-HomeoGroup.eq_iff_coe_eq] repeat rw [HomeoGroup_coe_mul] rfl mul_one := by intro a rw [<-HomeoGroup.eq_iff_coe_eq] rw [HomeoGroup.coe_mul] rfl one_mul := by intro a rw [<-HomeoGroup.eq_iff_coe_eq] rw [HomeoGroup.coe_mul] rfl mul_left_inv := by intro a rw [<-HomeoGroup.eq_iff_coe_eq] rw [HomeoGroup.coe_mul] rw [HomeoGroup.coe_inv] simp rfl /-- The HomeoGroup trivially has a continuous and faithful `MulAction` on the underlying topology `α`. --/ instance homeoGroup_smul₁ : SMul (HomeoGroup α) α where smul := fun g x => g.toFun x @[simp] theorem HomeoGroup.smul₁_def (f : HomeoGroup α) (x : α) : f.toFun x = f • x := rfl @[simp] theorem HomeoGroup.smul₁_def' (f : HomeoGroup α) (x : α) : f.toHomeomorph x = f • x := rfl @[simp] theorem HomeoGroup.coe_toFun_eq_smul₁ (f : HomeoGroup α) (x : α) : FunLike.coe (HomeoGroup.coe f) x = f • x := rfl instance homeoGroup_mulAction₁ : MulAction (HomeoGroup α) α where one_smul := by intro x rfl mul_smul := by intro f g x rfl instance homeoGroup_mulAction₁_continuous : Rubin.ContinuousMulAction (HomeoGroup α) α where continuous := by intro h constructor intro S S_open conv => { congr; ext congr; ext rw [<-HomeoGroup.smul₁_def'] } simp only [Homeomorph.isOpen_preimage] exact S_open instance homeoGroup_mulAction₁_faithful : FaithfulSMul (HomeoGroup α) α where eq_of_smul_eq_smul := by intro f g hyp rw [<-HomeoGroup.eq_iff_coe_eq] ext x simp exact hyp x theorem HomeoGroup.smulImage_eq_image (g : HomeoGroup α) (S : Set α) : g •'' S = ⇑g.toHomeomorph '' S := rfl section ContinuousMulActionCoe variable {G : Type _} [Group G] variable [MulAction G α] [Rubin.ContinuousMulAction G α] /-- `fromContinuous` is a structure-preserving transformation from a continuous `MulAction` to a `HomeoGroup` --/ def HomeoGroup.fromContinuous (α : Type _) [TopologicalSpace α] [MulAction G α] [Rubin.ContinuousMulAction G α] (g : G) : HomeoGroup α := HomeoGroup.from (Rubin.ContinuousMulAction.toHomeomorph α g) @[simp] theorem HomeoGroup.fromContinuous_def (g : G) : HomeoGroup.from (Rubin.ContinuousMulAction.toHomeomorph α g) = HomeoGroup.fromContinuous α g := rfl -- instance homeoGroup_coe_fromContinuous : Coe G (HomeoGroup α) where -- coe := fun g => HomeoGroup.fromContinuous α g @[simp] theorem HomeoGroup.fromContinuous_smul (g : G) : ∀ x : α, (HomeoGroup.fromContinuous α g) • x = g • x := by intro x unfold fromContinuous rw [<-HomeoGroup.smul₁_def', HomeoGroup.from_toHomeomorph] unfold Rubin.ContinuousMulAction.toHomeomorph simp theorem HomeoGroup.fromContinuous_one : HomeoGroup.fromContinuous α (1 : G) = (1 : HomeoGroup α) := by apply FaithfulSMul.eq_of_smul_eq_smul (α := α) simp theorem HomeoGroup.fromContinuous_mul (g h : G): (HomeoGroup.fromContinuous α g) * (HomeoGroup.fromContinuous α h) = (HomeoGroup.fromContinuous α (g * h)) := by apply FaithfulSMul.eq_of_smul_eq_smul (α := α) intro x rw [mul_smul] simp rw [mul_smul] theorem HomeoGroup.fromContinuous_inv (g : G): HomeoGroup.fromContinuous α g⁻¹ = (HomeoGroup.fromContinuous α g)⁻¹ := by apply FaithfulSMul.eq_of_smul_eq_smul (α := α) intro x group_action rw [mul_smul] simp theorem HomeoGroup.fromContinuous_eq_iff [FaithfulSMul G α] (g h : G): (HomeoGroup.fromContinuous α g) = (HomeoGroup.fromContinuous α h) ↔ g = h := by constructor · intro cont_eq apply FaithfulSMul.eq_of_smul_eq_smul (α := α) intro x rw [<-HomeoGroup.fromContinuous_smul g] rw [cont_eq] simp · tauto @[simp] theorem HomeoGroup.fromContinuous_support (g : G) : Rubin.Support α (HomeoGroup.fromContinuous α g) = Rubin.Support α g := by ext x repeat rw [Rubin.mem_support] rw [<-HomeoGroup.smul₁_def, <-HomeoGroup.fromContinuous_def] rw [HomeoGroup.from_toHomeomorph] rw [Rubin.ContinuousMulAction.toHomeomorph_toFun] @[simp] theorem HomeoGroup.fromContinuous_regularSupport (g : G) : Rubin.RegularSupport α (HomeoGroup.fromContinuous α g) = Rubin.RegularSupport α g := by unfold Rubin.RegularSupport rw [HomeoGroup.fromContinuous_support] @[simp] theorem HomeoGroup.fromContinuous_smulImage (g : G) (V : Set α) : (HomeoGroup.fromContinuous α g) •'' V = g •'' V := by repeat rw [Rubin.smulImage_def] simp def HomeoGroup.fromContinuous_embedding (α : Type _) [TopologicalSpace α] [MulAction G α] [Rubin.ContinuousMulAction G α] [FaithfulSMul G α]: G ↪ (HomeoGroup α) where toFun := fun (g : G) => HomeoGroup.fromContinuous α g inj' := by intro g h fromCont_eq simp at fromCont_eq apply FaithfulSMul.eq_of_smul_eq_smul (α := α) intro x rw [<-fromContinuous_smul, fromCont_eq, fromContinuous_smul] @[simp] theorem HomeoGroup.fromContinuous_embedding_toFun [FaithfulSMul G α] (g : G): HomeoGroup.fromContinuous_embedding α g = HomeoGroup.fromContinuous α g := rfl def HomeoGroup.fromContinuous_monoidHom (α : Type _) [TopologicalSpace α] [MulAction G α] [Rubin.ContinuousMulAction G α] [FaithfulSMul G α]: G →* (HomeoGroup α) where toFun := fun (g : G) => HomeoGroup.fromContinuous α g map_one' := by simp rw [fromContinuous_one] map_mul' := by simp intros rw [fromContinuous_mul] -- theorem HomeoGroup.fromContinuous_rigidStabilizer (U : Set α) [FaithfulSMul G α]: -- Rubin.RigidStabilizer (HomeoGroup α) U = Subgroup.map (HomeoGroup.fromContinuous_monoidHom α) (Rubin.RigidStabilizer G U) := -- by -- ext g -- rw [<-Subgroup.mem_carrier] -- unfold Rubin.RigidStabilizer -- simp -- sorry end ContinuousMulActionCoe namespace Rubin section Other -- TODO: move this somewhere else /-- ## Proposition 3.1 --/ theorem rigidStabilizer_subset_iff (G : Type _) {α : Type _} [Group G] [TopologicalSpace α] [MulAction G α] [ContinuousMulAction G α] [FaithfulSMul G α] [h_lm : LocallyMoving G α] {U V : Set α} (U_reg : Regular U) (V_reg : Regular V): U ⊆ V ↔ RigidStabilizer G U ≤ RigidStabilizer G V := by constructor exact rigidStabilizer_mono intro rist_ss by_contra U_not_ss_V let W := U \ closure V have W_nonempty : Set.Nonempty W := by by_contra W_empty apply U_not_ss_V apply subset_from_diff_closure_eq_empty · assumption · exact U_reg.isOpen · rw [Set.not_nonempty_iff_eq_empty] at W_empty exact W_empty have W_ss_U : W ⊆ U := by simp exact Set.diff_subset _ _ have W_open : IsOpen W := by unfold_let rw [Set.diff_eq_compl_inter] apply IsOpen.inter simp exact U_reg.isOpen have ⟨f, f_in_ristW, f_ne_one⟩ := h_lm.get_nontrivial_rist_elem W_open W_nonempty have f_in_ristU : f ∈ RigidStabilizer G U := by exact rigidStabilizer_mono W_ss_U f_in_ristW have f_notin_ristV : f ∉ RigidStabilizer G V := by apply rigidStabilizer_compl f_ne_one apply rigidStabilizer_mono _ f_in_ristW calc W = U ∩ (closure V)ᶜ := by unfold_let; rw [Set.diff_eq_compl_inter, Set.inter_comm] _ ⊆ (closure V)ᶜ := Set.inter_subset_right _ _ _ ⊆ Vᶜ := by rw [Set.compl_subset_compl] exact subset_closure exact f_notin_ristV (rist_ss f_in_ristU) theorem rigidStabilizer_eq_iff (G : Type _) [Group G] {α : Type _} [TopologicalSpace α] [MulAction G α] [ContinuousMulAction G α] [FaithfulSMul G α] [LocallyMoving G α] {U V : Set α} (U_reg : Regular U) (V_reg : Regular V): RigidStabilizer G U = RigidStabilizer G V ↔ U = V := by constructor · intro rist_eq apply le_antisymm <;> simp only [Set.le_eq_subset] all_goals { rw [rigidStabilizer_subset_iff G] <;> try assumption rewrite [rist_eq] rfl } · intro H_eq rw [H_eq] theorem homeoGroup_rigidStabilizer_subset_iff {α : Type _} [TopologicalSpace α] [h_lm : LocallyMoving (HomeoGroup α) α] {U V : Set α} (U_reg : Regular U) (V_reg : Regular V): U ⊆ V ↔ RigidStabilizer (HomeoGroup α) U ≤ RigidStabilizer (HomeoGroup α) V := by rw [rigidStabilizer_subset_iff (HomeoGroup α) U_reg V_reg] theorem homeoGroup_rigidStabilizer_eq_iff {α : Type _} [TopologicalSpace α] [LocallyMoving (HomeoGroup α) α] {U V : Set α} (U_reg : Regular U) (V_reg : Regular V): RigidStabilizer (HomeoGroup α) U = RigidStabilizer (HomeoGroup α) V ↔ U = V := by constructor · intro rist_eq apply le_antisymm <;> simp only [Set.le_eq_subset] all_goals { rw [homeoGroup_rigidStabilizer_subset_iff] <;> try assumption rewrite [rist_eq] rfl } · intro H_eq rw [H_eq] theorem homeoGroup_rigidStabilizer_injective {α : Type _} [TopologicalSpace α] [LocallyMoving (HomeoGroup α) α] : Function.Injective (fun U : { S : Set α // Regular S } => RigidStabilizer (HomeoGroup α) U.val) := by intro ⟨U, U_reg⟩ intro ⟨V, V_reg⟩ simp exact (homeoGroup_rigidStabilizer_eq_iff U_reg V_reg).mp end Other end Rubin