You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
rubin-lean4/Rubin.lean

2393 lines
86 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/-
Copyright (c) 2023 Laurent Bartholdi. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author : Laurent Bartholdi
-/
import Mathlib.Data.Finset.Basic
import Mathlib.Data.Finset.Card
import Mathlib.Data.Fintype.Perm
import Mathlib.GroupTheory.Subgroup.Basic
import Mathlib.GroupTheory.Commutator
import Mathlib.GroupTheory.GroupAction.Basic
import Mathlib.GroupTheory.Exponent
import Mathlib.GroupTheory.Perm.Basic
import Mathlib.Topology.Basic
import Mathlib.Topology.Bases
import Mathlib.Topology.Compactness.Compact
import Mathlib.Topology.Separation
import Mathlib.Topology.Homeomorph
import Mathlib.Topology.Algebra.ConstMulAction
import Rubin.Tactic
import Rubin.MulActionExt
import Rubin.SmulImage
import Rubin.Support
import Rubin.Topology
import Rubin.RigidStabilizer
import Rubin.Period
import Rubin.AlgebraicDisjointness
import Rubin.RegularSupport
import Rubin.RegularSupportBasis
import Rubin.Filter
#align_import rubin
namespace Rubin
open Rubin.Tactic
----------------------------------------------------------------
section Rubin
----------------------------------------------------------------
section RubinActions
-- TODO: debate whether having this structure is relevant or not,
-- since the instance inference engine doesn't play well with it.
-- One alternative would be to lay out all of the properties as-is (without their class wrappers),
-- then provide ways to reconstruct them in instances.
structure RubinAction (G α : Type _) where
group : Group G
action : MulAction G α
topology : TopologicalSpace α
faithful : FaithfulSMul G α
locally_compact : LocallyCompactSpace α
hausdorff : T2Space α
no_isolated_points : HasNoIsolatedPoints α
locally_dense : LocallyDense G α
#align rubin_action Rubin.RubinAction
/--
Constructs a RubinAction from ambient instances.
If needed, missing instances can be passed as named parameters.
--/
def RubinAction.mk' (G α : Type _)
[group : Group G] [topology : TopologicalSpace α] [hausdorff : T2Space α] [action : MulAction G α]
[faithful : FaithfulSMul G α] [locally_compact : LocallyCompactSpace α]
[no_isolated_points : HasNoIsolatedPoints α] [locally_dense : LocallyDense G α] :
RubinAction G α := ⟨
group,
action,
topology,
faithful,
locally_compact,
hausdorff,
no_isolated_points,
locally_dense
variable {G α : Type _}
instance RubinAction.instGroup (act : RubinAction G α) : Group G := act.group
instance RubinAction.instFaithful (act : RubinAction G α) : @FaithfulSMul G α (@MulAction.toSMul G α act.group.toMonoid act.action) := act.faithful
instance RubinAction.topologicalSpace (act : RubinAction G α) : TopologicalSpace α := act.topology
end RubinActions
section AlgebraicDisjointness
variable {G α : Type _}
variable [TopologicalSpace α]
variable [Group G]
variable [MulAction G α]
variable [ContinuousConstSMul G α]
variable [FaithfulSMul G α]
-- TODO: modify the proof to be less "let everything"-y, especially the first half
lemma proposition_1_1_1 [h_lm : LocallyMoving G α] [T2Space α] (f g : G) (supp_disjoint : Disjoint (Support α f) (Support α g)) : AlgebraicallyDisjoint f g := by
apply AlgebraicallyDisjoint_mk
intros h h_not_commute
-- h is not the identity on `Support α f`
have f_h_not_disjoint := (mt (disjoint_commute (G := G) (α := α)) h_not_commute)
have ⟨x, ⟨x_in_supp_f, x_in_supp_h⟩⟩ := Set.not_disjoint_iff.mp f_h_not_disjoint
have hx_ne_x := mem_support.mp x_in_supp_h
-- Since α is Hausdoff, there is a nonempty V ⊆ Support α f, with h •'' V disjoint from V
have ⟨V, V_open, x_in_V, V_in_support, disjoint_img_V⟩ := disjoint_nbhd_in (support_isOpen f) x_in_supp_f hx_ne_x
-- let f₂ be a nontrivial element of the RigidStabilizer G V
let ⟨f₂, f₂_in_rist_V, f₂_ne_one⟩ := h_lm.get_nontrivial_rist_elem V_open (Set.nonempty_of_mem x_in_V)
-- Re-use the Hausdoff property of α again, this time yielding W ⊆ V
let ⟨y, y_moved⟩ := faithful_moves_point' α f₂_ne_one
have y_in_V := (rigidStabilizer_support.mp f₂_in_rist_V) (mem_support.mpr y_moved)
let ⟨W, W_open, y_in_W, W_in_V, disjoint_img_W⟩ := disjoint_nbhd_in V_open y_in_V y_moved
-- Let f₁ be a nontrivial element of RigidStabilizer G W
let ⟨f₁, f₁_in_rist_W, f₁_ne_one⟩ := h_lm.get_nontrivial_rist_elem W_open (Set.nonempty_of_mem y_in_W)
use f₁
use f₂
constructor <;> try constructor
· apply disjoint_commute (α := α)
apply Set.disjoint_of_subset_left _ supp_disjoint
calc
Support α f₁ ⊆ W := rigidStabilizer_support.mp f₁_in_rist_W
W ⊆ V := W_in_V
V ⊆ Support α f := V_in_support
· apply disjoint_commute (α := α)
apply Set.disjoint_of_subset_left _ supp_disjoint
calc
Support α f₂ ⊆ V := rigidStabilizer_support.mp f₂_in_rist_V
V ⊆ Support α f := V_in_support
-- We claim that [f₁, [f₂, h]] is a nontrivial elelement of Centralizer G g
let k := ⁅f₂, h⁆
have h₂ : ∀ z ∈ W, f₂ • z = k • z := by
intro z z_in_W
simp
symm
apply disjoint_support_comm f₂ h _ disjoint_img_V
· exact W_in_V z_in_W
· exact rigidStabilizer_support.mp f₂_in_rist_V
constructor
· -- then `k*f₁⁻¹*k⁻¹` is supported on k W = f₂ W,
-- so [f₁,k] is supported on W f₂ W ⊆ V ⊆ support f, so commutes with g.
apply disjoint_commute (α := α)
apply Set.disjoint_of_subset_left _ supp_disjoint
have supp_f₁_subset_W := (rigidStabilizer_support.mp f₁_in_rist_W)
show Support α ⁅f₁, ⁅f₂, h⁆⁆ ⊆ Support α f
calc
Support α ⁅f₁, k⁆ = Support α ⁅k, f₁⁆ := by rw [<-commutatorElement_inv, support_inv]
_ ⊆ Support α f₁ (k •'' Support α f₁) := support_comm α k f₁
_ ⊆ W (k •'' Support α f₁) := Set.union_subset_union_left _ supp_f₁_subset_W
_ ⊆ W (k •'' W) := by
apply Set.union_subset_union_right
exact (smulImage_mono k supp_f₁_subset_W)
_ = W (f₂ •'' W) := by rw [<-smulImage_eq_of_smul_eq h₂]
_ ⊆ V (f₂ •'' W) := Set.union_subset_union_left _ W_in_V
_ ⊆ V V := by
apply Set.union_subset_union_right
apply smulImage_subset_in_support f₂ W V W_in_V
exact rigidStabilizer_support.mp f₂_in_rist_V
_ ⊆ V := by rw [Set.union_self]
_ ⊆ Support α f := V_in_support
· -- finally, [f₁,k] agrees with f₁ on W, so is not the identity.
have h₄: ∀ z ∈ W, ⁅f₁, k⁆ • z = f₁ • z := by
apply disjoint_support_comm f₁ k
exact rigidStabilizer_support.mp f₁_in_rist_W
rw [<-smulImage_eq_of_smul_eq h₂]
exact disjoint_img_W
let ⟨z, z_in_W, z_moved⟩ := faithful_rigid_stabilizer_moves_point f₁_in_rist_W f₁_ne_one
by_contra h₅
rw [<-h₄ z z_in_W] at z_moved
have h₆ : ⁅f₁, ⁅f₂, h⁆⁆ • z = z := by rw [h₅, one_smul]
exact z_moved h₆
#align proposition_1_1_1 Rubin.proposition_1_1_1
lemma moves_1234_of_moves_12 {g : G} {x : α} (g12_moves : g^12 • x ≠ x) :
Function.Injective (fun i : Fin 5 => g^(i : ) • x) :=
by
apply moves_inj
intros k k_ge_1 k_lt_5
simp at k_lt_5
by_contra x_fixed
have k_div_12 : k 12 := by
-- Note: norm_num does not support .dvd yet, nor .mod, nor Int.natAbs, nor Int.div, etc.
have h: (12 : ) = (12 : ) := by norm_num
rw [h, Int.ofNat_dvd_right]
apply Nat.dvd_of_mod_eq_zero
interval_cases k
all_goals unfold Int.natAbs
all_goals norm_num
have g12_fixed : g^12 • x = x := by
rw [<-zpow_ofNat]
simp
rw [<-Int.mul_ediv_cancel' k_div_12]
have res := smul_zpow_eq_of_smul_eq (12/k) x_fixed
group_action at res
exact res
exact g12_moves g12_fixed
lemma proposition_1_1_2 [T2Space α] [h_lm : LocallyMoving G α]
(f g : G) (h_disj : AlgebraicallyDisjoint f g) : Disjoint (Support α f) (Support α (g^12)) :=
by
by_contra not_disjoint
let U := Support α f ∩ Support α (g^12)
have U_nonempty : U.Nonempty := by
apply Set.not_disjoint_iff_nonempty_inter.mp
exact not_disjoint
-- Since G is Hausdorff, we can find a nonempty set V ⊆ such that f(V) is disjoint from V and the sets {g^i(V): i=0..4} are pairwise disjoint
let x := U_nonempty.some
have x_in_U : x ∈ U := Set.Nonempty.some_mem U_nonempty
have fx_moves : f • x ≠ x := Set.inter_subset_left _ _ x_in_U
have five_points : Function.Injective (fun i : Fin 5 => g^(i : ) • x) := by
apply moves_1234_of_moves_12
exact (Set.inter_subset_right _ _ x_in_U)
have U_open: IsOpen U := (IsOpen.inter (support_isOpen f) (support_isOpen (g^12)))
let ⟨V₀, V₀_open, x_in_V₀, V₀_in_support, disjoint_img_V₀⟩ := disjoint_nbhd_in U_open x_in_U fx_moves
let ⟨V₁, V₁_open, x_in_V₁, disjoint_img_V₁⟩ := disjoint_nbhd_fin five_points
let V := V₀ ∩ V₁
-- Let h be a nontrivial element of the RigidStabilizer G V
let ⟨h, ⟨h_in_ristV, h_ne_one⟩⟩ := h_lm.get_nontrivial_rist_elem (IsOpen.inter V₀_open V₁_open) (Set.nonempty_of_mem ⟨x_in_V₀, x_in_V₁⟩)
have V_disjoint_smulImage: Disjoint V (f •'' V) := by
apply Set.disjoint_of_subset
· exact Set.inter_subset_left _ _
· apply smulImage_mono
exact Set.inter_subset_left _ _
· exact disjoint_img_V₀
have comm_non_trivial : ¬Commute f h := by
by_contra comm_trivial
let ⟨z, z_in_V, z_moved⟩ := faithful_rigid_stabilizer_moves_point h_in_ristV h_ne_one
apply z_moved
nth_rewrite 2 [<-one_smul G z]
rw [<-commutatorElement_eq_one_iff_commute.mpr comm_trivial.symm]
symm
apply disjoint_support_comm h f
· exact rigidStabilizer_support.mp h_in_ristV
· exact V_disjoint_smulImage
· exact z_in_V
-- Since g is algebraically disjoint from f, there exist f₁,f₂ ∈ C_G(g) so that the commutator h' = [f1,[f2,h]] is a nontrivial element of C_G(g)
let alg_disj_elem := h_disj h comm_non_trivial
let f₁ := alg_disj_elem.fst
let f₂ := alg_disj_elem.snd
let h' := alg_disj_elem.comm_elem
have f₁_commutes : Commute f₁ g := alg_disj_elem.fst_commute
have f₂_commutes : Commute f₂ g := alg_disj_elem.snd_commute
have h'_commutes : Commute h' g := alg_disj_elem.comm_elem_commute
have h'_nontrivial : h' ≠ 1 := alg_disj_elem.comm_elem_nontrivial
have support_f₂_h : Support α ⁅f₂,h⁆ ⊆ V (f₂ •'' V) := by
calc
Support α ⁅f₂, h⁆ ⊆ Support α h (f₂ •'' Support α h) := support_comm α f₂ h
_ ⊆ V (f₂ •'' Support α h) := by
apply Set.union_subset_union_left
exact rigidStabilizer_support.mp h_in_ristV
_ ⊆ V (f₂ •'' V) := by
apply Set.union_subset_union_right
apply smulImage_mono
exact rigidStabilizer_support.mp h_in_ristV
have support_h' : Support α h' ⊆ (i : Fin 2 × Fin 2), (f₁^(i.1.val) * f₂^(i.2.val)) •'' V := by
rw [rewrite_Union]
simp (config := {zeta := false})
rw [<-smulImage_mul, <-smulImage_union]
calc
Support α h' ⊆ Support α ⁅f₂,h⁆ (f₁ •'' Support α ⁅f₂, h⁆) := support_comm α f₁ ⁅f₂,h⁆
_ ⊆ V (f₂ •'' V) (f₁ •'' Support α ⁅f₂, h⁆) := by
apply Set.union_subset_union_left
exact support_f₂_h
_ ⊆ V (f₂ •'' V) (f₁ •'' V (f₂ •'' V)) := by
apply Set.union_subset_union_right
apply smulImage_mono f₁
exact support_f₂_h
-- Since h' is nontrivial, it has at least one point p in its support
let ⟨p, p_moves⟩ := faithful_moves_point' α h'_nontrivial
-- Since g commutes with h', all five of the points {gi(p):i=0..4} lie in supp(h')
have gi_in_support : ∀ (i: Fin 5), g^(i.val) • p ∈ Support α h' := by
intro i
rw [mem_support]
by_contra p_fixed
rw [<-mul_smul, h'_commutes.pow_right, mul_smul] at p_fixed
group_action at p_fixed
exact p_moves p_fixed
-- The next section gets tricky, so let us clear away some stuff first :3
clear h'_commutes h'_nontrivial
clear V₀_open x_in_V₀ V₀_in_support disjoint_img_V₀
clear V₁_open x_in_V₁
clear five_points h_in_ristV h_ne_one V_disjoint_smulImage
clear support_f₂_h
-- by the pigeonhole principle, one of the four sets V, f₁(V), f₂(V), f₁f₂(V) must contain two of these points,
-- say g^i(p),g^j(p) ∈ k(V) for some 0 ≤ i < j ≤ 4 and k ∈ {1,f₁,f₂,f₁f₂}
let pigeonhole : Fintype.card (Fin 5) > Fintype.card (Fin 2 × Fin 2) := by trivial
let choice_pred := fun (i : Fin 5) => (Set.mem_iUnion.mp (support_h' (gi_in_support i)))
let choice := fun (i : Fin 5) => (choice_pred i).choose
let ⟨i, _, j, _, i_ne_j, same_choice⟩ := Finset.exists_ne_map_eq_of_card_lt_of_maps_to
pigeonhole
(fun (i : Fin 5) _ => Finset.mem_univ (choice i))
let k := f₁^(choice i).1.val * f₂^(choice i).2.val
have same_k : f₁^(choice j).1.val * f₂^(choice j).2.val = k := by rw [<-same_choice]
have gi : g^i.val • p ∈ k •'' V := (choice_pred i).choose_spec
have gk : g^j.val • p ∈ k •'' V := by
have gk' := (choice_pred j).choose_spec
rw [same_k] at gk'
exact gk'
-- Since g^(j-i)(V) is disjoint from V and k commutes with g,
-- we know that g^(ji)k(V) is disjoint from k(V),
-- which leads to a contradiction since g^i(p) and g^j(p) both lie in k(V).
have g_disjoint : Disjoint ((g^i.val)⁻¹ •'' V) ((g^j.val)⁻¹ •'' V) := by
apply smulImage_disjoint_subset (Set.inter_subset_right V₀ V₁)
group
rw [smulImage_disjoint_inv_pow]
group
apply disjoint_img_V₁
symm; exact i_ne_j
have k_commutes: Commute k g := by
apply Commute.mul_left
· exact f₁_commutes.pow_left _
· exact f₂_commutes.pow_left _
clear f₁_commutes f₂_commutes
have g_k_disjoint : Disjoint ((g^i.val)⁻¹ •'' (k •'' V)) ((g^j.val)⁻¹ •'' (k •'' V)) := by
repeat rw [smulImage_mul]
repeat rw [<-inv_pow]
repeat rw [k_commutes.symm.inv_left.pow_left]
repeat rw [<-smulImage_mul k]
repeat rw [inv_pow]
exact smulImage_disjoint k g_disjoint
apply Set.disjoint_left.mp g_k_disjoint
· rw [mem_inv_smulImage]
exact gi
· rw [mem_inv_smulImage]
exact gk
lemma remark_1_2 (f g : G) (h_disj : AlgebraicallyDisjoint f g): Commute f g := by
by_contra non_commute
let disj_elem := h_disj g non_commute
let nontrivial := disj_elem.comm_elem_nontrivial
rw [commutatorElement_eq_one_iff_commute.mpr disj_elem.snd_commute] at nontrivial
rw [commutatorElement_one_right] at nontrivial
tauto
end AlgebraicDisjointness
section RegularSupport
lemma lemma_2_2 (G: Type _) {α : Type _} [Group G] [TopologicalSpace α] [MulAction G α]
[ContinuousConstSMul G α] [FaithfulSMul G α]
[T2Space α] [h_lm : LocallyMoving G α]
{U : Set α} (U_open : IsOpen U) (U_nonempty : Set.Nonempty U) :
Monoid.exponent G•[U] = 0 :=
by
by_contra exp_ne_zero
let ⟨p, ⟨g, g_in_ristU⟩, n, p_in_U, n_pos, hpgn, n_eq_Sup⟩ := Period.period_from_exponent U U_nonempty exp_ne_zero
simp at hpgn
let ⟨V', V'_open, p_in_V', disj'⟩ := disjoint_nbhd_fin (smul_injective_within_period hpgn)
let V := U ∩ V'
have V_open : IsOpen V := U_open.inter V'_open
have p_in_V : p ∈ V := ⟨p_in_U, p_in_V'⟩
have disj : ∀ (i j : Fin n), i ≠ j → Disjoint (g ^ (i : ) •'' V) (g ^ (j : ) •'' V) := by
intro i j i_ne_j
apply Set.disjoint_of_subset
· apply smulImage_mono
apply Set.inter_subset_right
· apply smulImage_mono
apply Set.inter_subset_right
exact disj' i j i_ne_j
let ⟨h, h_in_ristV, h_ne_one⟩ := h_lm.get_nontrivial_rist_elem V_open (Set.nonempty_of_mem p_in_V)
have hg_in_ristU : h * g ∈ RigidStabilizer G U := by
simp [RigidStabilizer]
intro x x_notin_U
rw [mul_smul]
rw [g_in_ristU _ x_notin_U]
have x_notin_V : x ∉ V := fun x_in_V => x_notin_U x_in_V.left
rw [h_in_ristV _ x_notin_V]
let ⟨q, q_in_V, hq_ne_q ⟩ := faithful_rigid_stabilizer_moves_point h_in_ristV h_ne_one
have gpowi_q_notin_V : ∀ (i : Fin n), (i : ) > 0 → g ^ (i : ) • q ∉ V := by
apply smulImage_distinct_of_disjoint_pow n_pos disj
exact q_in_V
-- We have (hg)^i q = g^i q for all 0 < i < n
have hgpow_eq_gpow : ∀ (i : Fin n), (h * g) ^ (i : ) • q = g ^ (i : ) • q := by
intro ⟨i, i_lt_n⟩
simp
induction i with
| zero => simp
| succ i' IH =>
have i'_lt_n: i' < n := Nat.lt_of_succ_lt i_lt_n
have IH := IH i'_lt_n
rw [smul_succ]
rw [IH]
rw [smul_succ]
rw [mul_smul]
rw [<-smul_succ]
-- We can show that `g^(Nat.succ i') • q ∉ V`,
-- which means that with `h` in `RigidStabilizer G V`, `h` fixes that point
apply h_in_ristV (g^(Nat.succ i') • q)
let i'₂ : Fin n := ⟨Nat.succ i', i_lt_n⟩
have h_eq: Nat.succ i' = (i'₂ : ) := by simp
rw [h_eq]
apply smulImage_distinct_of_disjoint_pow
· exact n_pos
· exact disj
· exact q_in_V
· simp
-- Combined with `g^i • q ≠ q`, this yields `(hg)^i • q ≠ q` for all `0 < i < n`
have hgpow_moves : ∀ (i : Fin n), 0 < (i : ) → (h*g)^(i : ) • q ≠ q := by
intro ⟨i, i_lt_n⟩ i_pos
simp at i_pos
rw [hgpow_eq_gpow]
simp
by_contra h'
apply gpowi_q_notin_V ⟨i, i_lt_n⟩
exact i_pos
simp (config := {zeta := false}) only []
rw [h']
exact q_in_V
-- This even holds for `i = n`
have hgpown_moves : (h * g) ^ n • q ≠ q := by
-- Rewrite (hg)^n • q = h * g^n • q
rw [<-Nat.succ_pred n_pos.ne.symm]
rw [pow_succ]
have h_eq := hgpow_eq_gpow ⟨Nat.pred n, Nat.pred_lt_self n_pos⟩
simp at h_eq
rw [mul_smul, h_eq, <-mul_smul, mul_assoc, <-pow_succ]
rw [<-Nat.succ_eq_add_one, Nat.succ_pred n_pos.ne.symm]
-- We first eliminate `g^n • q` by proving that `n = Period g q`
have period_gq_eq_n : Period.period q g = n := by
apply ge_antisymm
{
apply Period.notfix_le_period'
· apply Period.period_pos'
· exact Set.nonempty_of_mem p_in_U
· exact exp_ne_zero
· exact q_in_V.left
· exact g_in_ristU
· intro i i_pos
rw [<-hgpow_eq_gpow]
apply hgpow_moves i i_pos
}
{
rw [n_eq_Sup]
apply Period.period_le_Sup_periods'
· exact Set.nonempty_of_mem p_in_U
· exact exp_ne_zero
· exact q_in_V.left
· exact g_in_ristU
}
rw [mul_smul, <-period_gq_eq_n]
rw [Period.pow_period_fix]
-- Finally, we have `h • q ≠ q`
exact hq_ne_q
-- Finally, we derive a contradiction
have ⟨period_hg_pos, period_hg_le_n⟩ := Period.zero_lt_period_le_Sup_periods U_nonempty exp_ne_zero ⟨q, q_in_V.left⟩ ⟨h * g, hg_in_ristU⟩
simp at period_hg_pos
simp at period_hg_le_n
rw [<-n_eq_Sup] at period_hg_le_n
cases (lt_or_eq_of_le period_hg_le_n) with
| inl period_hg_lt_n =>
apply hgpow_moves ⟨Period.period q (h * g), period_hg_lt_n⟩
exact period_hg_pos
simp
apply Period.pow_period_fix
| inr period_hg_eq_n =>
apply hgpown_moves
rw [<-period_hg_eq_n]
apply Period.pow_period_fix
-- Given the statement `¬Support α h ⊆ RegularSupport α f`,
-- we construct an open subset within `Support α h \ RegularSupport α f`,
-- and we show that it is non-empty, open and (by construction) disjoint from `Support α f`.
lemma open_set_from_supp_not_subset_rsupp {G α : Type _}
[Group G] [TopologicalSpace α] [MulAction G α] [ContinuousConstSMul G α] [T2Space α]
{f h : G} (not_support_subset_rsupp : ¬Support α h ⊆ RegularSupport α f):
∃ V : Set α, V ⊆ Support α h ∧ Set.Nonempty V ∧ IsOpen V ∧ Disjoint V (Support α f) :=
by
let U := Support α h \ closure (RegularSupport α f)
have U_open : IsOpen U := by
unfold_let
rw [Set.diff_eq_compl_inter]
apply IsOpen.inter
· simp
· exact support_isOpen _
have U_subset_supp_h : U ⊆ Support α h := by simp; apply Set.diff_subset
have U_disj_supp_f : Disjoint U (Support α f) := by
apply Set.disjoint_of_subset_right
· exact subset_closure
· simp
rw [Set.diff_eq_compl_inter]
apply Disjoint.inter_left
apply Disjoint.closure_right; swap; simp
rw [Set.disjoint_compl_left_iff_subset]
apply subset_trans
exact subset_closure
apply closure_mono
apply support_subset_regularSupport
have U_nonempty : Set.Nonempty U; swap
exact ⟨U, U_subset_supp_h, U_nonempty, U_open, U_disj_supp_f⟩
-- We prove that U isn't empty by contradiction:
-- if it is empty, then `Support α h \ closure (RegularSupport α f) = ∅`,
-- so we can show that `Support α h ⊆ RegularSupport α f`,
-- contradicting with our initial hypothesis.
by_contra U_empty
apply not_support_subset_rsupp
show Support α h ⊆ RegularSupport α f
apply subset_from_diff_closure_eq_empty
· apply regularSupport_regular
· exact support_isOpen _
· rw [Set.not_nonempty_iff_eq_empty] at U_empty
exact U_empty
lemma nontrivial_pow_from_exponent_eq_zero {G : Type _} [Group G]
(exp_eq_zero : Monoid.exponent G = 0) :
∀ (n : ), n > 0 → ∃ g : G, g^n ≠ 1 :=
by
intro n n_pos
rw [Monoid.exponent_eq_zero_iff] at exp_eq_zero
unfold Monoid.ExponentExists at exp_eq_zero
rw [<-Classical.not_forall_not, Classical.not_not] at exp_eq_zero
simp at exp_eq_zero
exact exp_eq_zero n n_pos
lemma proposition_2_1 {G α : Type _}
[Group G] [TopologicalSpace α] [MulAction G α] [ContinuousConstSMul G α] [T2Space α]
[LocallyMoving G α] [h_faithful : FaithfulSMul G α]
(f : G) :
AlgebraicCentralizer f = G•[RegularSupport α f] :=
by
ext h
constructor
swap
{
intro h_in_rist
simp at h_in_rist
unfold AlgebraicCentralizer
rw [Subgroup.mem_centralizer_iff]
intro g g_in_S
simp [AlgebraicSubgroup] at g_in_S
let ⟨g', ⟨g'_alg_disj, g_eq_g'⟩⟩ := g_in_S
have supp_disj := proposition_1_1_2 f g' g'_alg_disj (α := α)
apply Commute.eq
symm
apply commute_if_rigidStabilizer_and_disjoint (α := α)
· exact h_in_rist
· show Disjoint (RegularSupport α f) (Support α g)
have cl_supp_disj : Disjoint (closure (Support α f)) (Support α g)
swap
apply Set.disjoint_of_subset _ _ cl_supp_disj
· rw [RegularSupport.def]
exact interior_subset
· rfl
· rw [<-g_eq_g']
exact Disjoint.closure_left supp_disj (support_isOpen _)
}
intro h_in_centralizer
by_contra h_notin_rist
simp at h_notin_rist
rw [rigidStabilizer_support] at h_notin_rist
let ⟨V, V_in_supp_h, V_nonempty, V_open, V_disj_supp_f⟩ := open_set_from_supp_not_subset_rsupp h_notin_rist
let ⟨v, v_in_V⟩ := V_nonempty
have v_moved := V_in_supp_h v_in_V
rw [mem_support] at v_moved
have ⟨W, W_open, v_in_W, W_subset_support, disj_W_img⟩ := disjoint_nbhd_in V_open v_in_V v_moved
have mono_exp := lemma_2_2 G W_open (Set.nonempty_of_mem v_in_W)
let ⟨⟨g, g_in_rist⟩, g12_ne_one⟩ := nontrivial_pow_from_exponent_eq_zero mono_exp 12 (by norm_num)
simp at g12_ne_one
have disj_supports : Disjoint (Support α f) (Support α g) := by
apply Set.disjoint_of_subset_right
· apply rigidStabilizer_support.mp
exact g_in_rist
· apply Set.disjoint_of_subset_right
· exact W_subset_support
· exact V_disj_supp_f.symm
have alg_disj_f_g := proposition_1_1_1 _ _ disj_supports
have g12_in_algebraic_subgroup : g^12 ∈ AlgebraicSubgroup f := by
simp [AlgebraicSubgroup]
use g
constructor
exact ↑alg_disj_f_g
rfl
have h_nc_g12 : ¬Commute (g^12) h := by
have supp_g12_sub_W : Support α (g^12) ⊆ W := by
rw [rigidStabilizer_support] at g_in_rist
calc
Support α (g^12) ⊆ Support α g := by apply support_pow
_ ⊆ W := g_in_rist
have supp_g12_disj_hW : Disjoint (Support α (g^12)) (h •'' W) := by
apply Set.disjoint_of_subset_left
swap
· exact disj_W_img
· exact supp_g12_sub_W
exact not_commute_of_disj_support_smulImage
g12_ne_one
supp_g12_sub_W
supp_g12_disj_hW
apply h_nc_g12
exact h_in_centralizer _ g12_in_algebraic_subgroup
-- Small lemma for remark 2.3
theorem rigidStabilizer_inter_bot_iff_regularSupport_disj {G α : Type _}
[Group G] [TopologicalSpace α] [MulAction G α] [ContinuousConstSMul G α] [LocallyMoving G α] [FaithfulSMul G α]
{f g : G} :
G•[RegularSupport α f] ⊓ G•[RegularSupport α g] = ⊥
↔ Disjoint (RegularSupport α f) (RegularSupport α g) :=
by
rw [<-rigidStabilizer_inter]
constructor
{
intro rist_disj
by_contra rsupp_not_disj
rw [Set.not_disjoint_iff] at rsupp_not_disj
let ⟨x, x_in_rsupp_f, x_in_rsupp_g⟩ := rsupp_not_disj
have rsupp_open: IsOpen (RegularSupport α f ∩ RegularSupport α g) := by
apply IsOpen.inter <;> exact regularSupport_open _ _
-- The contradiction occurs by applying the definition of LocallyMoving:
apply LocallyMoving.locally_moving (G := G) _ rsupp_open _ rist_disj
exact ⟨x, x_in_rsupp_f, x_in_rsupp_g⟩
}
{
intro rsupp_disj
rw [Set.disjoint_iff_inter_eq_empty] at rsupp_disj
rw [rsupp_disj]
by_contra rist_ne_bot
rw [<-ne_eq, Subgroup.ne_bot_iff_exists_ne_one] at rist_ne_bot
let ⟨⟨h, h_in_rist⟩, h_ne_one⟩ := rist_ne_bot
simp at h_ne_one
apply h_ne_one
rw [rigidStabilizer_empty] at h_in_rist
rw [Subgroup.mem_bot] at h_in_rist
exact h_in_rist
}
variable {G α : Type _}
variable [Group G]
variable [TopologicalSpace α] [T2Space α]
variable [MulAction G α] [ContinuousConstSMul G α] [FaithfulSMul G α] [LocallyMoving G α]
/--
This demonstrates that the disjointness of the supports of two elements `f` and `g`
can be proven without knowing anything about how `f` and `g` act on `α`
(bar the more global properties of the group action).
We could prove that the intersection of the algebraic centralizers of `f` and `g` is trivial
purely within group theory, and then apply this theorem to know that their support
in `α` will be disjoint.
--/
lemma remark_2_3 {f g : G} :
(AlgebraicCentralizer f) ⊓ (AlgebraicCentralizer g) = ⊥ → Disjoint (Support α f) (Support α g) :=
by
intro alg_disj
rw [disjoint_interiorClosure_iff (support_isOpen _) (support_isOpen _)]
simp
repeat rw [<-RegularSupport.def]
rw [<-rigidStabilizer_inter_bot_iff_regularSupport_disj]
repeat rw [<-proposition_2_1]
exact alg_disj
-- lemma remark_2_3' {f g : G} :
-- (AlgebraicCentralizer f) ⊓ (AlgebraicCentralizer g) ≠ ⊥ →
-- Set.Nonempty ((RegularSupport α f) ∩ (RegularSupport α g)) :=
-- by
-- intro alg_inter_neBot
-- repeat rw [proposition_2_1 (α := α)] at alg_inter_neBot
-- rw [ne_eq] at alg_inter_neBot
-- rw [rigidStabilizer_inter_bot_iff_regularSupport_disj] at alg_inter_neBot
-- rw [Set.not_disjoint_iff_nonempty_inter] at alg_inter_neBot
-- exact alg_inter_neBot
lemma rigidStabilizer_inter_eq_algebraicCentralizerInter {S : Finset G} :
G•[RegularSupport.FiniteInter α S] = AlgebraicCentralizerInter S :=
by
unfold RegularSupport.FiniteInter
unfold AlgebraicCentralizerInter
rw [rigidStabilizer_iInter_regularSupport']
simp only [<-proposition_2_1]
lemma regularSupportInter_nonEmpty_iff_neBot {S : Finset G} [Nonempty α]:
AlgebraicCentralizerInter S ≠ ⊥ ↔
Set.Nonempty (RegularSupport.FiniteInter α S) :=
by
constructor
· rw [<-rigidStabilizer_inter_eq_algebraicCentralizerInter (α := α), ne_eq]
intro rist_neBot
by_contra eq_empty
rw [Set.not_nonempty_iff_eq_empty] at eq_empty
rw [eq_empty, rigidStabilizer_empty] at rist_neBot
exact rist_neBot rfl
· intro nonempty
intro eq_bot
rw [<-rigidStabilizer_inter_eq_algebraicCentralizerInter (α := α)] at eq_bot
rw [<-rigidStabilizer_empty (G := G) (α := α), rigidStabilizer_eq_iff] at eq_bot
· rw [eq_bot, Set.nonempty_iff_ne_empty] at nonempty
exact nonempty rfl
· apply RegularSupport.FiniteInter_regular
· simp
theorem AlgebraicCentralizerBasis.exists_rigidStabilizer_inv (H : Set G) [Nonempty α]:
∃ S,
(H ∈ AlgebraicCentralizerBasis G → S ∈ RegularSupportBasis G α ∧ H = G•[S])
∧ (H ∉ AlgebraicCentralizerBasis G → S = ∅) :=
by
by_cases H_in_basis?: H ∈ AlgebraicCentralizerBasis G
swap
{
use ∅
constructor
tauto
intro _
rfl
}
have ⟨H_ne_one, ⟨seed, H_eq⟩⟩ := (AlgebraicCentralizerBasis.mem_iff H).mp H_in_basis?
rw [H_eq, <-Subgroup.coe_bot, ne_eq, SetLike.coe_set_eq, <-ne_eq] at H_ne_one
use RegularSupport.FiniteInter α seed
constructor
· intro _
rw [RegularSupportBasis.mem_iff]
repeat' apply And.intro
· rw [<-regularSupportInter_nonEmpty_iff_neBot]
exact H_ne_one
· use seed
· rw [rigidStabilizer_inter_eq_algebraicCentralizerInter]
exact H_eq
· tauto
theorem AlgebraicCentralizerBasis.mem_of_regularSupportBasis {S : Set α}
(S_in_basis : S ∈ RegularSupportBasis G α) :
(G•[S] : Set G) ∈ AlgebraicCentralizerBasis G :=
by
rw [AlgebraicCentralizerBasis.subgroup_mem_iff]
rw [RegularSupportBasis.mem_iff] at S_in_basis
let ⟨S_nonempty, ⟨seed, S_eq⟩⟩ := S_in_basis
have α_nonempty : Nonempty α := by
by_contra α_empty
rw [not_nonempty_iff] at α_empty
rw [Set.nonempty_iff_ne_empty] at S_nonempty
apply S_nonempty
exact Set.eq_empty_of_isEmpty S
constructor
· rw [S_eq, rigidStabilizer_inter_eq_algebraicCentralizerInter]
rw [regularSupportInter_nonEmpty_iff_neBot (α := α)]
rw [<-S_eq]
exact S_nonempty
· use seed
rw [S_eq]
exact rigidStabilizer_inter_eq_algebraicCentralizerInter
@[simp]
theorem AlgebraicCentralizerBasis.eq_rist_image [Nonempty α]:
(fun S => (G•[S] : Set G)) '' RegularSupportBasis G α = AlgebraicCentralizerBasis G :=
by
ext H
constructor
· simp
intro S S_in_basis H_eq
rw [<-H_eq]
apply mem_of_regularSupportBasis S_in_basis
· intro H_in_basis
simp
let ⟨S, ⟨S_props, _⟩⟩ := AlgebraicCentralizerBasis.exists_rigidStabilizer_inv (α := α) H
let ⟨S_in_basis, H_eq⟩ := S_props H_in_basis
symm at H_eq
use S
noncomputable def rigidStabilizer_inv [Nonempty α] (H : Set G) : Set α :=
(AlgebraicCentralizerBasis.exists_rigidStabilizer_inv H).choose
theorem rigidStabilizer_inv_eq [Nonempty α] {H : Set G} (H_in_basis : H ∈ AlgebraicCentralizerBasis G) :
H = G•[rigidStabilizer_inv (α := α) H] :=
by
have spec := (AlgebraicCentralizerBasis.exists_rigidStabilizer_inv (α := α) H).choose_spec
exact (spec.left H_in_basis).right
theorem rigidStabilizer_inv_in_basis [Nonempty α] (H : Set G) :
H ∈ AlgebraicCentralizerBasis G ↔ rigidStabilizer_inv (α := α) H ∈ RegularSupportBasis G α :=
by
have spec := (AlgebraicCentralizerBasis.exists_rigidStabilizer_inv (α := α) H).choose_spec
constructor
· intro H_in_basis
exact (spec.left H_in_basis).left
· intro iH_in_basis
by_contra H_notin_basis
unfold rigidStabilizer_inv at iH_in_basis
rw [(spec.right H_notin_basis)] at iH_in_basis
exact RegularSupportBasis.empty_not_mem G α iH_in_basis
theorem rigidStabilizer_inv_eq' [Nonempty α] {S : Set α} (S_in_basis : S ∈ RegularSupportBasis G α) :
rigidStabilizer_inv (α := α) (G := G) G•[S] = S :=
by
have GS_in_basis : (G•[S] : Set G) ∈ AlgebraicCentralizerBasis G := by
exact AlgebraicCentralizerBasis.mem_of_regularSupportBasis S_in_basis
have eq := rigidStabilizer_inv_eq GS_in_basis (α := α)
rw [SetLike.coe_set_eq, rigidStabilizer_eq_iff] at eq
· exact eq.symm
· exact RegularSupportBasis.regular S_in_basis
· exact RegularSupportBasis.regular ((rigidStabilizer_inv_in_basis _).mp GS_in_basis)
variable [Nonempty α] [HasNoIsolatedPoints α] [LocallyDense G α]
noncomputable def RigidStabilizer.order_iso_on (G α : Type _) [Group G] [Nonempty α] [TopologicalSpace α] [T2Space α]
[MulAction G α] [ContinuousConstSMul G α] [FaithfulSMul G α]
[HasNoIsolatedPoints α] [LocallyDense G α] : OrderIsoOn (Set α) (Set G) (RegularSupportBasis G α)
where
toFun := fun S => G•[S]
invFun := fun H => rigidStabilizer_inv (α := α) H
leftInv_on := by
intro S S_in_basis
simp
exact rigidStabilizer_inv_eq' S_in_basis
rightInv_on := by
intro H H_in_basis
simp
simp at H_in_basis
symm
exact rigidStabilizer_inv_eq H_in_basis
toFun_doubleMonotone := by
intro S S_in_basis T T_in_basis
simp
apply rigidStabilizer_subset_iff G (RegularSupportBasis.regular S_in_basis) (RegularSupportBasis.regular T_in_basis)
@[simp]
theorem RigidStabilizer.order_iso_on_toFun:
(RigidStabilizer.order_iso_on G α).toFun = (fun S => (G•[S] : Set G)) :=
by
simp [order_iso_on]
@[simp]
theorem RigidStabilizer.order_iso_on_invFun:
(RigidStabilizer.order_iso_on G α).invFun = (fun S => rigidStabilizer_inv (α := α) S) :=
by
simp [order_iso_on]
noncomputable def RigidStabilizer.inv_order_iso_on (G α : Type _) [Group G] [Nonempty α] [TopologicalSpace α] [T2Space α]
[MulAction G α] [ContinuousConstSMul G α] [FaithfulSMul G α]
[HasNoIsolatedPoints α] [LocallyDense G α] : OrderIsoOn (Set G) (Set α) (AlgebraicCentralizerBasis G) :=
(RigidStabilizer.order_iso_on G α).inv.mk_of_subset
(subset_of_eq (AlgebraicCentralizerBasis.eq_rist_image (α := α) (G := G)).symm)
@[simp]
theorem RigidStabilizer.inv_order_iso_on_toFun:
(RigidStabilizer.inv_order_iso_on G α).toFun = (fun S => rigidStabilizer_inv (α := α) S) :=
by
simp [inv_order_iso_on, order_iso_on]
@[simp]
theorem RigidStabilizer.inv_order_iso_on_invFun:
(RigidStabilizer.inv_order_iso_on G α).invFun = (fun S => (G•[S] : Set G)) :=
by
simp [inv_order_iso_on, order_iso_on]
-- TODO: mark simp theorems as local
@[simp]
theorem RegularSupportBasis.eq_inv_rist_image:
(fun H => rigidStabilizer_inv (α := α) H) '' AlgebraicCentralizerBasis G = RegularSupportBasis G α :=
by
rw [<-AlgebraicCentralizerBasis.eq_rist_image (α := α) (G := G)]
rw [Set.image_image]
nth_rw 2 [<-OrderIsoOn.leftInv_image (RigidStabilizer.order_iso_on G α)]
rw [Function.comp_def]
rw [RigidStabilizer.order_iso_on]
lemma RigidStabilizer_doubleMonotone : DoubleMonotoneOn (fun S => G•[S]) (RegularSupportBasis G α) := by
have res := (RigidStabilizer.order_iso_on G α).toFun_doubleMonotone
simp at res
exact res
lemma RigidStabilizer_inv_doubleMonotone : DoubleMonotoneOn (fun S => rigidStabilizer_inv (α := α) S) (AlgebraicCentralizerBasis G) := by
have res := (RigidStabilizer.order_iso_on G α).invFun_doubleMonotone
simp at res
exact res
lemma RigidStabilizer_rightInv {U : Set G} (U_in_basis : U ∈ AlgebraicCentralizerBasis G) :
G•[rigidStabilizer_inv (α := α) U] = U :=
by
have res := (RigidStabilizer.order_iso_on G α).rightInv_on U
simp at res
exact res U_in_basis
lemma RigidStabilizer_leftInv {U : Set α} (U_in_basis : U ∈ RegularSupportBasis G α) :
rigidStabilizer_inv (α := α) (G•[U] : Set G) = U :=
by
have res := (RigidStabilizer.order_iso_on G α).leftInv_on U
simp at res
exact res U_in_basis
theorem rigidStabilizer_subset_iff_subset_inv [Nonempty α] {S : Set α} (S_in_basis : S ∈ RegularSupportBasis G α) {T : Set G} (T_in_basis : T ∈ AlgebraicCentralizerBasis G):
(G•[S] : Set G) ⊆ T ↔ S ⊆ rigidStabilizer_inv T :=
by
nth_rw 1 [<-RigidStabilizer_rightInv (α := α) T_in_basis]
rw [SetLike.coe_subset_coe]
rw [rigidStabilizer_subset_iff (G := G)]
· exact RegularSupportBasis.regular S_in_basis
· apply RegularSupportBasis.regular (G := G)
rw [<-rigidStabilizer_inv_in_basis T]
assumption
theorem subset_rigidStabilizer_iff_inv_subset [Nonempty α] {S : Set G} (S_in_basis : S ∈ AlgebraicCentralizerBasis G) {T : Set α} (T_in_basis : T ∈ RegularSupportBasis G α):
S ⊆ (G•[T] : Set G) ↔ rigidStabilizer_inv S ⊆ T :=
by
nth_rw 1 [<-RigidStabilizer_rightInv (α := α) S_in_basis]
rw [SetLike.coe_subset_coe]
rw [rigidStabilizer_subset_iff (G := G)]
· apply RegularSupportBasis.regular (G := G)
rw [<-rigidStabilizer_inv_in_basis S]
assumption
· exact RegularSupportBasis.regular T_in_basis
theorem rigidStabilizer_inv_smulImage [Nonempty α] {S : Set G} (S_in_basis : S ∈ AlgebraicCentralizerBasis G) (h : G) :
h •'' rigidStabilizer_inv S = rigidStabilizer_inv (α := α) ((fun g => h * g * h⁻¹) '' S) :=
by
rw [smulImage_inv]
rw [<-rigidStabilizer_eq_iff (G := G)]
swap
{
apply RegularSupportBasis.regular (G := G)
rw [<-rigidStabilizer_inv_in_basis S]
exact S_in_basis
}
swap
{
rw [<-smulImage_regular]
apply RegularSupportBasis.regular (G := G)
rw [<-rigidStabilizer_inv_in_basis]
apply AlgebraicCentralizerBasis.conj_mem
assumption
}
rw [<-SetLike.coe_set_eq]
rw [<-rigidStabilizer_conj_image_eq]
repeat rw [RigidStabilizer_rightInv]
· rw [Set.image_image]
group
simp
· apply AlgebraicCentralizerBasis.conj_mem
assumption
· assumption
end RegularSupport
section HomeoGroup
open Topology
variable {G α : Type _} [Group G] [TopologicalSpace α] [T2Space α]
variable [MulAction G α] [ContinuousConstSMul G α] [FaithfulSMul G α] [LocallyMoving G α]
theorem exists_compact_closure_of_le_nhds {α : Type _} [TopologicalSpace α] [T2Space α] [LocallyCompactSpace α] (F : Filter α):
(∃ p : α, F ≤ 𝓝 p) → ∃ S ∈ F, IsCompact (closure S) :=
by
intro ⟨p, p_le_nhds⟩
have ⟨S, S_in_nhds, S_compact⟩ := (compact_basis_nhds p).ex_mem
use S
constructor
exact p_le_nhds S_in_nhds
rw [IsClosed.closure_eq S_compact.isClosed]
exact S_compact
theorem clusterPt_of_exists_compact_closure {α : Type _} [TopologicalSpace α] [T2Space α] [LocallyCompactSpace α] (F : Filter α) [Filter.NeBot F]:
(∃ S ∈ F, IsCompact (closure S)) → ∃ p : α, ClusterPt p F :=
by
intro ⟨S, S_in_F, clS_compact⟩
have F_le_principal_S : F ≤ Filter.principal (closure S) := by
rw [Filter.le_principal_iff]
apply Filter.sets_of_superset
exact S_in_F
exact subset_closure
let ⟨x, _, F_clusterPt⟩ := clS_compact F_le_principal_S
use x
theorem proposition_3_4_2 {α : Type _} [TopologicalSpace α] [T2Space α] [LocallyCompactSpace α] (F : Ultrafilter α):
(∃ p : α, ClusterPt p F) ↔ ∃ S ∈ F, IsCompact (closure S) :=
by
constructor
· simp only [Ultrafilter.clusterPt_iff, <-Ultrafilter.mem_coe]
exact exists_compact_closure_of_le_nhds (F : Filter α)
· exact clusterPt_of_exists_compact_closure (F : Filter α)
end HomeoGroup
section Ultrafilter
variable {G α : Type _}
variable [Group G]
variable [TopologicalSpace α] [T2Space α]
variable [MulAction G α] [ContinuousConstSMul G α] [FaithfulSMul G α] [LocallyMoving G α]
def RSuppSubsets (G : Type _) {α : Type _} [Group G] [TopologicalSpace α] [MulAction G α] (V : Set α) : Set (Set α) :=
{W ∈ RegularSupportBasis G α | W ⊆ V}
def RSuppOrbit {G α : Type _} [Group G] [TopologicalSpace α] [MulAction G α] (F : Filter α) (H : Subgroup G) : Set (Set α) :=
{ g •'' W | (g ∈ H) (W ∈ F) }
lemma moving_elem_of_open_subset_closure_orbit {U V : Set α} (U_open : IsOpen U) (U_nonempty : Set.Nonempty U)
{p : α} (U_ss_clOrbit : U ⊆ closure (MulAction.orbit G•[V] p)) :
∃ h : G, h ∈ G•[V] ∧ h • p ∈ U :=
by
have p_in_orbit : p ∈ MulAction.orbit G•[V] p := by simp
have ⟨q, ⟨q_in_U, q_in_orbit⟩⟩ := inter_of_open_subset_of_closure
U_open U_nonempty ⟨p, p_in_orbit⟩ U_ss_clOrbit
rw [MulAction.mem_orbit_iff] at q_in_orbit
let ⟨⟨h, h_in_orbit⟩, hq_eq_p⟩ := q_in_orbit
simp at hq_eq_p
use h
constructor
assumption
rw [hq_eq_p]
assumption
lemma compact_subset_of_rsupp_basis (G : Type _) {α : Type _}
[Group G] [TopologicalSpace α] [T2Space α]
[MulAction G α] [ContinuousConstSMul G α]
[LocallyCompactSpace α] [HasNoIsolatedPoints α] [LocallyDense G α]
{U : Set α} (U_in_basis : U ∈ RegularSupportBasis G α):
∃ V : RegularSupportBasis G α, (closure V.val) ⊆ U ∧ IsCompact (closure V.val) :=
by
let ⟨⟨x, x_in_U⟩, _⟩ := (RegularSupportBasis.mem_iff U).mp U_in_basis
have U_regular : Regular U := RegularSupportBasis.regular U_in_basis
let ⟨W, W_compact, x_in_intW, W_ss_U⟩ := exists_compact_subset U_regular.isOpen x_in_U
have ⟨V, V_in_basis, _, V_ss_intW⟩ := (RegularSupportBasis.isBasis G α).exists_subset_of_mem_open x_in_intW isOpen_interior
have clV_ss_W : closure V ⊆ W := by
calc
closure V ⊆ closure (interior W) := by
apply closure_mono
exact V_ss_intW
_ ⊆ closure W := by
apply closure_mono
exact interior_subset
_ = W := by
apply IsClosed.closure_eq
exact W_compact.isClosed
use ⟨V, V_in_basis⟩
simp
constructor
· exact subset_trans clV_ss_W W_ss_U
· exact IsCompact.of_isClosed_subset W_compact isClosed_closure clV_ss_W
variable [LocallyDense G α] [LocallyCompactSpace α] [HasNoIsolatedPoints α]
lemma proposition_3_5_1
{U : Set α} (U_in_basis : U ∈ RegularSupportBasis G α) (F: Filter α):
(∃ p ∈ U, F ≤ nhds p)
→ ∃ V : RegularSupportBasis G α, V.val ⊆ U ∧ RSuppSubsets G V.val ⊆ RSuppOrbit F G•[U] :=
by
simp
intro p p_in_U F_le_nhds_p
have U_regular : Regular U := RegularSupportBasis.regular U_in_basis
-- First, get a neighborhood of p that is a subset of the closure of the orbit of G_U
have clOrbit_in_nhds := LocallyDense.rigidStabilizer_in_nhds G α U_regular.isOpen p_in_U
rw [mem_nhds_iff] at clOrbit_in_nhds
let ⟨V, V_ss_clOrbit, V_open, p_in_V⟩ := clOrbit_in_nhds
clear clOrbit_in_nhds
-- Then, get a nontrivial element from that set
let ⟨g, g_in_rist, g_ne_one⟩ := LocallyMoving.get_nontrivial_rist_elem (G := G) V_open ⟨p, p_in_V⟩
have V_ss_clU : V ⊆ closure U := by
apply subset_trans
exact V_ss_clOrbit
apply closure_mono
exact orbit_rigidStabilizer_subset p_in_U
-- The regular support of g is within U
have rsupp_ss_U : RegularSupport α g ⊆ U := by
rw [RegularSupport]
rw [rigidStabilizer_support] at g_in_rist
calc
InteriorClosure (Support α g) ⊆ InteriorClosure V := by
apply interiorClosure_mono
assumption
_ ⊆ InteriorClosure (closure U) := by
apply interiorClosure_mono
assumption
_ ⊆ InteriorClosure U := by
simp
rfl
_ ⊆ _ := by
apply subset_of_eq
exact U_regular
let T := RegularSupportBasis.fromSingleton (α := α) g g_ne_one
have T_eq : T.val = RegularSupport α g := by
unfold_let
rw [RegularSupportBasis.fromSingleton_val]
use T.val
repeat' apply And.intro
· -- This statement is equivalent to rsupp(g) ⊆ U
rw [T_eq]
exact rsupp_ss_U
· exact T.prop.left
· exact T.prop.right
· intro W W_in_subsets
simp [RSuppSubsets, T_eq] at W_in_subsets
let ⟨W_in_basis, W_ss_W⟩ := W_in_subsets
unfold RSuppOrbit
simp
-- We have that W is a subset of the closure of the orbit of G_U
have W_ss_clOrbit : W ⊆ closure (MulAction.orbit G•[U] p) := by
rw [rigidStabilizer_support] at g_in_rist
calc
W ⊆ RegularSupport α g := by assumption
_ ⊆ closure (Support α g) := regularSupport_subset_closure_support
_ ⊆ closure V := by
apply closure_mono
assumption
_ ⊆ _ := by
rw [<-closure_closure (s := MulAction.orbit _ _)]
apply closure_mono
assumption
let ⟨W_nonempty, ⟨W_seed, W_eq⟩⟩ := W_in_basis
have W_regular := RegularSupportBasis.regular W_in_basis
-- So we can get an element `h` such that `h • p ∈ W` and `h ∈ G_U`
let ⟨h, h_in_rist, hp_in_W⟩ := moving_elem_of_open_subset_closure_orbit W_regular.isOpen W_nonempty W_ss_clOrbit
use h
constructor
exact h_in_rist
use h⁻¹ •'' W
constructor
swap
{
rw [smulImage_mul]
simp
}
-- We just need to show that h⁻¹ •'' W ∈ F, that is, h⁻¹ •'' W ∈ 𝓝 p
apply F_le_nhds_p
have basis := (RegularSupportBasis.isBasis G α).nhds_hasBasis (a := p)
rw [basis.mem_iff]
use h⁻¹ •'' W
repeat' apply And.intro
· rw [smulImage_nonempty]
assumption
· simp only [smulImage_inv, inv_inv]
have dec_eq : DecidableEq G := Classical.typeDecidableEq G
use Finset.image (fun g => h⁻¹ * g * h) W_seed
rw [<-RegularSupport.FiniteInter_conj, Finset.image_image]
have fn_eq_id : (fun g => h * g * h⁻¹) ∘ (fun g => h⁻¹ * g * h) = id := by
ext x
simp
group
rw [fn_eq_id, Finset.image_id]
exact W_eq
· rw [mem_smulImage, inv_inv]
exact hp_in_W
· exact Eq.subset rfl
theorem proposition_3_5_2
{U : Set α} (F: Filter α) [Filter.NeBot F]:
(∃ V : RegularSupportBasis G α, V.val ⊆ U ∧ RSuppSubsets G V.val ⊆ RSuppOrbit F G•[U]) → ∃ p ∈ U, ClusterPt p F :=
by
intro ⟨⟨V, V_in_basis⟩, ⟨V_ss_U, subsets_ss_orbit⟩⟩
simp only at V_ss_U
simp only at subsets_ss_orbit
-- Obtain a compact subset of V' in the basis
let ⟨V', clV'_ss_V, clV'_compact⟩ := compact_subset_of_rsupp_basis G V_in_basis
have V'_in_subsets : V'.val ∈ RSuppSubsets G V := by
unfold RSuppSubsets
simp
exact subset_trans subset_closure clV'_ss_V
-- V' is in the orbit, so there exists a value `g ∈ G_U` such that `gV ∈ F`
-- Note that with the way we set up the equations, we obtain `g⁻¹`
have V'_in_orbit := subsets_ss_orbit V'_in_subsets
simp [RSuppOrbit] at V'_in_orbit
let ⟨g, g_in_rist, ⟨W, W_in_F, gW_eq_V⟩⟩ := V'_in_orbit
have gV'_in_F : g⁻¹ •'' V' ∈ F := by
rw [smulImage_inv] at gW_eq_V
rw [<-gW_eq_V]
assumption
have gV'_compact : IsCompact (closure (g⁻¹ •'' V'.val)) := by
rw [smulImage_closure]
apply smulImage_compact
assumption
have ⟨p, p_lim⟩ := clusterPt_of_exists_compact_closure _ ⟨g⁻¹ •'' V'.val, ⟨gV'_in_F, gV'_compact⟩⟩
use p
constructor
swap
assumption
rw [clusterPt_iff_forall_mem_closure] at p_lim
specialize p_lim (g⁻¹ •'' V') gV'_in_F
rw [smulImage_closure, mem_smulImage, inv_inv] at p_lim
rw [rigidStabilizer_support, <-support_inv] at g_in_rist
rw [<-fixed_smulImage_in_support g⁻¹ g_in_rist]
rw [mem_smulImage, inv_inv]
apply V_ss_U
apply clV'_ss_V
exact p_lim
/--
# Proposition 3.5
This proposition gives an alternative definition for an ultrafilter to converge within a set `U`.
This alternative definition should be reconstructible entirely from the algebraic structure of `G`.
--/
theorem proposition_3_5 {U : Set α} (U_in_basis : U ∈ RegularSupportBasis G α) (F: Ultrafilter α):
(∃ p ∈ U, ClusterPt p F)
↔ ∃ V : RegularSupportBasis G α, V.val ⊆ U ∧ RSuppSubsets G V.val ⊆ RSuppOrbit F G•[U] :=
by
constructor
· simp only [Ultrafilter.clusterPt_iff]
exact proposition_3_5_1 U_in_basis (F : Filter α)
· exact proposition_3_5_2 (F : Filter α)
theorem proposition_3_5' {U : Set α} (U_in_basis : U ∈ RegularSupportBasis G α)
(F : UltrafilterInBasis (RegularSupportBasis G α)):
(∃ p ∈ U, F ≤ nhds p)
↔ ∃ V ∈ RegularSupportBasis G α, V ⊆ U ∧ RSuppSubsets G V ⊆ RSuppOrbit F G•[U] :=
by
constructor
· intro ex_p
let ⟨⟨V, V_in_basis⟩, V_ss_U, subsets_ss_orbit⟩ := proposition_3_5_1 U_in_basis (F : Filter α) ex_p
exact ⟨V, V_in_basis, V_ss_U, subsets_ss_orbit⟩
· intro ⟨V, V_in_basis, V_ss_U, subsets_ss_orbit⟩
simp only [
<-F.clusterPt_iff_le_nhds
(RegularSupportBasis.isBasis G α)
(RegularSupportBasis.closed_inter G α)
]
exact proposition_3_5_2 (F : Filter α) ⟨⟨V, V_in_basis⟩, V_ss_U, subsets_ss_orbit⟩
end Ultrafilter
section RubinFilter
variable {G : Type _} [Group G]
variable {α : Type _} [Nonempty α] [TopologicalSpace α] [HasNoIsolatedPoints α] [T2Space α] [LocallyCompactSpace α]
variable [MulAction G α] [ContinuousConstSMul G α] [FaithfulSMul G α] [LocallyDense G α]
def AlgebraicSubsets (V : Set G) : Set (Set G) :=
{W ∈ AlgebraicCentralizerBasis G | W ⊆ V}
def AlgebraicOrbit (F : Filter G) (U : Set G) : Set (Set G) :=
{ (fun h => g * h * g⁻¹) '' W | (g ∈ U) (W ∈ F.sets ∩ AlgebraicCentralizerBasis G) }
theorem AlgebraicOrbit.mem_iff (F : Filter G) (U : Set G) (S : Set G):
S ∈ AlgebraicOrbit F U ↔ ∃ g ∈ U, ∃ W ∈ F, W ∈ AlgebraicCentralizerBasis G ∧ S = (fun h => g * h * g⁻¹) '' W :=
by
simp [AlgebraicOrbit]
simp only [and_assoc, eq_comm]
def AlgebraicConvergent {G : Type _} [Group G]
(F : Filter G)
(U : Set G) : Prop :=
∃ V ∈ AlgebraicCentralizerBasis G, V ⊆ U ∧ AlgebraicSubsets V ⊆ AlgebraicOrbit F U
structure RubinFilter (G : Type _) [Group G] :=
filter : UltrafilterInBasis (AlgebraicCentralizerBasis G)
converges : AlgebraicConvergent filter.filter Set.univ
lemma RegularSupportBasis.empty_not_mem' : ∅ ∉ (RigidStabilizer.inv_order_iso_on G α).toFun '' AlgebraicCentralizerBasis G := by
simp
exact RegularSupportBasis.empty_not_mem _ _
lemma AlgebraicCentralizerBasis.empty_not_mem' : ∅ ∉ (RigidStabilizer.order_iso_on G α).toFun '' RegularSupportBasis G α := by
unfold RigidStabilizer.order_iso_on
rw [AlgebraicCentralizerBasis.eq_rist_image]
exact AlgebraicCentralizerBasis.empty_not_mem
def RubinFilter.map (F : RubinFilter G) (α : Type _)
[TopologicalSpace α] [T2Space α] [Nonempty α] [HasNoIsolatedPoints α]
[MulAction G α] [ContinuousConstSMul G α] [FaithfulSMul G α] [LocallyDense G α] : UltrafilterInBasis (RegularSupportBasis G α) :=
(
F.filter.map_basis
AlgebraicCentralizerBasis.empty_not_mem
(RigidStabilizer.inv_order_iso_on G α)
RegularSupportBasis.empty_not_mem'
).cast (by simp)
def IsRubinFilterOf (A : UltrafilterInBasis (RegularSupportBasis G α)) (B : UltrafilterInBasis (AlgebraicCentralizerBasis G)) : Prop :=
∀ U ∈ RegularSupportBasis G α, U ∈ A ↔ (G•[U] : Set G) ∈ B
theorem RubinFilter.map_isRubinFilterOf (F : RubinFilter G) :
IsRubinFilterOf (F.map α) F.filter :=
by
intro U U_in_basis
unfold map
simp
have ⟨U', U'_in_basis, U'_eq⟩ := (RegularSupportBasis.eq_inv_rist_image (G := G) (α := α)).symm ▸ U_in_basis
simp only at U'_eq
rw [<-U'_eq]
rw [Filter.InBasis.map_mem_map_basis_of_basis_set _ RigidStabilizer_inv_doubleMonotone F.filter.in_basis U'_in_basis]
rw [RigidStabilizer_rightInv U'_in_basis]
rfl
theorem RubinFilter.from_isRubinFilterOf' (F : UltrafilterInBasis (RegularSupportBasis G α)) :
IsRubinFilterOf F ((F.map_basis
(RegularSupportBasis.empty_not_mem G α)
(RigidStabilizer.order_iso_on G α)
AlgebraicCentralizerBasis.empty_not_mem'
).cast (by simp)) :=
by
intro U U_in_basis
simp
rw [Filter.InBasis.map_mem_map_basis_of_basis_set _ RigidStabilizer_doubleMonotone F.in_basis U_in_basis]
rfl
theorem IsRubinFilterOf.mem_inv {A : UltrafilterInBasis (RegularSupportBasis G α)}
{B : UltrafilterInBasis (AlgebraicCentralizerBasis G)}
(filter_of : IsRubinFilterOf A B) {U : Set G} (U_in_basis : U ∈ AlgebraicCentralizerBasis G):
U ∈ B ↔ rigidStabilizer_inv U ∈ A :=
by
rw [<-AlgebraicCentralizerBasis.eq_rist_image (α := α)] at U_in_basis
let ⟨V, V_in_basis, V_eq⟩ := U_in_basis
rw [<-V_eq, RigidStabilizer_leftInv V_in_basis]
symm
exact filter_of V V_in_basis
theorem IsRubinFilterOf.mem_inter_inv {A : UltrafilterInBasis (RegularSupportBasis G α)}
{B : UltrafilterInBasis (AlgebraicCentralizerBasis G)}
(filter_of : IsRubinFilterOf A B) (U : Set G):
U ∈ B.filter.sets ∩ AlgebraicCentralizerBasis G ↔ rigidStabilizer_inv U ∈ A.filter.sets ∩ RegularSupportBasis G α :=
by
constructor
· intro ⟨U_in_filter, U_in_basis⟩
constructor
simp
rw [<-filter_of.mem_inv U_in_basis]
exact U_in_filter
rw [<-rigidStabilizer_inv_in_basis]
assumption
· intro ⟨iU_in_filter, U_in_basis⟩
rw [<-rigidStabilizer_inv_in_basis] at U_in_basis
constructor
· simp
rw [filter_of.mem_inv U_in_basis]
exact iU_in_filter
· assumption
theorem IsRubinFilterOf.subsets_ss_orbit {A : UltrafilterInBasis (RegularSupportBasis G α)}
{B : UltrafilterInBasis (AlgebraicCentralizerBasis G)}
(filter_of : IsRubinFilterOf A B)
{V : Set α} -- (V_in_basis : V ∈ RegularSupportBasis G α)
{W : Set α} (W_in_basis : W ∈ RegularSupportBasis G α) :
RSuppSubsets G W ⊆ RSuppOrbit A G•[V] ↔ AlgebraicSubsets (G•[W]) ⊆ AlgebraicOrbit B.filter G•[V] :=
by
have dec_eq : DecidableEq G := Classical.typeDecidableEq _
constructor
· intro rsupp_ss
unfold AlgebraicSubsets AlgebraicOrbit
intro U ⟨U_in_basis, U_ss_GW⟩
let U' := rigidStabilizer_inv (α := α) U
have U'_in_basis : U' ∈ RegularSupportBasis G α := (rigidStabilizer_inv_in_basis U).mp U_in_basis
have U'_ss_W : U' ⊆ W := by
rw [subset_rigidStabilizer_iff_inv_subset U_in_basis W_in_basis] at U_ss_GW
exact U_ss_GW
let ⟨g, g_in_GV, ⟨W, W_in_A, gW_eq_U⟩⟩ := rsupp_ss ⟨U'_in_basis, U'_ss_W⟩
use g
constructor
{
simp
exact g_in_GV
}
have W_in_basis : W ∈ RegularSupportBasis G α := by
rw [smulImage_inv] at gW_eq_U
rw [gW_eq_U]
apply RegularSupportBasis.smulImage_in_basis
assumption
use G•[W]
rw [filter_of.mem_inter_inv]
rw [RigidStabilizer_leftInv (G := G) (α := α) W_in_basis]
refine ⟨⟨W_in_A, W_in_basis⟩, ?W_eq_U⟩
rw [rigidStabilizer_conj_image_eq, gW_eq_U]
unfold_let
exact RigidStabilizer_rightInv U_in_basis
· intro algsupp_ss
unfold RSuppSubsets RSuppOrbit
simp
intro U U_in_basis U_ss_W
let U' := (G•[U] : Set G)
have U'_in_basis : U' ∈ AlgebraicCentralizerBasis G :=
AlgebraicCentralizerBasis.mem_of_regularSupportBasis U_in_basis
have U'_ss_GW : U' ⊆ G•[W] := by
rw [SetLike.coe_subset_coe]
rw [<-rigidStabilizer_subset_iff]
· assumption
· exact RegularSupportBasis.regular U_in_basis
· exact RegularSupportBasis.regular W_in_basis
let ⟨g, g_in_GV, ⟨X, X_in_inter, X_eq⟩⟩ := algsupp_ss ⟨U'_in_basis, U'_ss_GW⟩
have X_in_basis := X_in_inter.right
rw [filter_of.mem_inter_inv] at X_in_inter
simp at g_in_GV
use g
refine ⟨g_in_GV, ⟨rigidStabilizer_inv X, X_in_inter.left, ?giX_eq_U⟩⟩
apply (And.right) at X_in_inter
rw [rigidStabilizer_inv_smulImage X_in_basis, X_eq]
unfold_let
rw [RigidStabilizer_leftInv U_in_basis]
theorem IsRubinFilterOf.converges_iff {A : UltrafilterInBasis (RegularSupportBasis G α)}
{B : UltrafilterInBasis (AlgebraicCentralizerBasis G)}
(filter_of : IsRubinFilterOf A B)
{V : Set α} (V_in_basis : V ∈ RegularSupportBasis G α)
:
(∃ p ∈ V, A ≤ nhds p) ↔
AlgebraicConvergent B.filter G•[V] :=
by
unfold AlgebraicConvergent
constructor
· rw [proposition_3_5' V_in_basis]
intro ⟨W, W_in_basis, W_ss_V, subsets_ss_orbit⟩
use G•[W]
rw [<-filter_of.subsets_ss_orbit W_in_basis]
refine ⟨?GW_in_basis, ?GW_ss_GV, subsets_ss_orbit⟩
exact AlgebraicCentralizerBasis.mem_of_regularSupportBasis W_in_basis
simp
rwa [<-rigidStabilizer_subset_iff _ (RegularSupportBasis.regular W_in_basis) (RegularSupportBasis.regular V_in_basis)]
· intro ⟨W, W_in_basis, W_ss_GV, subsets_ss_orbit⟩
rw [<-AlgebraicCentralizerBasis.eq_rist_image (α := α)] at W_in_basis
let ⟨W', W'_in_basis, W'_eq⟩ := W_in_basis
simp only at W'_eq
rw [proposition_3_5' V_in_basis]
use W'
rw [filter_of.subsets_ss_orbit W'_in_basis, W'_eq]
refine ⟨W'_in_basis, ?W'_ss_V, subsets_ss_orbit⟩
rw [<-W'_eq] at W_ss_GV
simp at W_ss_GV
rwa [<-rigidStabilizer_subset_iff _ (RegularSupportBasis.regular W'_in_basis) (RegularSupportBasis.regular V_in_basis)] at W_ss_GV
def RubinFilter.from (F : UltrafilterInBasis (RegularSupportBasis G α)) (F_converges : ∃ p : α, F ≤ nhds p) : RubinFilter G where
filter := (F.map_basis
(RegularSupportBasis.empty_not_mem G α)
(RigidStabilizer.order_iso_on G α)
AlgebraicCentralizerBasis.empty_not_mem'
).cast (by simp)
converges := by
let ⟨p, F_le_nhds⟩ := F_converges
have ⟨W, W_in_basis, _, W_subsets_ss_GV_orbit⟩ := (proposition_3_5' (RegularSupportBasis.univ_mem G α) F).mp ⟨p, (Set.mem_univ p), F_le_nhds⟩
refine ⟨
G•[W],
by apply AlgebraicCentralizerBasis.mem_of_regularSupportBasis W_in_basis,
by simp,
?subsets_ss_orbit
rw [<-Subgroup.coe_top, <-rigidStabilizer_univ (α := α) (G := G)]
rwa [<-(RubinFilter.from_isRubinFilterOf' F).subsets_ss_orbit W_in_basis]
theorem RubinFilter.from_isRubinFilterOf (F : UltrafilterInBasis (RegularSupportBasis G α)) (F_converges : ∃ p : α, F ≤ nhds p):
IsRubinFilterOf F (RubinFilter.from F F_converges).filter := RubinFilter.from_isRubinFilterOf' F
theorem RubinFilter.map_from_eq (F : UltrafilterInBasis (RegularSupportBasis G α)) (F_converges : ∃ p : α, F ≤ nhds p):
(RubinFilter.from F F_converges).map α = F :=
by
apply UltrafilterInBasis.eq_of_le
apply UltrafilterInBasis.le_of_basis_sets
intro S S_in_B S_in_F
rw [(RubinFilter.from_isRubinFilterOf F F_converges) S S_in_B] at S_in_F
rw [(RubinFilter.map_isRubinFilterOf (RubinFilter.from F F_converges) (α := α)) S S_in_B]
exact S_in_F
section Convergence
variable (α : Type _)
variable [Nonempty α] [TopologicalSpace α] [T2Space α] [HasNoIsolatedPoints α] [LocallyCompactSpace α]
variable [MulAction G α] [ContinuousConstSMul G α] [FaithfulSMul G α] [LocallyDense G α]
theorem RubinFilter.map_converges (F : RubinFilter G):
∃ p : α, (F.map α).filter ≤ nhds p :=
by
suffices ∃ p ∈ Set.univ, (F.map α).filter ≤ nhds p by
let ⟨p, _, f_le_nhds⟩ := this
exact ⟨p, f_le_nhds⟩
rw [proposition_3_5' (RegularSupportBasis.univ_mem G α)]
let ⟨V, V_in_basis, _, subsets_ss_orbit⟩ := F.converges
simp only [Set.subset_univ, true_and, Subtype.exists, exists_prop]
use rigidStabilizer_inv V
refine ⟨(rigidStabilizer_inv_in_basis V).mp V_in_basis, ?subsets_ss_orbit⟩
rw [(RubinFilter.map_isRubinFilterOf F (α := α)).subsets_ss_orbit
((rigidStabilizer_inv_in_basis V).mp V_in_basis)
]
rw [RigidStabilizer_rightInv V_in_basis]
simp
exact subsets_ss_orbit
theorem RubinFilter.from_map_eq (F : RubinFilter G):
RubinFilter.from (F.map α) (RubinFilter.map_converges α F) = F :=
by
rw [mk.injEq]
apply UltrafilterInBasis.eq_of_le
apply UltrafilterInBasis.le_of_basis_sets
intro S S_in_B S_in_F
rw [(RubinFilter.from_isRubinFilterOf (F.map α) (RubinFilter.map_converges α F)).mem_inv S_in_B]
rw [<-(RubinFilter.map_isRubinFilterOf F (α := α)).mem_inv S_in_B]
exact S_in_F
noncomputable def RubinFilter.lim (F : RubinFilter G)
: α := Exists.choose (RubinFilter.map_converges F (α := α))
theorem RubinFilter.le_nhds_lim (F : RubinFilter G) :
F.map α ≤ nhds (F.lim α) := (RubinFilter.map_converges F (α := α)).choose_spec
theorem RubinFilter.le_nhds_eq_lim (F : RubinFilter G) (p : α) :
F.map α ≤ nhds p → p = F.lim α :=
by
intro F_le_p
have F_le_lim := F.le_nhds_lim (α := α)
by_contra p_ne_lim
rw [<-ne_eq, <-disjoint_nhds_nhds] at p_ne_lim
apply (map F α).ne_bot.ne
exact Filter.empty_mem_iff_bot.mp (p_ne_lim F_le_p F_le_lim trivial)
lemma RubinFilter.lim_mem_iff (F : RubinFilter G) {T : Set α} (T_in_basis : T ∈ RegularSupportBasis G α) :
F.lim α ∈ T ↔ ∃ V ∈ RegularSupportBasis G α, V ⊆ T ∧ RSuppSubsets G V ⊆ RSuppOrbit (F.map α) G•[T] :=
by
rw [<-proposition_3_5' T_in_basis]
constructor
· intro lim_in_T
use lim α F
exact ⟨lim_in_T, le_nhds_lim α F⟩
· intro ⟨p, p_in_T, le_nhds_p⟩
exact (F.le_nhds_eq_lim α p le_nhds_p) ▸ p_in_T
lemma RubinFilter.exists_nhds_iff_lim_in_set (F : RubinFilter G) (T : Set α) :
(∃ p ∈ T, F.map α ≤ nhds p) ↔ F.lim α ∈ T :=
by
constructor
· intro ⟨p, p_in_T, F_le_nhds⟩
convert p_in_T
exact (F.le_nhds_eq_lim α p F_le_nhds).symm
· intro lim_in_T
exact ⟨lim α F, lim_in_T, le_nhds_lim α F⟩
end Convergence
section Setoid
variable {α : Type}
variable [Nonempty α] [TopologicalSpace α] [T2Space α] [HasNoIsolatedPoints α] [LocallyCompactSpace α]
variable [MulAction G α] [ContinuousConstSMul G α] [FaithfulSMul G α] [LocallyDense G α]
/--
Two rubin filters are equivalent if they share the same behavior in regards to which set their converging point `p` lies in.
--/
instance RubinFilterSetoid (G : Type _) [Group G] : Setoid (RubinFilter G) where
r F F' := ∀ (U : Set G), U ∈ AlgebraicCentralizerBasis G →
(AlgebraicConvergent F.filter U ↔ AlgebraicConvergent F'.filter U)
iseqv := by
constructor
· intros
simp
· intro F F' h
intro U U_rigid
symm
exact h U U_rigid
· intro F₁ F₂ F₃
intro h₁₂ h₂₃
intro U U_rigid
specialize h₁₂ U U_rigid
specialize h₂₃ U U_rigid
exact Iff.trans h₁₂ h₂₃
theorem RubinFilter.eqv_def (F₁ F₂ : RubinFilter G):
F₁ ≈ F₂ ↔ ∀ U ∈ AlgebraicCentralizerBasis G, AlgebraicConvergent F₁.filter U ↔ AlgebraicConvergent F₂.filter U := by rfl
lemma RubinFilter.lim_mem_iff_of_eqv {F₁ F₂ : RubinFilter G} (F_equiv : F₁ ≈ F₂)
{S : Set α} (S_in_basis : S ∈ RegularSupportBasis G α) :
F₁.lim α ∈ S ↔ F₂.lim α ∈ S
:= by
have F₁_rubinFilterOf := (RubinFilter.map_isRubinFilterOf F₁ (α := α))
have F₂_rubinFilterOf := (RubinFilter.map_isRubinFilterOf F₂ (α := α))
rw [F₁.lim_mem_iff α S_in_basis, <-proposition_3_5' S_in_basis]
rw [F₁_rubinFilterOf.converges_iff S_in_basis]
rw [F_equiv _ (AlgebraicCentralizerBasis.mem_of_regularSupportBasis S_in_basis)]
rw [<-F₂_rubinFilterOf.converges_iff S_in_basis]
rw [F₂.lim_mem_iff α S_in_basis, <-proposition_3_5' S_in_basis]
lemma RubinFilter.mem_nhds_lim_iff_of_eqv {F₁ F₂ : RubinFilter G} (F_equiv : F₁ ≈ F₂)
(S : Set α) : S ∈ nhds (F₁.lim α) ↔ S ∈ nhds (F₂.lim α) :=
by
suffices ∀ F₁ F₂ : RubinFilter G, F₁ ≈ F₂ → ∀ S : Set α, S ∈ nhds (F₁.lim α) → S ∈ nhds (F₂.lim α) by
constructor
apply this _ _ F_equiv
apply this _ _ (Setoid.symm F_equiv)
have basis := RegularSupportBasis.isBasis G α
intro F₁ F₂ F_equiv S S_in_nhds_F₁
rw [basis.mem_nhds_iff] at S_in_nhds_F₁
let ⟨T, T_in_basis, lim₁_in_T, T_ss_S⟩ := S_in_nhds_F₁
rw [basis.mem_nhds_iff]
use T
refine ⟨T_in_basis, ?lim₂_in_T, T_ss_S⟩
rw [lim_mem_iff_of_eqv F_equiv T_in_basis] at lim₁_in_T
exact lim₁_in_T
theorem RubinFilter.lim_eq_of_eqv {F₁ F₂ : RubinFilter G} (F_equiv : F₁ ≈ F₂) :
F₁.lim α = F₂.lim α :=
by
apply RubinFilter.le_nhds_eq_lim
have nhds_lim_in_basis := nhds_in_basis (lim α F₁) (RegularSupportBasis.isBasis G α)
apply UltrafilterInBasis.le_of_inf_neBot _ (RegularSupportBasis.closed_inter G α) nhds_lim_in_basis
constructor
intro eq_bot
rw [Filter.inf_eq_bot_iff] at eq_bot
let ⟨U, U_in_F₂, V, V_in_nhds, UV_empty⟩ := eq_bot
rw [mem_nhds_lim_iff_of_eqv F_equiv] at V_in_nhds
apply (F₂.map α).ne_bot.ne
rw [<-inf_eq_left.mpr (F₂.le_nhds_lim α)]
rw [Filter.inf_eq_bot_iff]
exact ⟨U, U_in_F₂, V, V_in_nhds, UV_empty⟩
theorem RubinFilter.eqv_of_map_converges (F₁ F₂ : RubinFilter G) (p : α):
F₁.map α ≤ nhds p → F₂.map α ≤ nhds p → F₁ ≈ F₂ :=
by
intro F₁_le_nhds F₂_le_nhds
intro S S_in_basis
have F₁_rubinFilterOf := (RubinFilter.map_isRubinFilterOf F₁ (α := α))
have F₂_rubinFilterOf := (RubinFilter.map_isRubinFilterOf F₂ (α := α))
rw [<-AlgebraicCentralizerBasis.eq_rist_image (α := α)] at S_in_basis
let ⟨S', S'_in_basis, S'_eq⟩ := S_in_basis
simp only at S'_eq
rw [<-S'_eq]
rw [<-F₁_rubinFilterOf.converges_iff S'_in_basis]
rw [<-F₂_rubinFilterOf.converges_iff S'_in_basis]
rw [F₁.exists_nhds_iff_lim_in_set α S']
rw [F₂.exists_nhds_iff_lim_in_set α S']
rw [<-F₁.le_nhds_eq_lim _ _ F₁_le_nhds]
rw [<-F₂.le_nhds_eq_lim _ _ F₂_le_nhds]
theorem RubinFilter.lim_eq_iff_eqv (F₁ F₂ : RubinFilter G):
F₁ ≈ F₂ ↔ F₁.lim α = F₂.lim α :=
by
constructor
apply lim_eq_of_eqv
intro lim_eq
apply eqv_of_map_converges _ _ (F₁.lim α)
· exact le_nhds_lim α F₁
· rw [lim_eq]
exact le_nhds_lim α F₂
lemma RubinFilter.fromPoint_converges' (p : α) :
∃ q : α, (
UltrafilterInBasis.of
(RegularSupportBasis.closed_inter G α)
(nhds_in_basis p (RegularSupportBasis.isBasis G α))
).filter ≤ nhds q :=
by
use p
apply UltrafilterInBasis.of_le
def RubinFilter.fromPoint (p : α) : RubinFilter G :=
RubinFilter.from (
UltrafilterInBasis.of
(RegularSupportBasis.closed_inter G α)
(nhds_in_basis p (RegularSupportBasis.isBasis G α))
)
(RubinFilter.fromPoint_converges' p)
@[simp]
theorem RubinFilter.fromPoint_lim (p : α) :
(RubinFilter.fromPoint (G := G) p).lim α = p :=
by
symm
apply RubinFilter.le_nhds_eq_lim
unfold fromPoint
rw [RubinFilter.map_from_eq]
apply UltrafilterInBasis.of_le
theorem RubinFilter.lim_fromPoint_eqv (F : RubinFilter G) :
RubinFilter.fromPoint (F.lim α) ≈ F :=
by
apply eqv_of_map_converges _ _ (F.lim α)
· unfold fromPoint
rw [RubinFilter.map_from_eq]
apply UltrafilterInBasis.of_le
· exact le_nhds_lim α F
lemma RubinFilter.lim_in_set (F : RubinFilter G) {S : Set α} (S_in_basis : S ∈ RegularSupportBasis G α) :
F.lim α ∈ S ↔ AlgebraicConvergent F.filter.filter G•[S] :=
by
rw [<-(RubinFilter.map_isRubinFilterOf F (α := α)).converges_iff S_in_basis]
constructor
· intro lim_in_S
exact ⟨lim α F, lim_in_S, le_nhds_lim α F⟩
· intro ⟨p, p_in_S, F_le_nhds⟩
convert p_in_S
exact (le_nhds_eq_lim α F p F_le_nhds).symm
lemma RubinFilter.rigidStabilizer_mem_of_lim_in_set (F : RubinFilter G) {S : Set α} (S_in_basis : S ∈ RegularSupportBasis G α)
(lim_in_set : F.lim α ∈ S) :
(G•[S] : Set G) ∈ F.filter :=
by
have S_in_F : S ∈ F.map α := by
apply RubinFilter.le_nhds_lim
refine (IsOpen.mem_nhds_iff ?isOpen).mpr lim_in_set
exact (RegularSupportBasis.regular S_in_basis).isOpen
rwa [F.map_isRubinFilterOf S S_in_basis] at S_in_F
theorem AlgebraicSubsets.conj (S T: Set G) (g : G) :
S ∈ AlgebraicSubsets T → (MulAut.conj g) '' S ∈ AlgebraicSubsets ((MulAut.conj g) '' T) :=
by
unfold AlgebraicSubsets
simp
intro S_in_subsets S_ss_T
refine ⟨AlgebraicCentralizerBasis.conj_mem S_in_subsets g, ?S_ss_T⟩
rwa [Set.preimage_image_eq _ conj_injective]
theorem AlgebraicConvergent.conj {F : Filter G} {S : Set G}
(convergent : AlgebraicConvergent F S)
(g : G) :
AlgebraicConvergent (F.map (MulAut.conj g)) ((MulAut.conj g) '' S) :=
by
unfold AlgebraicConvergent at *
let ⟨V, V_in_basis, V_ss_S, V_subsets_ss_orbit⟩ := convergent
refine ⟨
(MulAut.conj g) '' V,
AlgebraicCentralizerBasis.conj_mem V_in_basis g,
Set.image_subset _ V_ss_S,
?subsets_ss_orbit
unfold AlgebraicOrbit
intro U U_in_subsets
have gU_in_subsets : ⇑(MulAut.conj g⁻¹) '' U ∈ AlgebraicSubsets V := by
convert AlgebraicSubsets.conj U ((MulAut.conj g) '' V) g⁻¹ U_in_subsets
rw [Set.image_image]
simp only [map_inv, MulAut.conj_apply, map_mul, MulAut.conj_inv_apply, mul_left_inv, one_mul]
group
rw [Set.image_id']
have ⟨h, h_in_S, W, ⟨W_in_F, W_in_basis⟩, W_eq⟩ := V_subsets_ss_orbit gU_in_subsets
refine ⟨g * h * g⁻¹, (by simp; assumption), ?rest⟩
refine ⟨(MulAut.conj g) '' W,
Filter.image_mem_map W_in_F,
by simp [MulAut.conj]; apply AlgebraicCentralizerBasis.conj_mem W_in_basis⟩,
?W_eq
rw [Set.image_image]
simp only [MulAut.conj_apply, conj_mul, mul_inv_rev, inv_inv]
group
simp only [zpow_neg, zpow_one]
have conj₁ : (fun i => g * h * i * h⁻¹ * g⁻¹) = (MulAut.conj (g * h)).toEquiv := by
ext i
simp
group
rw [conj₁, Set.image_equiv_eq_preimage_symm]
rw [
(by rfl : (MulAut.conj g⁻¹) '' U = (MulAut.conj g⁻¹).toEquiv '' U),
(by rfl : (fun i => h * i * h⁻¹) '' W = (MulAut.conj h).toEquiv '' W),
Equiv.eq_image_iff_symm_image_eq,
<-Set.preimage_equiv_eq_image_symm,
Set.image_equiv_eq_preimage_symm,
Set.preimage_preimage
] at W_eq
convert W_eq using 2
ext i
rw [MulEquiv.toEquiv_eq_coe, MulEquiv.coe_toEquiv_symm, MulAut.conj_symm_apply]
simp
group
def RubinFilterBasis (G : Type _) [Group G] : Set (Set (RubinFilter G)) :=
(fun S : Set G => { F : RubinFilter G | AlgebraicConvergent F.filter S }) '' AlgebraicCentralizerBasis G
instance : TopologicalSpace (RubinFilter G) := TopologicalSpace.generateFrom (RubinFilterBasis G)
theorem RubinFilterBasis.mem_iff (S : Set (RubinFilter G)) :
S ∈ RubinFilterBasis G ↔ ∃ B ∈ AlgebraicCentralizerBasis G, ∀ F : RubinFilter G, F ∈ S ↔ AlgebraicConvergent F.filter B :=
by
unfold RubinFilterBasis
simp
conv => {
lhs; congr; intro B; rhs
rw [eq_comm, Set.ext_iff]
}
def RubinSpace (G : Type _) [Group G] := Quotient (RubinFilterSetoid G)
def RubinSpace.fromPoint (p : α) : RubinSpace G :=
⟦RubinFilter.fromPoint p⟧
instance : Membership (RubinFilter G) (RubinSpace G) where
mem := fun F Q => ⟦F⟧ = Q
theorem RubinSpace.mem_iff (F : RubinFilter G) (Q : RubinSpace G) :
F ∈ Q ↔ ⟦F⟧ = Q := by rfl
theorem RubinSpace.fromPoint_converges (p : α) :
∀ F : RubinFilter G, F ∈ RubinSpace.fromPoint (G := G) p → F.lim α = p :=
by
intro F
unfold fromPoint
rw [mem_iff, Quotient.eq]
intro F_eqv_from
convert RubinFilter.lim_eq_of_eqv F_eqv_from
clear F_eqv_from
simp
noncomputable def RubinSpace.lim (Q : RubinSpace G) : α :=
Q.liftOn (RubinFilter.lim α) (fun _a _b eqv => RubinFilter.lim_eq_of_eqv eqv)
theorem RubinSpace.lim_fromPoint (p : α) :
RubinSpace.lim (RubinSpace.fromPoint (G := G) p) = p :=
by
unfold lim
let ⟨Q, Q_eq⟩ := (RubinSpace.fromPoint (G := G) p).exists_rep
rw [<-Q_eq]
simp
apply RubinSpace.fromPoint_converges p Q
rwa [mem_iff]
theorem RubinSpace.fromPoint_lim (Q : RubinSpace G) :
RubinSpace.fromPoint (Q.lim (α := α)) = Q :=
by
let ⟨Q', Q'_eq⟩ := Q.exists_rep
rw [<-Q'_eq, lim, fromPoint]
simp
rw [Quotient.eq]
apply RubinFilter.lim_fromPoint_eqv
instance : TopologicalSpace (RubinSpace G) := by
unfold RubinSpace
infer_instance
end Setoid
end RubinFilter
section Basis
variable {G : Type _}
variable [Group G]
variable (α : Type) [α_nonempty : Nonempty α]
[TopologicalSpace α] [T2Space α] [HasNoIsolatedPoints α] [LocallyCompactSpace α]
[MulAction G α] [ContinuousConstSMul G α] [FaithfulSMul G α] [LocallyDense G α]
lemma AlgebraicConvergent_mono {F : RubinFilter G} {S T : Set G}
(S_basis : S ∈ AlgebraicCentralizerBasis G) (T_basis : T ∈ AlgebraicCentralizerBasis G)
(S_ss_T : S ⊆ T) (F_converges : AlgebraicConvergent F.filter.filter S) : AlgebraicConvergent F.filter.filter T :=
by
let ⟨S', S'_basis, S'_eq⟩ := (AlgebraicCentralizerBasis.eq_rist_image (G := G) (α := α)).symm ▸ S_basis
let ⟨T', T'_basis, T'_eq⟩ := (AlgebraicCentralizerBasis.eq_rist_image (G := G) (α := α)).symm ▸ T_basis
rw [<-S'_eq, <-RubinFilter.lim_in_set F S'_basis (α := α)] at F_converges
rw [<-T'_eq, <-RubinFilter.lim_in_set F T'_basis (α := α)]
have S'_ss_T' : S' ⊆ T' := by
rw [<-S'_eq, <-T'_eq] at S_ss_T
simp at S_ss_T
rw [<-rigidStabilizer_subset_iff] at S_ss_T
any_goals apply RegularSupportBasis.regular (α := α) (G := G)
all_goals assumption
apply S'_ss_T'
assumption
theorem RubinFilterBasis.isBasis : TopologicalSpace.IsTopologicalBasis (RubinFilterBasis G) := by
constructor
· intro T₁ T₁_in_basis T₂ T₂_in_basis F ⟨F_in_T₁, F_in_T₂⟩
let ⟨B₁, B₁_in_basis, B₁_mem⟩ := (mem_iff T₁).mp T₁_in_basis
let ⟨B₂, B₂_in_basis, B₂_mem⟩ := (mem_iff T₂).mp T₂_in_basis
have F_conv₁ := (B₁_mem F).mp F_in_T₁
have F_conv₂ := (B₂_mem F).mp F_in_T₂
let ⟨B₁', B₁'_in_basis, B₁'_eq⟩ := (AlgebraicCentralizerBasis.eq_rist_image (G := G) (α := α)).symm ▸ B₁_in_basis
let ⟨B₂', B₂'_in_basis, B₂'_eq⟩ := (AlgebraicCentralizerBasis.eq_rist_image (G := G) (α := α)).symm ▸ B₂_in_basis
simp only at B₁'_eq
simp only at B₂'_eq
rw [<-B₁'_eq, <-RubinFilter.lim_in_set F B₁'_in_basis] at F_conv₁
rw [<-B₂'_eq, <-RubinFilter.lim_in_set F B₂'_in_basis] at F_conv₂
have F_conv₃ : F.lim α ∈ B₁' ∩ B₂' := ⟨F_conv₁, F_conv₂⟩
have B₃_nonempty : (B₁' ∩ B₂').Nonempty := by use F.lim α
have B₃'_in_basis : B₁' ∩ B₂' ∈ RegularSupportBasis G α := by
apply RegularSupportBasis.closed_inter
all_goals assumption
have B₃_eq : B₁ ∩ B₂ = G•[B₁' ∩ B₂'] := by
rw [rigidStabilizer_inter, Subgroup.coe_inf, B₁'_eq, B₂'_eq]
have B₃_in_basis : B₁ ∩ B₂ ∈ AlgebraicCentralizerBasis G := by
rw [<-AlgebraicCentralizerBasis.eq_rist_image (α := α)]
use B₁' ∩ B₂'
simp
exact ⟨B₃'_in_basis, B₃_eq.symm⟩
have B₃_ne_bot : B₁ ∩ B₂ ≠ {1} := by
rw [B₃_eq, <-Subgroup.coe_bot, ne_eq, SetLike.coe_set_eq]
rw [rigidStabilizer_empty_iff _ (RegularSupportBasis.regular B₃'_in_basis)]
rwa [<-ne_eq, <-Set.nonempty_iff_ne_empty]
use { F : RubinFilter G | AlgebraicConvergent F.filter (B₁ ∩ B₂) }
simp [RubinFilterBasis]
refine ⟨⟨B₁ ∩ B₂, ?B_in_basis, rfl⟩, ?F_conv₃, ?T₃_ss_T₁, ?T₃_ss_T₂⟩
· apply AlgebraicCentralizerBasis.inter_closed
all_goals assumption
· rw [<-B₁'_eq, <-B₂'_eq, <-Subgroup.coe_inf, <-rigidStabilizer_inter]
rw [<-RubinFilter.lim_in_set F B₃'_in_basis]
exact ⟨F_conv₁, F_conv₂⟩
· intro X
simp [B₁_mem]
apply AlgebraicConvergent_mono α B₃_in_basis B₁_in_basis
exact Set.inter_subset_left B₁ B₂
· intro X
simp [B₂_mem]
apply AlgebraicConvergent_mono α B₃_in_basis B₂_in_basis
exact Set.inter_subset_right B₁ B₂
· have univ_in_basis : Set.univ ∈ RubinFilterBasis G := by
rw [RubinFilterBasis.mem_iff]
use Set.univ
refine ⟨AlgebraicCentralizerBasis.univ_mem ?ex_nontrivial, ?F_in_univ⟩
{
let ⟨x⟩ := α_nonempty
let ⟨g, _, g_moving⟩ := get_moving_elem_in_rigidStabilizer G (isOpen_univ (α := α)) (Set.mem_univ x)
use g
intro g_eq_one
rw [g_eq_one, one_smul] at g_moving
exact g_moving rfl
}
intro X
simp
exact X.converges
apply Set.eq_univ_of_univ_subset
exact Set.subset_sUnion_of_mem univ_in_basis
· rfl
theorem RubinSpace.basis : TopologicalSpace.IsTopologicalBasis (
Set.image (Quotient.mk') '' (RubinFilterBasis G)
) := by
refine TopologicalSpace.IsTopologicalBasis.quotientMap (RubinFilterBasis.isBasis α) (quotientMap_quotient_mk') ?open_map
rw [(RubinFilterBasis.isBasis α).isOpenMap_iff]
intro U U_in_basis
apply TopologicalSpace.isOpen_generateFrom_of_mem
rw [RubinFilterBasis.mem_iff]
rw [RubinFilterBasis.mem_iff] at U_in_basis
let ⟨B, B_in_basis, B_mem⟩ := U_in_basis
simp
refine ⟨B, B_in_basis, ?mem⟩
intro F
let ⟨B', B'_in_basis, B'_eq⟩ := (AlgebraicCentralizerBasis.eq_rist_image (G := G) (α := α)).symm ▸ B_in_basis
simp only at B'_eq
simp only [B_mem]
rw [<-B'_eq, <-RubinFilter.lim_in_set (α := α) (G := G)]
conv => {
lhs; congr; intro;
rw [<-RubinFilter.lim_in_set (α := α) (G := G) _ B'_in_basis]
}
swap
exact B'_in_basis
constructor
· intro ⟨F', F'_lim, F'_eqv⟩
rw [(by rfl : Setoid.r F' F ↔ F' ≈ F)] at F'_eqv
rw [RubinFilter.lim_eq_iff_eqv F' F (α := α)] at F'_eqv
rwa [<-F'_eqv]
· intro F_lim
exact ⟨F, F_lim, Setoid.refl F⟩
end Basis
section Homeomorph
variable {G : Type _} [Group G]
variable (α : Type _) [TopologicalSpace α] [T2Space α] [HasNoIsolatedPoints α] [LocallyCompactSpace α] [Nonempty α]
variable [MulAction G α] [ContinuousConstSMul G α] [FaithfulSMul G α] [LocallyDense G α]
@[simp]
lemma RubinSpace.lim_mk (F : RubinFilter G) :
RubinSpace.lim (α := α) (⟦F⟧ : RubinSpace G) = F.lim α :=
by
unfold lim
simp
@[simp]
lemma RubinSpace.lim_mk' (F : RubinFilter G) :
RubinSpace.lim (α := α) (Quotient.mk' F : RubinSpace G) = F.lim α :=
by
rw [Quotient.mk'_eq_mk]
exact RubinSpace.lim_mk α F
theorem RubinSpace.lim_continuous : Continuous (RubinSpace.lim (G := G) (α := α)) := by
rw [(RegularSupportBasis.isBasis G α).continuous_iff]
intro S S_in_basis
apply TopologicalSpace.isOpen_generateFrom_of_mem
rw [RubinFilterBasis.mem_iff]
use G•[S]
refine ⟨AlgebraicCentralizerBasis.mem_of_regularSupportBasis S_in_basis, ?filters_mem⟩
simp
simp [<-RubinFilter.lim_in_set _ S_in_basis]
theorem RubinSpace.fromPoint_continuous : Continuous (RubinSpace.fromPoint (G := G) (α := α)) := by
apply (RubinSpace.basis (α := α)).continuous
simp
intro U U_in_basis
rw [RubinFilterBasis.mem_iff] at U_in_basis
let ⟨V, V_in_basis, U_mem⟩ := U_in_basis
-- TODO: automatize this
let ⟨V', V'_in_basis, V'_eq⟩ := (AlgebraicCentralizerBasis.eq_rist_image (G := G) (α := α)).symm ▸ V_in_basis
simp only at V'_eq
rw [<-V'_eq] at U_mem
conv at U_mem => {
intro F
rw [<-F.lim_in_set V'_in_basis]
}
rw [(RegularSupportBasis.isBasis G α).isOpen_iff]
simp
intro x F F_in_U F_eqv_fromPoint_x
rw [U_mem] at F_in_U
have x_eq_F_lim : x = F.lim α := by
symm
rwa [Quotient.mk'_eq_mk, fromPoint, Quotient.eq, RubinFilter.lim_eq_iff_eqv (α := α), RubinFilter.fromPoint_lim] at F_eqv_fromPoint_x
refine ⟨V', V'_in_basis, ?x_in_V', ?V'_ss_U⟩
rwa [x_eq_F_lim]
intro y y_in_V'
simp
use RubinFilter.fromPoint (G := G) y
constructor
rwa [U_mem, RubinFilter.fromPoint_lim]
rw [Quotient.mk'_eq_mk, RubinSpace.fromPoint]
-- TODO: mind the type variables
/--
The canonical homeomorphism from a topological space that a rubin action acts on to
the rubin space associated with the group.
--/
noncomputable def RubinSpace.homeomorph : Homeomorph (RubinSpace G) α where
toFun := RubinSpace.lim
invFun := RubinSpace.fromPoint
left_inv := RubinSpace.fromPoint_lim
right_inv := RubinSpace.lim_fromPoint
continuous_toFun := RubinSpace.lim_continuous α
continuous_invFun := RubinSpace.fromPoint_continuous α
end Homeomorph
section Equivariant
variable {G : Type _} [Group G]
variable {α : Type _} [TopologicalSpace α] [T2Space α] [HasNoIsolatedPoints α] [LocallyCompactSpace α] [Nonempty α]
variable [MulAction G α] [ContinuousConstSMul G α] [FaithfulSMul G α] [LocallyDense G α]
-- TODO: move elsewhere
@[simp]
theorem Group.range_conj_eq_univ {G : Type*} [Group G] (g : G) :
Set.range (fun i => g * i * g⁻¹) = Set.univ :=
by
ext h
simp
use g⁻¹ * h * g
group
@[simp]
theorem Group.range_conj'_eq_univ {G : Type*} [Group G] (g : G) :
Set.range (fun i => g⁻¹ * i * g) = Set.univ :=
by
nth_rw 2 [<-inv_inv g]
exact Group.range_conj_eq_univ g⁻¹
def RubinFilter.smul (F : RubinFilter G) (g : G) : RubinFilter G where
filter := (F.filter.map_basis
(AlgebraicCentralizerBasis.empty_not_mem (G := G))
((MulAut.conj_order_iso g).orderIsoOn (AlgebraicCentralizerBasis G))
(by
rw [OrderIso.orderIsoOn_image]
rw [AlgebraicCentralizerBasis.eq_conj_self g]
apply AlgebraicCentralizerBasis.empty_not_mem
)
).cast (AlgebraicCentralizerBasis.eq_conj_self g)
converges := by
simp [MulAut.conj_order_iso]
rw [Filter.InBasis.map_basis_toOrderIsoSet _ F.filter.in_basis]
convert AlgebraicConvergent.conj F.converges g
simp
theorem RubinFilter.smul_lim (F : RubinFilter G) (g : G) :
(F.smul g).lim α = g • F.lim α :=
by
symm
apply le_nhds_eq_lim
intro U gU_in_nhds
rw [<-smulFilter_nhds, mem_smulFilter_iff] at gU_in_nhds
rw [RubinFilter.map]
simp [smul]
-- Please look away
let m₁ := (MulAut.conj_order_iso g).orderIsoOn (AlgebraicCentralizerBasis G)
let m₂: OrderIsoOn (Set G) (Set α) (m₁.toFun '' (AlgebraicCentralizerBasis G)) :=
(RigidStabilizer.inv_order_iso_on G α).mk_of_subset (by
nth_rw 3 [<-AlgebraicCentralizerBasis.eq_conj_self g]
unfold_let
rfl
)
have eq := Filter.InBasis.map_basis_comp (α := G) (β := G) (γ := α) m₁ m₂ F.filter.in_basis
simp at eq
rw [AlgebraicCentralizerBasis.eq_conj_self g] at eq
rw [eq]
clear eq m₁ m₂
rw [Filter.InBasis.mem_map_basis _ _ F.filter.in_basis]
swap
{
intro S S_in_basis T T_in_basis S_ss_T
-- simp [MulAut.conj_order_iso]
apply RigidStabilizer_inv_doubleMonotone.monotoneOn
any_goals apply AlgebraicCentralizerBasis.conj_mem'
any_goals assumption
apply OrderIso.monotone
assumption
}
simp [MulAut.conj_order_iso]
rw [(RegularSupportBasis.isBasis G α).mem_nhds_iff] at gU_in_nhds
let ⟨T, T_in_basis, lim_in_T, T_ss_gU⟩ := gU_in_nhds
refine ⟨G•[T], ?T_in_filter, ?T_in_basis, ?inv_T_ss_U⟩
· exact rigidStabilizer_mem_of_lim_in_set F T_in_basis lim_in_T
· exact AlgebraicCentralizerBasis.mem_of_regularSupportBasis T_in_basis
· rw [Equiv.toOrderIsoSet_apply]
simp
rw [rigidStabilizer_conj_image_eq, RigidStabilizer_leftInv]
rwa [smulImage_subset_inv]
have dec_eq : DecidableEq G := Classical.typeDecidableEq _
apply RegularSupportBasis.smulImage_in_basis
assumption
theorem RubinFilter.smul_eqv_of_eqv (g : G) {F₁ F₂ : RubinFilter G}
(F_eqv : F₁ ≈ F₂) : (F₁.smul g ≈ F₂.smul g) :=
by
rw [RubinFilter.eqv_def]
intro U U_in_basis
simp [smul, MulAut.conj_order_iso]
repeat rw [Filter.InBasis.map_basis_toOrderIsoSet]
any_goals exact F₁.filter.in_basis
any_goals exact F₂.filter.in_basis
rw [RubinFilter.eqv_def] at F_eqv
specialize F_eqv ((MulAut.conj g⁻¹) '' U) ?gU_in_basis
{
exact AlgebraicCentralizerBasis.conj_mem' U_in_basis g⁻¹
}
rw [map_inv] at F_eqv
constructor
· intro F₁_conv
have F₁_conv' := AlgebraicConvergent.conj F₁_conv g⁻¹
rw [Filter.map_map, <-MulAut.coe_mul, map_inv, mul_left_inv, MulAut.coe_one, Filter.map_id] at F₁_conv'
rw [F_eqv] at F₁_conv'
convert AlgebraicConvergent.conj F₁_conv' g using 1
simp [Set.image_image]
group
simp
· intro F₂_conv
have F₂_conv' := AlgebraicConvergent.conj F₂_conv g⁻¹
rw [Filter.map_map, <-MulAut.coe_mul, map_inv, mul_left_inv, MulAut.coe_one, Filter.map_id] at F₂_conv'
rw [<-F_eqv] at F₂_conv'
convert AlgebraicConvergent.conj F₂_conv' g using 1
simp [Set.image_image]
group
simp
theorem RubinFilter.smul_one (F : RubinFilter G) : RubinFilter.smul F 1 = F :=
by
rw [smul, mk.injEq]
rw [UltrafilterInBasis.mk.injEq]
simp [MulAut.conj_order_iso]
rw [Filter.InBasis.map_basis_toOrderIsoSet _ F.filter.in_basis]
rw [MulAut.coe_one, Filter.map_id]
theorem RubinFilter.mul_smul (g h : G) (F : RubinFilter G) : (F.smul g).smul h = F.smul (h * g) := by
unfold smul
rw [mk.injEq, UltrafilterInBasis.mk.injEq]
unfold MulAut.conj_order_iso
simp
rw [Filter.InBasis.map_basis_toOrderIsoSet _ F.filter.in_basis]
rw [Filter.InBasis.map_basis_toOrderIsoSet]
swap
{
-- TODO: lemmatize
intro S S_in_mF
rw [Filter.mem_map] at S_in_mF
have ⟨T, T_in_F, T_in_basis, T_ss_gS⟩ := F.filter.in_basis _ S_in_mF
use (MulAut.conj g⁻¹) ⁻¹' T
constructor
· rw [Filter.mem_map, Set.preimage_preimage]
simp
group
simp
exact T_in_F
constructor
· show (MulAut.conj g⁻¹).toEquiv ⁻¹' T ∈ AlgebraicCentralizerBasis G
rw [Set.preimage_equiv_eq_image_symm]
show (MulEquiv.symm (MulAut.conj g⁻¹)) '' T ∈ AlgebraicCentralizerBasis G
rw [<-MulAut.inv_def, map_inv, inv_inv]
exact AlgebraicCentralizerBasis.conj_mem T_in_basis g
· show (MulAut.conj g⁻¹).toEquiv ⁻¹' T ⊆ S
rw [Set.preimage_equiv_eq_image_symm, Equiv.subset_image]
have T_ss_gS : T ⊆ (MulAut.conj g).toEquiv ⁻¹' S := T_ss_gS
rw [Set.preimage_equiv_eq_image_symm] at T_ss_gS
rw [map_inv, MulAut.inv_def]
exact T_ss_gS
}
rw [Filter.map_map, <-MulAut.coe_mul]
rw [Filter.InBasis.map_basis_toOrderIsoSet _ F.filter.in_basis]
-- Note: awfully slow to compile (since it isn't noncomputable, it gets compiled down to IR)
def RubinSpace.smul (Q : RubinSpace G) (g : G) : RubinSpace G :=
Quotient.map (fun F => F.smul g) (fun _ _ F_eqv => RubinFilter.smul_eqv_of_eqv g F_eqv) Q
theorem RubinSpace.smul_mk (F : RubinFilter G) (g : G) :
RubinSpace.smul (⟦F⟧ : RubinSpace G) g = ⟦F.smul g⟧ := by simp [RubinSpace.smul]
instance : MulAction G (RubinSpace G) where
smul := fun g Q => Q.smul g
one_smul := by
intro Q
let ⟨F, F_eq⟩ := Q.exists_rep
rw [<-F_eq]
show RubinSpace.smul ⟦F⟧ 1 = ⟦F⟧
rw [RubinSpace.smul_mk]
rw [RubinFilter.smul_one]
mul_smul := by
intro g h Q
let ⟨F, F_eq⟩ := Q.exists_rep
rw [<-F_eq]
show RubinSpace.smul ⟦F⟧ (g * h) = RubinSpace.smul (RubinSpace.smul ⟦F⟧ h) g
repeat rw [RubinSpace.smul_mk]
rw [RubinFilter.mul_smul]
theorem RubinSpace.smul_def (g : G) (Q : RubinSpace G) : g • Q = Q.smul g := rfl
noncomputable def RubinSpace.equivariantHomeomorph : EquivariantHomeomorph G (RubinSpace G) α where
toHomeomorph := RubinSpace.homeomorph (G := G) α
toFun_equivariant' := by
intro g Q
simp [RubinSpace.homeomorph]
rw [RubinSpace.smul_def]
let ⟨F, F_eq⟩ := Q.exists_rep
rw [<-F_eq, RubinSpace.smul_mk, RubinSpace.lim_mk, RubinSpace.lim_mk]
rw [RubinFilter.smul_lim]
end Equivariant
variable (G : Type _)
variable [Group G] [Nontrivial G]
variable (α : Type _) [TopologicalSpace α] [T2Space α] [LocallyCompactSpace α] [HasNoIsolatedPoints α]
variable [MulAction G α] [FaithfulSMul G α] [ContinuousConstSMul G α] [LocallyDense G α]
variable (β : Type _) [TopologicalSpace β] [T2Space β] [LocallyCompactSpace β] [HasNoIsolatedPoints β]
variable [MulAction G β] [FaithfulSMul G β] [ContinuousConstSMul G β] [LocallyDense G β]
noncomputable def rubin : EquivariantHomeomorph G α β :=
let α_nonempty : Nonempty α := by rwa [LocallyMoving.nonempty_iff_nontrivial G]
let β_nonempty : Nonempty β := by rwa [LocallyMoving.nonempty_iff_nontrivial G]
(RubinSpace.equivariantHomeomorph (G := G) (α := α)).inv.trans
(RubinSpace.equivariantHomeomorph (G := G) (α := β))
end Rubin
end Rubin