此页定位 blueprint 引用的 Lean 声明,展示已验证的源码快照,并非完整的 API 文档。Lean 4.33.1。
All 435 Lean declaration links in the Chapter 5 blueprint. Declaration modules come from the retained kernel audit. Source links point to declaration lines at commit d6e6e3efe5ee, whose files match the audited SHA-256 hashes. Existing source snapshots are below.
All 22 Lean declaration links in the Chapter 6 blueprint. Declaration modules come from the complete retained kernel audit. Source links point to exact declaration lines at commit d29363fcdbe3, whose files match the audited SHA-256 hashes.
All 117 Lean declaration links in the Chapter 7 blueprint. Declaration modules come from the retained kernel census. Source links point to exact declaration lines at commit 4daf13f6be64, whose files match the audited SHA-256 hashes.
The linked general conjecture is a proposition-valued definition and remains unproved.
| Lean declaration | Immutable source |
|---|---|
BC4lean.Assembly.BaumConnesConjecture | BC4lean/BaumConnesProperty.lean:41 |
BC4lean.Assembly.BaumConnesProperty | BC4lean/BaumConnesProperty.lean:23 |
BC4lean.Assembly.assemblyHom_bijective_iff_homotopyEquiv | BC4lean/BaumConnesInvariance.lean:97 |
BC4lean.Assembly.assemblyHom_bijective_iff_pieceCriteria | BC4lean/AssemblyBijectivityCriteria.lean:76 |
BC4lean.Assembly.assemblyHom_injective_iff_commonTransition | BC4lean/AssemblyBijectivityCriteria.lean:47 |
BC4lean.Assembly.assemblyHom_injective_iff_homotopyEquiv | BC4lean/BaumConnesInvariance.lean:79 |
BC4lean.Assembly.assemblyHom_surjective_iff_homotopyEquiv | BC4lean/BaumConnesInvariance.lean:88 |
BC4lean.Assembly.assemblyHom_surjective_iff_pieceImages | BC4lean/AssemblyBijectivityCriteria.lean:27 |
BC4lean.Assembly.baumConnesProperty_iff_even_and_odd | BC4lean/BaumConnesProperty.lean:27 |
BC4lean.Assembly.indexedAssemblyHom_bijective_iff_cofinalIndex | BC4lean/BaumConnesInvariance.lean:145 |
BC4lean.Assembly.indexedAssemblyHom_injective_iff_cofinalIndex | BC4lean/BaumConnesInvariance.lean:127 |
BC4lean.Assembly.indexedAssemblyHom_surjective_iff_cofinalIndex | BC4lean/BaumConnesInvariance.lean:136 |
BC4lean.Assembly.indexedAssemblyProperty_iff_cofinalComparison | BC4lean/BaumConnesInvariance.lean:200 |
BC4lean.Assembly.modelAssemblyProperty_iff_baumConnesProperty | BC4lean/BaumConnesInvariance.lean:342 |
BC4lean.Chapter8Examples.FiniteGroupPoint | BC4lean/FiniteGroupPointCalibration.lean:18 |
BC4lean.Chapter8Examples.assemblyHom_eq_compactSpaceAssembly | BC4lean/CompactModelColimitCalibration.lean:169 |
BC4lean.Chapter8Examples.baumConnesProperty_unit | BC4lean/UnitAssemblyEquivalence.lean:320 |
BC4lean.Chapter8Examples.compactSpaceGroupEquiv | BC4lean/CompactModelColimitCalibration.lean:144 |
BC4lean.Chapter8Examples.finiteCanonicalGlobalFixedPoint | BC4lean/FiniteGroupPointCalibration.lean:63 |
BC4lean.Chapter8Examples.finiteCanonicalPointHomotopyEquiv | BC4lean/FiniteGroupPointCalibration.lean:86 |
BC4lean.Chapter8Examples.finiteTopologicalPointSpaceEquiv | BC4lean/FiniteGroupPointCalibration.lean:111 |
BC4lean.Chapter8Examples.reducedAssemblyHom_finitePoint_formula | BC4lean/FiniteGroupPointCalibration.lean:145 |
BC4lean.Chapter8Examples.reducedAssemblyHom_unit_eq | BC4lean/UnitAssemblyEquivalence.lean:311 |
BC4lean.Chapter8Examples.terminalColimitEquiv | BC4lean/CompactModelColimitCalibration.lean:31 |
BC4lean.Chapter8Examples.trivialAnalyticK0Equiv | BC4lean/TrivialAnalyticCalibration.lean:30 |
BC4lean.Chapter8Examples.trivialAnalyticK0Equiv_projection | BC4lean/TrivialAnalyticCalibration.lean:46 |
BC4lean.Chapter8Examples.trivialAnalyticK1Equiv | BC4lean/TrivialAnalyticCalibration.lean:34 |
BC4lean.Chapter8Examples.trivialAnalyticK1Equiv_unitary | BC4lean/TrivialAnalyticCalibration.lean:53 |
BC4lean.Chapter8Examples.unitAssemblyAddEquiv | BC4lean/UnitAssemblyEquivalence.lean:305 |
BC4lean.Chapter8Examples.wholeCompactPiece | BC4lean/CompactModelColimitCalibration.lean:52 |
BC4lean.KKTheory.ScalarUnitProjection.relativeMap_nonunitalUnitProjection | BC4lean/ScalarUnitProjection.lean:125 |
BC4lean.KKTheory.ScalarUnitProjection.scalarKKOperatorK0AddEquiv_identity | BC4lean/ScalarUnitProjection.lean:138 |
BC4lean.KKTheory.ScalarUnitProjection.unitRelativeCycleIso | BC4lean/ScalarUnitProjection.lean:100 |
BC4lean.KKTheory.UnitPointCutoff.cutoffKKClass_eq_homClass | BC4lean/UnitPointCutoff.lean:114 |
BC4lean.KKTheory.UnitPointCutoff.pointCZeroEquiv | BC4lean/UnitPointCutoff.lean:43 |
BC4lean.KKTheory.UnitPointCutoff.reducedCutoffProjection_eq_scalarCoefficient | BC4lean/UnitPointCutoff.lean:99 |
BC4lean.KKTheory.UnitScalarDescent.evenClass_coefficientRestriction | BC4lean/UnitScalarDescent.lean:88 |
BC4lean.KKTheory.UnitScalarDescent.evenCoefficientRestrictionIso | BC4lean/UnitScalarDescent.lean:46 |
BC4lean.KKTheory.UnitScalarDescent.oddClass_coefficientRestriction | BC4lean/UnitScalarDescent.lean:127 |
BC4lean.KKTheory.UnitScalarDescent.oddCoefficientRestrictionIso | BC4lean/UnitScalarDescent.lean:66 |
源码 SHA-256:1c6c0899fe9bc9f7860f291ba7c5573353d18a3c5809258769d689bc39da8ad4
1 import Mathlib.Algebra.MonoidAlgebra.Basic 2 import Mathlib.Algebra.MonoidAlgebra.Support 3 import Mathlib.Analysis.Complex.Basic 4 5 /-! 6 # The complex group algebra of an arbitrary group 7 8 This file verifies the algebraic starting point for the reduced group C*-algebra. 9 Multiplication is Mathlib's convolution product, not pointwise multiplication. 10 The involution conjugates coefficients and reverses group elements. 11 No topology, countability, regular representation, or completion is assumed here. 12 -/ 13 14 noncomputable section 15 16 namespace BC4lean 17 18 /-- Finitely supported complex coefficients with convolution multiplication. -/ 19 abbrev GroupAlgebra (Γ : Type*) := MonoidAlgebra ℂ Γ 20 21 namespace GroupAlgebra 22 23 variable {Γ : Type*} [Group Γ] 24 25 /-- The basis vector at a group element. -/ 26 def delta (g : Γ) : GroupAlgebra Γ := MonoidAlgebra.single g 1 27 28 /-- The finite coefficient ℓ¹-norm; no normed-algebra instance is claimed. -/ 29 def l1Norm (a : GroupAlgebra Γ) : ℝ := ∑ g ∈ a.coeff.support, ‖a.coeff g‖ 30 31 /-- Conjugation of coefficients followed by inversion of the group index. -/ 32 def involution (a : GroupAlgebra Γ) : GroupAlgebra Γ := 33 .ofCoeff (Finsupp.equivMapDomain (Equiv.inv Γ) 34 (a.coeff.mapRange star (star_zero ℂ))) 35 36 @[simp] 37 theorem coeff_involution (a : GroupAlgebra Γ) (g : Γ) : 38 (involution a).coeff g = star (a.coeff g⁻¹) := rfl 39 40 @[simp] 41 theorem involution_zero : involution (0 : GroupAlgebra Γ) = 0 := by 42 ext g 43 simp 44 45 theorem involution_add (a b : GroupAlgebra Γ) : 46 involution (a + b) = involution a + involution b := by 47 ext g 48 simp 49 50 theorem involution_smul (z : ℂ) (a : GroupAlgebra Γ) : 51 involution (z • a) = star z • involution a := by 52 ext g 53 simp 54 55 @[simp] 56 theorem involution_involution (a : GroupAlgebra Γ) : 57 involution (involution a) = a := by 58 ext g 59 simp 60 61 @[simp] 62 theorem involution_single (g : Γ) (z : ℂ) : 63 involution (MonoidAlgebra.single g z) = MonoidAlgebra.single g⁻¹ (star z) := by 64 simp only [involution, MonoidAlgebra.coeff_single, Finsupp.mapRange_single, 65 Finsupp.equivMapDomain_single, Equiv.inv_apply, MonoidAlgebra.ofCoeff_single] 66 67 theorem involution_mul (a b : GroupAlgebra Γ) : 68 involution (a * b) = involution b * involution a := by 69 induction a using MonoidAlgebra.induction_linear with 70 | zero => simp 71 | add a c ha hc => simp only [add_mul, involution_add, ha, hc, mul_add] 72 | single g z => 73 induction b using MonoidAlgebra.induction_linear with 74 | zero => simp 75 | add b c hb hc => simp only [mul_add, involution_add, hb, hc, add_mul] 76 | single h w => simp [MonoidAlgebra.single_mul_single, mul_inv_rev, mul_comm] 77 78 /-- The group-algebra star is conjugation combined with inversion. -/ 79 instance instStar : Star (GroupAlgebra Γ) := ⟨involution⟩ 80 81 /-- Convolution and the group-algebra involution form a star ring. -/ 82 instance instStarRing : StarRing (GroupAlgebra Γ) where 83 star_involutive := involution_involution 84 star_mul := involution_mul 85 star_add := involution_add 86 87 /-- The involution is conjugate-linear over the complex scalars. -/ 88 instance instStarModule : StarModule ℂ (GroupAlgebra Γ) where 89 star_smul := involution_smul 90 91 @[simp] 92 theorem coeff_star (a : GroupAlgebra Γ) (g : Γ) : 93 (star a).coeff g = star (a.coeff g⁻¹) := coeff_involution a g 94 95 /-- The multiplication agrees with the blueprint's convolution formula. -/ 96 theorem coeff_convolution (a b : GroupAlgebra Γ) (h : Γ) : 97 (a * b).coeff h = ∑ g ∈ a.coeff.support, a.coeff g * b.coeff (g⁻¹ * h) := 98 MonoidAlgebra.coeff_mul_apply_left a b h 99 100 @[simp] 101 theorem delta_one : delta (1 : Γ) = 1 := rfl 102 103 @[simp] 104 theorem delta_mul (g h : Γ) : delta g * delta h = delta (g * h) := by 105 simp [delta, MonoidAlgebra.single_mul_single] 106 107 @[simp] 108 theorem delta_star (g : Γ) : star (delta g) = delta g⁻¹ := by 109 change involution (MonoidAlgebra.single g 1) = _ 110 simp [delta] 111 112 theorem delta_expansion (a : GroupAlgebra Γ) : 113 ∑ g ∈ a.coeff.support, a.coeff g • delta g = a := by 114 simpa [delta, MonoidAlgebra.smul_single, Finsupp.sum] using a.sum_coeff_single 115 116 open scoped Pointwise in 117 theorem support_convolution [DecidableEq Γ] (a b : GroupAlgebra Γ) : 118 (a * b).coeff.support ⊆ a.coeff.support * b.coeff.support := 119 MonoidAlgebra.support_coeff_mul_subset a b 120 121 theorem support_star (a : GroupAlgebra Γ) : 122 (star a).coeff.support = a.coeff.support.map (Equiv.inv Γ).toEmbedding := by 123 classical 124 ext g 125 simp only [Finsupp.mem_support_iff, coeff_star, star_ne_zero, Finset.mem_map, 126 Equiv.toEmbedding_apply, Equiv.inv_apply] 127 constructor 128 · intro h 129 exact ⟨g⁻¹, h, inv_inv g⟩ 130 · rintro ⟨h, hh, rfl⟩ 131 simpa using hh 132 133 theorem convolution_bilinear (a b c : GroupAlgebra Γ) (z : ℂ) : 134 (a + b) * c = a * c + b * c ∧ a * (b + c) = a * b + a * c ∧ 135 (z • a) * b = z • (a * b) ∧ a * (z • b) = z • (a * b) := 136 ⟨add_mul a b c, mul_add a b c, smul_mul_assoc z a b, mul_smul_comm z a b⟩ 137 138 /-- The laws appearing together in the blueprint's algebraic proposition. -/ 139 theorem star_algebra_laws (a b c : GroupAlgebra Γ) (z w : ℂ) : 140 (a * b) * c = a * (b * c) ∧ 141 (delta 1) * a = a ∧ a * (delta 1) = a ∧ 142 star (a * b) = star b * star a ∧ star (star a) = a ∧ 143 star (z • a + w • b) = star z • star a + star w • star b := by 144 simp only [mul_assoc, delta_one, one_mul, mul_one, star_mul, star_star, 145 star_add, star_smul, and_self] 146 147 end GroupAlgebra 148 end BC4lean
源码 SHA-256:c29e90c17d29b0a55f4ca3e568c275b8246603e15b0f7ebb6b41b43d62d410d4
1 import Mathlib.Analysis.InnerProductSpace.l2Space 2 3 /-! 4 # Square-summable functions and the delta Hilbert basis 5 6 The index type need not be countable or carry a group structure. 7 Mathlib supplies the complete complex inner product space structure on `lp`. 8 Sums are unordered sums over finite subsets, not a chosen enumeration. 9 -/ 10 11 noncomputable section 12 13 namespace BC4lean 14 15 open scoped ENNReal 16 17 /-- Square-summable complex-valued functions, with their Hilbert space structure. -/ 18 abbrev L2Group (Γ : Type*) := lp (fun _ : Γ => ℂ) 2 19 20 namespace L2Group 21 22 variable {Γ : Type*} 23 24 /-- Membership is exactly summability of the squared coefficient norms. -/ 25 theorem mem_iff (f : Γ → ℂ) : 26 Memℓp f 2 ↔ Summable (fun g => ‖f g‖ ^ (2 : ℕ)) := by 27 simpa using (memℓp_gen_iff (by norm_num : 0 < (2 : ℝ≥0∞).toReal) (f := f)) 28 29 /-- Completeness is inherited from Mathlib's `lp` construction. -/ 30 theorem completeSpace : CompleteSpace (L2Group Γ) := inferInstance 31 32 theorem summable_norm_sq (ξ : L2Group Γ) : Summable (fun g => ‖ξ g‖ ^ (2 : ℕ)) := 33 (mem_iff ξ).mp (lp.memℓp ξ) 34 35 theorem norm_sq (ξ : L2Group Γ) : ‖ξ‖ ^ (2 : ℕ) = ∑' g, ‖ξ g‖ ^ (2 : ℕ) := by 36 simpa using lp.norm_rpow_eq_tsum (by norm_num : 0 < (2 : ℝ≥0∞).toReal) ξ 37 38 theorem inner_eq_tsum (ξ η : L2Group Γ) : 39 inner ℂ ξ η = ∑' g, star (ξ g) * η g := by 40 simpa [RCLike.inner_apply, mul_comm] using lp.inner_eq_tsum (𝕜 := ℂ) ξ η 41 42 theorem summable_inner (ξ η : L2Group Γ) : 43 Summable (fun g => star (ξ g) * η g) := by 44 simpa [RCLike.inner_apply, mul_comm] using lp.summable_inner (𝕜 := ℂ) ξ η 45 46 /-- The delta vector at `g`. -/ 47 def delta (g : Γ) : L2Group Γ := by 48 classical 49 exact lp.single 2 g 1 50 51 open scoped Classical in 52 theorem delta_apply (g h : Γ) : delta g h = if h = g then 1 else 0 := by 53 classical 54 simp [delta, lp.single_apply, Pi.single_apply] 55 56 @[simp] theorem delta_apply_self (g : Γ) : delta g g = 1 := by 57 classical 58 simp [delta_apply] 59 60 @[simp] theorem norm_delta (g : Γ) : ‖delta g‖ = 1 := by 61 classical 62 simp only [delta, lp.norm_single (by norm_num : (0 : ℝ≥0∞) < 2), norm_one] 63 64 /-- The identity coordinate representation gives the canonical Hilbert basis. -/ 65 def deltaBasis : HilbertBasis Γ ℂ (L2Group Γ) := 66 HilbertBasis.ofRepr (LinearIsometryEquiv.refl ℂ _) 67 68 @[simp] theorem deltaBasis_apply (g : Γ) : deltaBasis g = delta g := rfl 69 70 theorem delta_orthonormal : Orthonormal ℂ (delta : Γ → L2Group Γ) := 71 deltaBasis.orthonormal 72 73 theorem delta_dense_span : 74 (Submodule.span ℂ (Set.range (delta : Γ → L2Group Γ))).topologicalClosure = ⊤ := 75 deltaBasis.dense_span 76 77 theorem hasSum_delta (ξ : L2Group Γ) : HasSum (fun g => ξ g • delta g) ξ := 78 deltaBasis.hasSum_repr ξ 79 80 @[simp] theorem inner_delta (g : Γ) (ξ : L2Group Γ) : inner ℂ (delta g) ξ = ξ g := 81 (deltaBasis.repr_apply_apply ξ g).symm 82 83 theorem norm_apply_le (ξ : L2Group Γ) (g : Γ) : ‖ξ g‖ ≤ ‖ξ‖ := 84 lp.norm_apply_le_norm (by norm_num : (2 : ℝ≥0∞) ≠ 0) ξ g 85 86 end L2Group 87 end BC4lean
源码 SHA-256:400a9225e55f140dcdca8e494397443be99304852e0d69a4cee8c43e9fd6d0f9
1 import BC4lean.L2Group 2 import Mathlib.Algebra.Star.Unitary 3 import Mathlib.Analysis.InnerProductSpace.Adjoint 4 5 /-! 6 # First milestone: the left regular representation 7 8 We construct translations directly on square-summable functions. No countability 9 assumption is required. All groups in this module are regarded as discrete. 10 -/ 11 12 noncomputable section 13 14 namespace BC4lean 15 16 open scoped ENNReal 17 18 universe u 19 20 variable {Γ : Type u} [Group Γ] 21 22 /-- Left translation preserves square summability by reindexing the sum. -/ 23 theorem memLp_leftTranslate (g : Γ) (ξ : L2Group Γ) : 24 Memℓp (fun h => ξ (g⁻¹ * h)) 2 := by 25 apply memℓp_gen 26 exact (Equiv.mulLeft g⁻¹).summable_iff.mpr 27 ((lp.memℓp ξ).summable (by norm_num)) 28 29 /-- Left translation, before packaging it as a linear isometry. -/ 30 def leftTranslate (g : Γ) (ξ : L2Group Γ) : L2Group Γ := 31 ⟨fun h => ξ (g⁻¹ * h), memLp_leftTranslate g ξ⟩ 32 33 @[simp] theorem leftTranslate_apply (g h : Γ) (ξ : L2Group Γ) : 34 leftTranslate g ξ h = ξ (g⁻¹ * h) := rfl 35 36 @[simp] theorem leftTranslate_one (ξ : L2Group Γ) : leftTranslate 1 ξ = ξ := by 37 apply lp.ext 38 funext h 39 simp 40 41 theorem leftTranslate_mul (g h : Γ) (ξ : L2Group Γ) : 42 leftTranslate (g * h) ξ = leftTranslate g (leftTranslate h ξ) := by 43 apply lp.ext 44 funext k 45 simp [mul_assoc] 46 47 @[simp] theorem leftTranslate_inv_left (g : Γ) (ξ : L2Group Γ) : 48 leftTranslate g⁻¹ (leftTranslate g ξ) = ξ := by 49 rw [← leftTranslate_mul, inv_mul_cancel, leftTranslate_one] 50 51 @[simp] theorem leftTranslate_inv_right (g : Γ) (ξ : L2Group Γ) : 52 leftTranslate g (leftTranslate g⁻¹ ξ) = ξ := by 53 rw [← leftTranslate_mul, mul_inv_cancel, leftTranslate_one] 54 55 /-- Translations preserve the norm, by invariance of a sum under a bijection. -/ 56 @[simp] theorem norm_leftTranslate (g : Γ) (ξ : L2Group Γ) : 57 ‖leftTranslate g ξ‖ = ‖ξ‖ := by 58 rw [lp.norm_eq_tsum_rpow (by norm_num), lp.norm_eq_tsum_rpow (by norm_num)] 59 congr 1 60 exact (Equiv.mulLeft g⁻¹).tsum_eq (fun h => ‖ξ h‖ ^ (2 : ℝ≥0∞).toReal) 61 62 /-- A unitary expressed as a complex-linear isometric equivalence. -/ 63 def leftRegular (g : Γ) : L2Group Γ ≃ₗᵢ[ℂ] L2Group Γ where 64 toFun := leftTranslate g 65 invFun := leftTranslate g⁻¹ 66 left_inv := leftTranslate_inv_left g 67 right_inv := leftTranslate_inv_right g 68 map_add' ξ η := by 69 apply lp.ext 70 rfl 71 map_smul' c ξ := by 72 apply lp.ext 73 rfl 74 norm_map' := norm_leftTranslate g 75 76 @[simp] theorem leftRegular_apply (g h : Γ) (ξ : L2Group Γ) : 77 leftRegular g ξ h = ξ (g⁻¹ * h) := rfl 78 79 theorem leftRegular_inner (g : Γ) (ξ η : L2Group Γ) : 80 inner ℂ (leftRegular g ξ) (leftRegular g η) = inner ℂ ξ η := 81 (leftRegular g).inner_map_map ξ η 82 83 /-- The regular operator in the algebra of bounded complex-linear operators. -/ 84 def regularOperator (g : Γ) : L2Group Γ →L[ℂ] L2Group Γ := 85 (leftRegular g : L2Group Γ →L[ℂ] L2Group Γ) 86 87 @[simp] theorem regularOperator_apply (g h : Γ) (ξ : L2Group Γ) : 88 regularOperator g ξ h = ξ (g⁻¹ * h) := rfl 89 90 @[simp] theorem regularOperator_one : regularOperator (1 : Γ) = 1 := by 91 ext ξ h 92 simp [regularOperator] 93 94 @[simp] theorem regularOperator_mul (g h : Γ) : 95 regularOperator (g * h) = regularOperator g * regularOperator h := by 96 ext ξ k 97 simp [regularOperator, mul_assoc] 98 99 @[simp] theorem regularOperator_star (g : Γ) : 100 star (regularOperator g) = regularOperator g⁻¹ := by 101 change star (leftRegular g : L2Group Γ →L[ℂ] L2Group Γ) = _ 102 rw [LinearIsometryEquiv.star_eq_symm] 103 rfl 104 105 /-- Both unitary identities hold in the bounded-operator algebra. -/ 106 theorem regularOperator_unitary (g : Γ) : 107 star (regularOperator g) * regularOperator g = 1 ∧ 108 regularOperator g * star (regularOperator g) = 1 := by 109 constructor <;> simp [← regularOperator_mul] 110 111 /-- The left regular representation, packaged as a multiplicative map. -/ 112 def operatorRepresentation : Γ →* (L2Group Γ →L[ℂ] L2Group Γ) where 113 toFun := regularOperator 114 map_one' := regularOperator_one 115 map_mul' := regularOperator_mul 116 117 /-- Translation carries the delta vector at `h` to the delta vector at `g * h`. -/ 118 @[simp] theorem regularOperator_delta (g h : Γ) : 119 regularOperator g (L2Group.delta h) = L2Group.delta (g * h) := by 120 classical 121 ext k 122 simp only [regularOperator_apply, L2Group.delta_apply, inv_mul_eq_iff_eq_mul] 123 124 @[simp] theorem norm_regularOperator (g : Γ) : ‖regularOperator g‖ = 1 := by 125 apply le_antisymm 126 · apply ContinuousLinearMap.opNorm_le_bound _ zero_le_one 127 intro ξ 128 change ‖leftTranslate g ξ‖ ≤ 1 * ‖ξ‖ 129 simp only [norm_leftTranslate, one_mul, le_refl] 130 · have h := (regularOperator g).le_opNorm (L2Group.delta (1 : Γ)) 131 simpa only [regularOperator_delta, L2Group.norm_delta, mul_one] using h 132 133 /-- The left regular representation with values in the unitary group. -/ 134 def regularRepresentation : Γ →* unitary (L2Group Γ →L[ℂ] L2Group Γ) where 135 toFun g := ⟨regularOperator g, Unitary.mem_iff.mpr (regularOperator_unitary g)⟩ 136 map_one' := Subtype.ext regularOperator_one 137 map_mul' g h := Subtype.ext (regularOperator_mul g h) 138 139 @[simp] theorem regularRepresentation_coe (g : Γ) : 140 (regularRepresentation g : L2Group Γ →L[ℂ] L2Group Γ) = regularOperator g := rfl 141 142 @[simp] theorem regularRepresentation_apply (g h : Γ) (ξ : L2Group Γ) : 143 (regularRepresentation g : L2Group Γ →L[ℂ] L2Group Γ) ξ h = ξ (g⁻¹ * h) := rfl 144 145 end BC4lean
源码 SHA-256:6127ba4543ef7f420056752bcf1731c553a597fe59bc402b8b9af38146f48df0
1 import BC4lean.GroupAlgebra 2 import BC4lean.LeftRegularRepresentation 3 import Mathlib.Analysis.CStarAlgebra.ContinuousLinearMap 4 5 /-! # The integrated regular representation and reduced norm 6 7 All groups are regarded as discrete. No countability assumption is used. 8 The algebra homomorphism is Mathlib's linear extension of the regular operators; 9 compatibility with the group-algebra involution is proved below. 10 -/ 11 12 noncomputable section 13 14 namespace BC4lean 15 16 variable {Γ : Type*} [Group Γ] 17 18 /-- The linear extension of the regular operators to the complex group algebra. -/ 19 def integratedRepresentation : GroupAlgebra Γ →ₐ[ℂ] (L2Group Γ →L[ℂ] L2Group Γ) := 20 MonoidAlgebra.lift ℂ _ Γ operatorRepresentation 21 22 theorem integratedRepresentation_sum (a : GroupAlgebra Γ) : 23 integratedRepresentation a = ∑ g ∈ a.coeff.support, a.coeff g • regularOperator g := 24 MonoidAlgebra.lift_apply operatorRepresentation a 25 26 @[simp] theorem integratedRepresentation_single (g : Γ) (z : ℂ) : 27 integratedRepresentation (MonoidAlgebra.single g z) = z • regularOperator g := 28 MonoidAlgebra.lift_single operatorRepresentation g z 29 30 @[simp] theorem integratedRepresentation_delta (g : Γ) : 31 integratedRepresentation (GroupAlgebra.delta g) = regularOperator g := by 32 simp [GroupAlgebra.delta] 33 34 theorem integratedRepresentation_apply (a : GroupAlgebra Γ) (ξ : L2Group Γ) (h : Γ) : 35 integratedRepresentation a ξ h = 36 ∑ g ∈ a.coeff.support, a.coeff g * ξ (g⁻¹ * h) := by 37 rw [integratedRepresentation_sum] 38 simp only [sum_apply, smul_apply, lp.coeFn_sum, 39 lp.coeFn_smul, Finset.sum_apply, Pi.smul_apply, smul_eq_mul, regularOperator_apply] 40 41 theorem norm_integratedRepresentation_le (a : GroupAlgebra Γ) : 42 ‖integratedRepresentation a‖ ≤ GroupAlgebra.l1Norm a := by 43 rw [integratedRepresentation_sum] 44 calc 45 _ ≤ ∑ g ∈ a.coeff.support, ‖a.coeff g • regularOperator g‖ := norm_sum_le _ _ 46 _ = GroupAlgebra.l1Norm a := by simp [GroupAlgebra.l1Norm, norm_smul] 47 48 @[simp] theorem integratedRepresentation_star (a : GroupAlgebra Γ) : 49 integratedRepresentation (star a) = star (integratedRepresentation a) := by 50 induction a using MonoidAlgebra.induction_linear with 51 | zero => simp 52 | add a b ha hb => simp only [star_add, map_add, ha, hb] 53 | single g z => 54 change integratedRepresentation (GroupAlgebra.involution (MonoidAlgebra.single g z)) = _ 55 simp only [GroupAlgebra.involution_single, integratedRepresentation_single, 56 star_smul, regularOperator_star] 57 58 /-- The integrated representation as a unital complex star-algebra homomorphism. -/ 59 def integratedStarHom : GroupAlgebra Γ →⋆ₐ[ℂ] (L2Group Γ →L[ℂ] L2Group Γ) where 60 toAlgHom := integratedRepresentation 61 map_star' := integratedRepresentation_star 62 63 @[simp] theorem integratedStarHom_apply (a : GroupAlgebra Γ) : 64 integratedStarHom a = integratedRepresentation a := rfl 65 66 /-- Coefficients are recovered by applying the operator to the identity delta vector. -/ 67 @[simp] theorem integratedRepresentation_delta_one (a : GroupAlgebra Γ) (h : Γ) : 68 integratedRepresentation a (L2Group.delta 1) h = a.coeff h := by 69 classical 70 induction a using MonoidAlgebra.induction_linear with 71 | zero => simp 72 | add a b ha hb => simpa using congrArg₂ (· + ·) ha hb 73 | single g z => 74 simp [L2Group.delta_apply, Finsupp.single_apply, eq_comm] 75 76 theorem integratedRepresentation_injective : 77 Function.Injective (integratedRepresentation (Γ := Γ)) := by 78 intro a b hab 79 apply MonoidAlgebra.ext 80 apply Finsupp.ext 81 intro h 82 simpa using congrArg (fun T : L2Group Γ →L[ℂ] L2Group Γ => T (L2Group.delta 1) h) hab 83 84 /-- The coefficient function as an ℓ²-vector; the next theorem identifies it pointwise. -/ 85 def GroupAlgebra.toL2 (a : GroupAlgebra Γ) : L2Group Γ := 86 integratedRepresentation a (L2Group.delta 1) 87 88 @[simp] theorem GroupAlgebra.toL2_apply (a : GroupAlgebra Γ) (h : Γ) : 89 a.toL2 h = a.coeff h := integratedRepresentation_delta_one a h 90 91 theorem norm_toL2_le (a : GroupAlgebra Γ) : ‖a.toL2‖ ≤ ‖integratedRepresentation a‖ := by 92 simpa only [GroupAlgebra.toL2, L2Group.norm_delta, mul_one] using 93 (integratedRepresentation a).le_opNorm (L2Group.delta (1 : Γ)) 94 95 theorem norm_coeff_le (a : GroupAlgebra Γ) (h : Γ) : 96 ‖a.coeff h‖ ≤ ‖integratedRepresentation a‖ := by 97 simpa only [GroupAlgebra.toL2_apply] using 98 (L2Group.norm_apply_le a.toL2 h).trans (norm_toL2_le a) 99 100 /-- The algebraic image is exactly the finite complex span of the regular operators. -/ 101 theorem integratedRepresentation_range : 102 (integratedRepresentation (Γ := Γ)).range.toSubmodule = 103 Submodule.span ℂ (Set.range (regularOperator (Γ := Γ))) := by 104 apply le_antisymm 105 · rintro T ⟨a, rfl⟩ 106 change integratedRepresentation a ∈ Submodule.span ℂ (Set.range regularOperator) 107 induction a using MonoidAlgebra.induction_linear with 108 | zero => simp 109 | add a b ha hb => 110 rw [map_add] 111 exact Submodule.add_mem _ ha hb 112 | single g z => 113 rw [integratedRepresentation_single] 114 exact Submodule.smul_mem _ z (Submodule.subset_span ⟨g, rfl⟩) 115 · apply Submodule.span_le.mpr 116 rintro T ⟨g, rfl⟩ 117 exact ⟨GroupAlgebra.delta g, integratedRepresentation_delta g⟩ 118 119 /-- The reduced norm is the norm of the faithful regular operator. -/ 120 def reducedNorm (a : GroupAlgebra Γ) : ℝ := ‖integratedRepresentation a‖ 121 122 theorem reducedNorm_nonneg (a : GroupAlgebra Γ) : 0 ≤ reducedNorm a := norm_nonneg _ 123 124 @[simp] theorem reducedNorm_eq_zero (a : GroupAlgebra Γ) : reducedNorm a = 0 ↔ a = 0 := by 125 simp only [reducedNorm, norm_eq_zero, map_eq_zero_iff _ integratedRepresentation_injective] 126 127 theorem reducedNorm_add_le (a b : GroupAlgebra Γ) : 128 reducedNorm (a + b) ≤ reducedNorm a + reducedNorm b := by 129 simpa only [reducedNorm, map_add] using norm_add_le (integratedRepresentation a) _ 130 131 theorem reducedNorm_smul (z : ℂ) (a : GroupAlgebra Γ) : 132 reducedNorm (z • a) = ‖z‖ * reducedNorm a := by 133 simp only [reducedNorm, map_smul, norm_smul] 134 135 theorem reducedNorm_mul_le (a b : GroupAlgebra Γ) : 136 reducedNorm (a * b) ≤ reducedNorm a * reducedNorm b := by 137 simpa only [reducedNorm, map_mul] using norm_mul_le (integratedRepresentation a) _ 138 139 @[simp] theorem reducedNorm_star (a : GroupAlgebra Γ) : reducedNorm (star a) = reducedNorm a := by 140 unfold reducedNorm 141 rw [integratedRepresentation_star] 142 exact norm_star (integratedRepresentation a) 143 144 theorem reducedNorm_cstar (a : GroupAlgebra Γ) : 145 reducedNorm (star a * a) = reducedNorm a ^ 2 := by 146 unfold reducedNorm 147 rw [map_mul, integratedRepresentation_star] 148 simpa only [pow_two] using CStarRing.norm_star_mul_self (x := integratedRepresentation a) 149 150 @[simp] theorem reducedNorm_delta (g : Γ) : reducedNorm (GroupAlgebra.delta g) = 1 := by 151 simp only [reducedNorm, integratedRepresentation_delta, norm_regularOperator] 152 153 theorem reducedNorm_bounds (a : GroupAlgebra Γ) : 154 ‖a.toL2‖ ≤ reducedNorm a ∧ reducedNorm a ≤ GroupAlgebra.l1Norm a := 155 ⟨norm_toL2_le a, norm_integratedRepresentation_le a⟩ 156 157 end BC4lean
源码 SHA-256:96917b6794dc08f3ea214d34285484632b8f7c4a1247dfd480949707cd2da173
1 import BC4lean.IntegratedRepresentation 2 import Mathlib.Analysis.CStarAlgebra.ContinuousLinearMap 3 4 /-! # The concrete reduced group C⋆-algebra 5 6 The underlying set is the operator-norm closure of the integrated regular image. 7 The C⋆-algebra structure is inherited from bounded operators on ℓ²(Γ). 8 -/ 9 10 noncomputable section 11 12 namespace BC4lean 13 14 variable (Γ : Type*) [Group Γ] 15 16 /-- The closed star subalgebra generated by the integrated regular image. -/ 17 def reducedAlgebra : StarSubalgebra ℂ (L2Group Γ →L[ℂ] L2Group Γ) := 18 (integratedStarHom (Γ := Γ)).range.topologicalClosure 19 20 /-- The concrete reduced group C⋆-algebra. -/ 21 abbrev ReducedGroupCStar := ↥(reducedAlgebra Γ) 22 23 variable {Γ} 24 25 theorem reducedAlgebra_coe_eq_closure_range : 26 (reducedAlgebra Γ : Set (L2Group Γ →L[ℂ] L2Group Γ)) = 27 closure (Set.range (integratedRepresentation (Γ := Γ))) := rfl 28 29 theorem reducedAlgebra_isClosed : 30 IsClosed (reducedAlgebra Γ : Set (L2Group Γ →L[ℂ] L2Group Γ)) := 31 isClosed_closure 32 33 instance reducedGroupCStarAlgebra : CStarAlgebra (ReducedGroupCStar Γ) := 34 StarSubalgebra.cstarAlgebra _ (h_closed := reducedAlgebra_isClosed) 35 36 /-- The identity regular operator has norm one, also for the trivial group. -/ 37 instance regularOperatorsNormOne : NormOneClass (L2Group Γ →L[ℂ] L2Group Γ) where 38 norm_one := by 39 simpa only [regularOperator_one] using norm_regularOperator (1 : Γ) 40 41 instance reducedGroupCStarNormOne : NormOneClass (ReducedGroupCStar Γ) where 42 norm_one := by 43 change ‖(1 : L2Group Γ →L[ℂ] L2Group Γ)‖ = 1 44 exact norm_one 45 46 /-- The canonical faithful star homomorphism with dense image. -/ 47 def integratedToReduced : GroupAlgebra Γ →⋆ₐ[ℂ] ReducedGroupCStar Γ := 48 integratedStarHom.codRestrict (reducedAlgebra Γ) 49 (fun a => subset_closure ⟨a, rfl⟩) 50 51 @[simp] theorem integratedToReduced_coe (a : GroupAlgebra Γ) : 52 (integratedToReduced a : L2Group Γ →L[ℂ] L2Group Γ) = 53 integratedRepresentation a := rfl 54 55 theorem integratedToReduced_injective : 56 Function.Injective (integratedToReduced (Γ := Γ)) := by 57 intro a b h 58 exact integratedRepresentation_injective (congrArg Subtype.val h) 59 60 @[simp] theorem norm_integratedToReduced (a : GroupAlgebra Γ) : 61 ‖integratedToReduced a‖ = reducedNorm a := rfl 62 63 theorem denseRange_integratedToReduced : 64 DenseRange (integratedToReduced (Γ := Γ)) := by 65 intro T 66 rw [closure_subtype, ← Set.range_comp] 67 change (T : L2Group Γ →L[ℂ] L2Group Γ) ∈ 68 closure (Set.range (integratedRepresentation (Γ := Γ))) 69 rw [← reducedAlgebra_coe_eq_closure_range] 70 exact T.property 71 72 theorem regularOperator_mem_reducedAlgebra (g : Γ) : 73 regularOperator g ∈ reducedAlgebra Γ := 74 subset_closure ⟨GroupAlgebra.delta g, integratedRepresentation_delta g⟩ 75 76 theorem reducedAlgebra_coe_eq_closure_span : 77 (reducedAlgebra Γ : Set (L2Group Γ →L[ℂ] L2Group Γ)) = 78 closure (Submodule.span ℂ (Set.range (regularOperator (Γ := Γ))) : 79 Set (L2Group Γ →L[ℂ] L2Group Γ)) := by 80 rw [← integratedRepresentation_range] 81 rfl 82 83 /-- Minimality among closed complex star subalgebras containing all regular operators. -/ 84 theorem reducedAlgebra_minimal (S : StarSubalgebra ℂ (L2Group Γ →L[ℂ] L2Group Γ)) 85 (hS : IsClosed (S : Set (L2Group Γ →L[ℂ] L2Group Γ))) 86 (h : ∀ g : Γ, regularOperator g ∈ S) : reducedAlgebra Γ ≤ S := by 87 apply StarSubalgebra.topologicalClosure_minimal _ hS 88 rintro T ⟨a, rfl⟩ 89 change integratedRepresentation a ∈ S 90 induction a using MonoidAlgebra.induction_linear with 91 | zero => simp 92 | add a b ha hb => 93 rw [map_add] 94 exact S.add_mem ha hb 95 | single g z => simpa only [integratedRepresentation_single] using S.smul_mem (h g) z 96 97 /-- Countability is needed here, but not for the C⋆-algebra construction. -/ 98 instance reducedGroupCStarSeparable [Countable Γ] : TopologicalSpace.SeparableSpace (ReducedGroupCStar Γ) := by 99 apply TopologicalSpace.IsSeparable.separableSpace 100 rw [reducedAlgebra_coe_eq_closure_span] 101 exact ((Set.countable_range (regularOperator (Γ := Γ))).isSeparable.span (R := ℂ)).closure 102 103 end BC4lean
源码 SHA-256:3f678a1bd54481bc533b3804cd45ddfc9bab48605ccc730ddf7368799a562df0
1 import BC4lean.ReducedGroupCStar 2 3 /-! # The reduced group C⋆-algebra of a trivial group -/ 4 5 noncomputable section 6 7 namespace BC4lean 8 9 variable {Γ : Type*} [Group Γ] [Subsingleton Γ] 10 11 theorem reducedAlgebra_le_scalars : 12 reducedAlgebra Γ ≤ (StarAlgHom.ofId ℂ (L2Group Γ →L[ℂ] L2Group Γ)).range := by 13 apply reducedAlgebra_minimal 14 · exact (algebraMap_isometry (𝕜 := ℂ) (𝕜' := L2Group Γ →L[ℂ] L2Group Γ)).isClosedEmbedding.isClosed_range 15 · intro g 16 refine ⟨1, ?_⟩ 17 rw [Subsingleton.elim g 1, regularOperator_one] 18 exact map_one _ 19 20 theorem scalarToReduced_surjective : 21 Function.Surjective (StarAlgHom.ofId ℂ (ReducedGroupCStar Γ)) := by 22 intro T 23 obtain ⟨z, hz⟩ := reducedAlgebra_le_scalars T.property 24 refine ⟨z, Subtype.ext ?_⟩ 25 exact hz 26 27 /-- Canonical scalar identification for any group with one element. -/ 28 def trivialReducedEquiv : ℂ ≃⋆ₐ[ℂ] ReducedGroupCStar Γ := 29 StarAlgEquiv.ofBijective (StarAlgHom.ofId ℂ (ReducedGroupCStar Γ)) 30 ⟨(algebraMap_isometry (𝕜 := ℂ) (𝕜' := ReducedGroupCStar Γ)).injective, 31 scalarToReduced_surjective⟩ 32 33 @[simp] theorem trivialReducedEquiv_apply (z : ℂ) : 34 trivialReducedEquiv (Γ := Γ) z = algebraMap ℂ (ReducedGroupCStar Γ) z := rfl 35 36 theorem trivialReducedEquiv_isometry : Isometry (trivialReducedEquiv (Γ := Γ)) := 37 algebraMap_isometry ℂ (ReducedGroupCStar Γ) 38 39 end BC4lean
源码 SHA-256:b65b835545d92cb8cf33e3eb4748008cb1a3bd6a9fc8465da8ac2b72a49a2446
1 import BC4lean.ReducedGroupCStar 2 3 /-! # The group algebra with its reduced norm 4 5 A dedicated type synonym keeps this norm separate from possible ℓ¹ norms. 6 The algebraic operations are precisely those of `GroupAlgebra Γ`. 7 -/ 8 9 noncomputable section 10 namespace BC4lean 11 12 variable (Γ : Type*) [Group Γ] 13 14 /-- The complex group algebra, reserved for the reduced-norm topology. -/ 15 def ReducedNormGroupAlgebra := GroupAlgebra Γ 16 17 namespace ReducedNormGroupAlgebra 18 19 instance instRing : Ring (ReducedNormGroupAlgebra Γ) := 20 inferInstanceAs (Ring (GroupAlgebra Γ)) 21 instance instAlgebra : Algebra ℂ (ReducedNormGroupAlgebra Γ) := 22 inferInstanceAs (Algebra ℂ (GroupAlgebra Γ)) 23 instance instStarRing : StarRing (ReducedNormGroupAlgebra Γ) := 24 inferInstanceAs (StarRing (GroupAlgebra Γ)) 25 instance instStarModule : StarModule ℂ (ReducedNormGroupAlgebra Γ) := 26 inferInstanceAs (StarModule ℂ (GroupAlgebra Γ)) 27 28 /-- Identity on coefficients; only the choice of topological structure changes. -/ 29 def ofGroupAlgebra : GroupAlgebra Γ ≃⋆ₐ[ℂ] ReducedNormGroupAlgebra Γ := 30 StarAlgEquiv.refl ℂ (GroupAlgebra Γ) 31 32 def toReduced : ReducedNormGroupAlgebra Γ →⋆ₐ[ℂ] ReducedGroupCStar Γ := 33 integratedToReduced 34 35 theorem toReduced_injective : Function.Injective (toReduced Γ) := 36 integratedToReduced_injective 37 38 instance instNormedRing : NormedRing (ReducedNormGroupAlgebra Γ) := 39 NormedRing.induced _ _ (toReduced Γ) (toReduced_injective Γ) 40 instance instNormedAlgebra : NormedAlgebra ℂ (ReducedNormGroupAlgebra Γ) := 41 NormedAlgebra.induced ℂ _ _ (toReduced Γ) 42 43 @[simp] theorem norm_ofGroupAlgebra (a : GroupAlgebra Γ) : 44 ‖ofGroupAlgebra Γ a‖ = reducedNorm a := rfl 45 46 @[simp] theorem norm_toReduced (a : ReducedNormGroupAlgebra Γ) : 47 ‖toReduced Γ a‖ = ‖a‖ := rfl 48 49 instance instNormedStarGroup : NormedStarGroup (ReducedNormGroupAlgebra Γ) where 50 norm_star_le a := by 51 change ‖toReduced Γ (star a)‖ ≤ ‖toReduced Γ a‖ 52 rw [map_star] 53 exact (norm_star (toReduced Γ a)).le 54 55 instance instCStarRing : CStarRing (ReducedNormGroupAlgebra Γ) where 56 norm_mul_self_le a := by 57 change ‖toReduced Γ a‖ * ‖toReduced Γ a‖ ≤ ‖toReduced Γ (star a * a)‖ 58 rw [map_mul, map_star] 59 exact CStarRing.norm_star_mul_self.symm.le 60 61 theorem toReduced_isometry : Isometry (toReduced Γ) := 62 AddMonoidHomClass.isometry_of_norm (toReduced Γ) (norm_toReduced Γ) 63 64 theorem toReduced_denseRange : DenseRange (toReduced Γ) := 65 denseRange_integratedToReduced 66 67 end ReducedNormGroupAlgebra 68 end BC4lean
源码 SHA-256:27bc0c056893f22d9ed1a17462215a71356768e9d5435025630aa3cb025b2754
1 import BC4lean.ReducedNormGroupAlgebra 2 import Mathlib.Analysis.Normed.Module.Completion 3 4 /-! # The abstract reduced-norm completion and its concrete realization 5 6 The source is Mathlib's uniform completion of the reduced-norm group algebra. 7 Its ring, complex module and algebra operations are the standard completion 8 operations. Its star is `Completion.map star`, not a transported operation. 9 -/ 10 11 noncomputable section 12 namespace BC4lean 13 open UniformSpace 14 15 variable (Γ : Type*) [Group Γ] 16 17 /-- Abstract norm completion of the complex group algebra with reduced norm. -/ 18 abbrev ReducedCompletion := Completion (ReducedNormGroupAlgebra Γ) 19 20 /-- Continuous extension of the canonical ring homomorphism. -/ 21 def completionMap : ReducedCompletion Γ →+* ReducedGroupCStar Γ := 22 Completion.extensionHom (ReducedNormGroupAlgebra.toReduced Γ).toAlgHom.toRingHom 23 (ReducedNormGroupAlgebra.toReduced_isometry Γ).continuous 24 25 @[simp] theorem completionMap_coe (a : ReducedNormGroupAlgebra Γ) : 26 completionMap Γ (a : ReducedCompletion Γ) = ReducedNormGroupAlgebra.toReduced Γ a := 27 Completion.extensionHom_coe _ _ a 28 29 theorem completionMap_isometry : Isometry (completionMap Γ) := 30 (ReducedNormGroupAlgebra.toReduced_isometry Γ).completion_extension 31 32 theorem completionMap_injective : Function.Injective (completionMap Γ) := 33 (completionMap_isometry Γ).injective 34 35 @[simp] theorem norm_completionMap (x : ReducedCompletion Γ) : 36 ‖completionMap Γ x‖ = ‖x‖ := by 37 simpa only [map_zero, dist_zero_right] using (completionMap_isometry Γ).dist_eq x 0 38 39 theorem completionMap_surjective : Function.Surjective (completionMap Γ) := by 40 intro T 41 have hsubset : Set.range (ReducedNormGroupAlgebra.toReduced Γ) ⊆ 42 Set.range (completionMap Γ) := by 43 rintro _ ⟨a, rfl⟩ 44 exact ⟨(a : ReducedCompletion Γ), completionMap_coe Γ a⟩ 45 have h := closure_mono hsubset (ReducedNormGroupAlgebra.toReduced_denseRange Γ T) 46 rwa [(completionMap_isometry Γ).isClosedEmbedding.isClosed_range.closure_eq] at h 47 48 /-- Complex-linearity of the canonical extension. -/ 49 def completionAlgHom : ReducedCompletion Γ →ₐ[ℂ] ReducedGroupCStar Γ where 50 toRingHom := completionMap Γ 51 commutes' z := by 52 change completionMap Γ ((algebraMap ℂ (ReducedNormGroupAlgebra Γ) z : 53 ReducedNormGroupAlgebra Γ) : ReducedCompletion Γ) = _ 54 rw [completionMap_coe] 55 exact (ReducedNormGroupAlgebra.toReduced Γ).commutes z 56 57 instance completionStar : Star (ReducedCompletion Γ) := 58 ⟨Completion.map (star : ReducedNormGroupAlgebra Γ → ReducedNormGroupAlgebra Γ)⟩ 59 60 @[simp] theorem completion_star_coe (a : ReducedNormGroupAlgebra Γ) : 61 star (a : ReducedCompletion Γ) = (star a : ReducedNormGroupAlgebra Γ) := 62 Completion.map_coe star_isometry.uniformContinuous a 63 64 instance completionContinuousStar : ContinuousStar (ReducedCompletion Γ) := 65 ⟨Completion.continuous_map⟩ 66 67 theorem completionMap_star (x : ReducedCompletion Γ) : 68 completionMap Γ (star x) = star (completionMap Γ x) := by 69 induction x using Completion.induction_on with 70 | hp => 71 exact isClosed_eq ((completionMap_isometry Γ).continuous.comp continuous_star) 72 (continuous_star.comp (completionMap_isometry Γ).continuous) 73 | ih a => simp only [completion_star_coe, completionMap_coe, map_star] 74 75 instance completionStarRing : StarRing (ReducedCompletion Γ) := 76 (completionMap_injective Γ).starRing (completionMap Γ) 77 (completionMap_star Γ) (map_add _) (map_mul _) 78 79 instance completionStarModule : StarModule ℂ (ReducedCompletion Γ) := 80 Function.Injective.starModule (completionMap Γ) ℂ (completionMap_injective Γ) 81 (completionMap_star Γ) (map_smul (completionAlgHom Γ)) 82 83 instance completionNormedAlgebra : NormedAlgebra ℂ (ReducedCompletion Γ) where 84 norm_smul_le := norm_smul_le 85 86 instance completionCStarRing : CStarRing (ReducedCompletion Γ) where 87 norm_mul_self_le x := by 88 rw [← norm_completionMap Γ x, ← norm_completionMap Γ (star x * x), 89 map_mul, completionMap_star] 90 exact CStarRing.norm_star_mul_self.symm.le 91 92 instance completionCStarAlgebra : CStarAlgebra (ReducedCompletion Γ) where 93 94 /-- The extended map as a unital complex star-algebra homomorphism. -/ 95 def completionStarHom : ReducedCompletion Γ →⋆ₐ[ℂ] ReducedGroupCStar Γ where 96 toAlgHom := completionAlgHom Γ 97 map_star' := completionMap_star Γ 98 99 /-- The abstract norm completion is canonically the concrete reduced group C⋆-algebra. -/ 100 def reducedCompletionEquiv : ReducedCompletion Γ ≃⋆ₐ[ℂ] ReducedGroupCStar Γ := 101 StarAlgEquiv.ofBijective (completionStarHom Γ) 102 ⟨completionMap_injective Γ, completionMap_surjective Γ⟩ 103 104 theorem reducedCompletionEquiv_isometry : Isometry (reducedCompletionEquiv Γ) := 105 completionMap_isometry Γ 106 107 @[simp] theorem reducedCompletionEquiv_coe (a : ReducedNormGroupAlgebra Γ) : 108 reducedCompletionEquiv Γ (a : ReducedCompletion Γ) = 109 ReducedNormGroupAlgebra.toReduced Γ a := completionMap_coe Γ a 110 111 /-- The original algebra embeds in the abstract completion. -/ 112 def groupAlgebraToCompletion : GroupAlgebra Γ →⋆ₐ[ℂ] ReducedCompletion Γ where 113 toAlgHom := 114 { toRingHom := Completion.coeRingHom.comp 115 (ReducedNormGroupAlgebra.ofGroupAlgebra Γ).toAlgEquiv.toAlgHom.toRingHom 116 commutes' _ := rfl } 117 map_star' a := (completion_star_coe Γ (ReducedNormGroupAlgebra.ofGroupAlgebra Γ a)).symm 118 119 @[simp] theorem norm_groupAlgebraToCompletion (a : GroupAlgebra Γ) : 120 ‖groupAlgebraToCompletion Γ a‖ = reducedNorm a := 121 Completion.norm_coe (ReducedNormGroupAlgebra.ofGroupAlgebra Γ a) 122 123 @[simp] theorem reducedCompletionEquiv_extends (a : GroupAlgebra Γ) : 124 reducedCompletionEquiv Γ (groupAlgebraToCompletion Γ a) = integratedToReduced a := 125 completionMap_coe Γ (ReducedNormGroupAlgebra.ofGroupAlgebra Γ a) 126 127 /-- Uniqueness already holds among all continuous functions with the prescribed restriction. -/ 128 theorem reducedCompletionEquiv_unique (f : ReducedCompletion Γ → ReducedGroupCStar Γ) 129 (hf : Continuous f) 130 (h : ∀ a : GroupAlgebra Γ, f (groupAlgebraToCompletion Γ a) = integratedToReduced a) : 131 f = reducedCompletionEquiv Γ := by 132 apply Completion.ext hf (reducedCompletionEquiv_isometry Γ).continuous 133 intro a 134 obtain ⟨b, rfl⟩ := (ReducedNormGroupAlgebra.ofGroupAlgebra Γ).surjective a 135 exact (h b).trans (reducedCompletionEquiv_extends Γ b).symm 136 137 /-- In particular the extension is the unique isometric star-algebra isomorphism. -/ 138 theorem reducedCompletionEquiv_unique_isometric 139 (e : ReducedCompletion Γ ≃⋆ₐ[ℂ] ReducedGroupCStar Γ) (he : Isometry e) 140 (h : ∀ a : GroupAlgebra Γ, e (groupAlgebraToCompletion Γ a) = integratedToReduced a) : 141 e = reducedCompletionEquiv Γ := by 142 apply DFunLike.coe_injective 143 exact reducedCompletionEquiv_unique Γ e he.continuous h 144 145 end BC4lean
源码 SHA-256:ebd907953cb61d6852bdec4eab229baa97b554af4c4010f998f3febb913ce0c3
1 import Mathlib.Analysis.CStarAlgebra.Classes 2 import Mathlib.Algebra.Star.StarProjection 3 4 /-! # Projections and Murray–von Neumann equivalence 5 6 Projection-level foundations for operator K₀. The two support equations for 7 partial isometries are consequences of the C⋆-identity, not extra assumptions. 8 -/ 9 10 noncomputable section 11 namespace BC4lean.OperatorKTheory 12 13 variable {A B C : Type*} [CStarAlgebra A] [CStarAlgebra B] [CStarAlgebra C] 14 15 /-- A projection in a unital complex C⋆-algebra. -/ 16 abbrev Projection (A : Type*) [CStarAlgebra A] := {p : A // IsStarProjection p} 17 18 namespace Projection 19 20 @[simp] theorem star_coe (p : Projection A) : star (p : A) = p := 21 p.property.isSelfAdjoint.star_eq 22 23 @[simp] theorem mul_self (p : Projection A) : (p : A) * p = p := 24 p.property.isIdempotentElem.eq 25 26 def zero : Projection A := ⟨0, IsStarProjection.zero A⟩ 27 def one : Projection A := ⟨1, IsStarProjection.one A⟩ 28 def complement (p : Projection A) : Projection A := ⟨1 - p, p.property.one_sub⟩ 29 30 def map (φ : A →⋆ₐ[ℂ] B) (p : Projection A) : Projection B := 31 ⟨φ p, p.property.map φ⟩ 32 33 @[simp] theorem map_coe (φ : A →⋆ₐ[ℂ] B) (p : Projection A) : 34 (map φ p : B) = φ p := rfl 35 36 @[simp] theorem map_id (p : Projection A) : map (StarAlgHom.id ℂ A) p = p := rfl 37 38 @[simp] theorem map_comp (ψ : B →⋆ₐ[ℂ] C) (φ : A →⋆ₐ[ℂ] B) (p : Projection A) : 39 map (ψ.comp φ) p = map ψ (map φ p) := rfl 40 41 @[simp] theorem map_zero (φ : A →⋆ₐ[ℂ] B) : map φ zero = zero := 42 Subtype.ext (_root_.map_zero φ) 43 44 @[simp] theorem map_one (φ : A →⋆ₐ[ℂ] B) : map φ one = one := 45 Subtype.ext (_root_.map_one φ) 46 47 /-- The initial projection acts as the right support of a partial isometry. -/ 48 theorem right_support (p : Projection A) (v : A) (hv : star v * v = p) : v * p = v := by 49 apply sub_eq_zero.mp 50 apply (CStarRing.star_mul_self_eq_zero_iff (v * p - v)).mp 51 have h₁ : star v * (v * p) = p := by rw [← mul_assoc, hv, mul_self] 52 simp only [star_sub, star_mul, star_coe, sub_mul, mul_sub, mul_assoc, h₁, hv, 53 mul_self, sub_self] 54 55 /-- Equivalence implemented by the usual two partial-isometry equations. -/ 56 def Equivalent (p q : Projection A) : Prop := 57 ∃ v : A, star v * v = p ∧ v * star v = q 58 59 theorem equivalent_refl (p : Projection A) : Equivalent p p := 60 ⟨p, by simp, by simp⟩ 61 62 theorem equivalent_symm {p q : Projection A} (h : Equivalent p q) : Equivalent q p := by 63 obtain ⟨v, hv, hv'⟩ := h 64 exact ⟨star v, by simpa using hv', by simpa using hv⟩ 65 66 theorem equivalent_trans {p q r : Projection A} 67 (hpq : Equivalent p q) (hqr : Equivalent q r) : Equivalent p r := by 68 obtain ⟨v, hv, hv'⟩ := hpq 69 obtain ⟨w, hw, hw'⟩ := hqr 70 have hvp := right_support p v hv 71 have hqv : (q : A) * v = v := by rw [← hv', mul_assoc, hv, hvp] 72 have hwq := right_support q w hw 73 refine ⟨w * v, ?_, ?_⟩ 74 · calc 75 star (w * v) * (w * v) = star v * (star w * w) * v := by simp only [star_mul, mul_assoc] 76 _ = star v * q * v := by rw [hw] 77 _ = p := by rw [mul_assoc, hqv, hv] 78 · calc 79 (w * v) * star (w * v) = w * (v * star v) * star w := by simp only [star_mul, mul_assoc] 80 _ = w * q * star w := by rw [hv'] 81 _ = r := by rw [hwq, hw'] 82 83 /-- Equivalence classes at a fixed algebra, in particular a fixed matrix size. -/ 84 def equivalenceSetoid : Setoid (Projection A) where 85 r := Equivalent 86 iseqv := ⟨equivalent_refl, equivalent_symm, equivalent_trans⟩ 87 88 abbrev Classes (A : Type*) [CStarAlgebra A] := Quotient (equivalenceSetoid (A := A)) 89 90 theorem equivalent_map (φ : A →⋆ₐ[ℂ] B) {p q : Projection A} 91 (h : Equivalent p q) : Equivalent (map φ p) (map φ q) := by 92 obtain ⟨v, hv, hv'⟩ := h 93 refine ⟨φ v, ?_, ?_⟩ 94 · simpa only [map_mul, map_star, map_coe] using congrArg φ hv 95 · simpa only [map_mul, map_star, map_coe] using congrArg φ hv' 96 97 def mapClasses (φ : A →⋆ₐ[ℂ] B) : Classes A → Classes B := 98 Quotient.map (map φ) (fun _ _ h => equivalent_map φ h) 99 100 @[simp] theorem mapClasses_mk (φ : A →⋆ₐ[ℂ] B) (p : Projection A) : 101 mapClasses φ (Quotient.mk _ p) = Quotient.mk _ (map φ p) := rfl 102 103 end Projection 104 end BC4lean.OperatorKTheory
源码 SHA-256:ed088f2a4c275e44cb052d1304c855e6e966b5ecdbad4881ddbdd38bfd4c59e1
1 import BC4lean.OperatorProjections 2 import Mathlib.Analysis.CStarAlgebra.CStarMatrix 3 import Mathlib.Data.Matrix.Block 4 import Mathlib.Algebra.Star.Unitary 5 6 /-! # Matrix projections, unitaries, and stabilization 7 8 We use Mathlib's C⋆-matrix norm, not the entrywise supremum norm. The order 9 assumptions are the standard compatible C⋆-order required by that API. 10 Block sums first use sum-indexed matrices, avoiding arbitrary index choices. 11 -/ 12 13 noncomputable section 14 namespace BC4lean.OperatorKTheory 15 16 open scoped Matrix 17 18 variable {A : Type*} [CStarAlgebra A] 19 variable {ι κ : Type*} 20 21 /-- Block diagonal sum of C⋆-matrices. -/ 22 def matrixBlockSum (p : CStarMatrix ι ι A) (q : CStarMatrix κ κ A) : 23 CStarMatrix (ι ⊕ κ) (ι ⊕ κ) A := 24 CStarMatrix.ofMatrix (Matrix.fromBlocks (CStarMatrix.ofMatrix.symm p) 0 0 25 (CStarMatrix.ofMatrix.symm q)) 26 27 @[simp] theorem matrixBlockSum_star (p : CStarMatrix ι ι A) (q : CStarMatrix κ κ A) : 28 star (matrixBlockSum p q) = matrixBlockSum (star p) (star q) := by 29 change (Matrix.fromBlocks (CStarMatrix.ofMatrix.symm p) (0 : Matrix ι κ A) 30 (0 : Matrix κ ι A) (CStarMatrix.ofMatrix.symm q))ᴴ = _ 31 simp only [Matrix.fromBlocks_conjTranspose, Matrix.conjTranspose_zero] 32 rfl 33 34 theorem matrixBlockSum_mul [Fintype ι] [Fintype κ] (p r : CStarMatrix ι ι A) (q s : CStarMatrix κ κ A) : 35 matrixBlockSum p q * matrixBlockSum r s = matrixBlockSum (p * r) (q * s) := by 36 change Matrix.fromBlocks (CStarMatrix.ofMatrix.symm p) (0 : Matrix ι κ A) 37 (0 : Matrix κ ι A) (CStarMatrix.ofMatrix.symm q) * 38 Matrix.fromBlocks (CStarMatrix.ofMatrix.symm r) (0 : Matrix ι κ A) 39 (0 : Matrix κ ι A) (CStarMatrix.ofMatrix.symm s) = 40 Matrix.fromBlocks (CStarMatrix.ofMatrix.symm p * CStarMatrix.ofMatrix.symm r) 41 (0 : Matrix ι κ A) (0 : Matrix κ ι A) 42 (CStarMatrix.ofMatrix.symm q * CStarMatrix.ofMatrix.symm s) 43 simp only [Matrix.fromBlocks_multiply, Matrix.mul_zero, Matrix.zero_mul, add_zero, zero_add] 44 45 @[simp] theorem matrixBlockSum_one [DecidableEq ι] [DecidableEq κ] : 46 matrixBlockSum (1 : CStarMatrix ι ι A) (1 : CStarMatrix κ κ A) = 1 := 47 Matrix.fromBlocks_one 48 49 @[simp] theorem matrixBlockSum_zero : 50 matrixBlockSum (0 : CStarMatrix ι ι A) (0 : CStarMatrix κ κ A) = 0 := 51 Matrix.fromBlocks_zero 52 53 variable [PartialOrder A] [StarOrderedRing A] 54 variable [Fintype ι] [Fintype κ] [DecidableEq ι] [DecidableEq κ] 55 56 /-- A matrix projection with the C⋆-matrix norm. -/ 57 abbrev MatrixProjection (A : Type*) [CStarAlgebra A] [PartialOrder A] [StarOrderedRing A] 58 (ι : Type*) [Fintype ι] [DecidableEq ι] := Projection (CStarMatrix ι ι A) 59 60 def projectionBlockSum (p : MatrixProjection A ι) (q : MatrixProjection A κ) : 61 MatrixProjection A (ι ⊕ κ) := 62 ⟨matrixBlockSum p q, ⟨by 63 change matrixBlockSum p.val q.val * matrixBlockSum p.val q.val = matrixBlockSum p.val q.val 64 rw [matrixBlockSum_mul]; simp, by 65 change star (matrixBlockSum p.val q.val) = matrixBlockSum p.val q.val 66 rw [matrixBlockSum_star]; simp⟩⟩ 67 68 @[simp] theorem projectionBlockSum_coe (p : MatrixProjection A ι) (q : MatrixProjection A κ) : 69 (projectionBlockSum p q : CStarMatrix (ι ⊕ κ) (ι ⊕ κ) A) = matrixBlockSum p q := rfl 70 71 /-- Projection stabilization adds a zero block. -/ 72 def stabilizeProjection (p : MatrixProjection A ι) : MatrixProjection A (ι ⊕ κ) := 73 projectionBlockSum p Projection.zero 74 75 theorem equivalent_blockSum {p r : MatrixProjection A ι} {q s : MatrixProjection A κ} 76 (h : Projection.Equivalent p r) (k : Projection.Equivalent q s) : 77 Projection.Equivalent (projectionBlockSum p q) (projectionBlockSum r s) := by 78 obtain ⟨v, hv, hv'⟩ := h 79 obtain ⟨w, hw, hw'⟩ := k 80 refine ⟨matrixBlockSum v w, ?_, ?_⟩ 81 · simp only [matrixBlockSum_star, matrixBlockSum_mul, hv, hw, projectionBlockSum_coe] 82 · simp only [matrixBlockSum_star, matrixBlockSum_mul, hv', hw', projectionBlockSum_coe] 83 84 theorem equivalent_stabilize {p q : MatrixProjection A ι} (h : Projection.Equivalent p q) : 85 Projection.Equivalent (stabilizeProjection (κ := κ) p) (stabilizeProjection q) := 86 equivalent_blockSum h (Projection.equivalent_refl Projection.zero) 87 88 /-- Block sum descends to Murray–von Neumann classes at the indicated matrix sizes. -/ 89 def blockSumClasses : Projection.Classes (CStarMatrix ι ι A) → 90 Projection.Classes (CStarMatrix κ κ A) → 91 Projection.Classes (CStarMatrix (ι ⊕ κ) (ι ⊕ κ) A) := 92 Quotient.map₂ projectionBlockSum (fun _ _ h _ _ k => equivalent_blockSum h k) 93 94 /-- A matrix unitary with the operator-norm topology. -/ 95 abbrev MatrixUnitary (A : Type*) [CStarAlgebra A] [PartialOrder A] [StarOrderedRing A] 96 (ι : Type*) [Fintype ι] [DecidableEq ι] := unitary (CStarMatrix ι ι A) 97 98 def unitaryBlockSum (u : MatrixUnitary A ι) (v : MatrixUnitary A κ) : 99 MatrixUnitary A (ι ⊕ κ) := 100 ⟨matrixBlockSum u v, by 101 rw [Unitary.mem_iff] 102 constructor 103 · rw [matrixBlockSum_star, matrixBlockSum_mul, 104 Unitary.star_mul_self_of_mem u.property, Unitary.star_mul_self_of_mem v.property, 105 matrixBlockSum_one] 106 · rw [matrixBlockSum_star, matrixBlockSum_mul, 107 Unitary.mul_star_self_of_mem u.property, Unitary.mul_star_self_of_mem v.property, 108 matrixBlockSum_one]⟩ 109 110 @[simp] theorem unitaryBlockSum_coe (u : MatrixUnitary A ι) (v : MatrixUnitary A κ) : 111 (unitaryBlockSum u v : CStarMatrix (ι ⊕ κ) (ι ⊕ κ) A) = matrixBlockSum u v := rfl 112 113 /-- Unitary stabilization adds an identity block, unlike projection stabilization. -/ 114 def stabilizeUnitary (u : MatrixUnitary A ι) : MatrixUnitary A (ι ⊕ κ) := 115 unitaryBlockSum u 1 116 117 end BC4lean.OperatorKTheory
源码 SHA-256:bf4d4b1221bbfc6f46f53faf1e26975d55901455326576a207c7b5ee1ce7e23e
1 import BC4lean.MatrixStabilization 2 import Mathlib.Topology.Algebra.Star.Unitary 3 import Mathlib.Topology.Connected.PathConnected 4 5 /-! # Norm homotopy of matrix unitaries 6 7 These are path components at a fixed matrix size, not yet the stable group K₁. 8 The topology is the subspace topology of Mathlib's operator-norm C⋆-matrices. 9 -/ 10 11 noncomputable section 12 namespace BC4lean.OperatorKTheory 13 14 variable {A : Type*} [CStarAlgebra A] [PartialOrder A] [StarOrderedRing A] 15 variable {ι κ : Type*} [Fintype ι] [Fintype κ] [DecidableEq ι] [DecidableEq κ] 16 17 /-- A norm-continuous path of matrix unitaries joins the two endpoints. -/ 18 def UnitaryHomotopic (u v : MatrixUnitary A ι) : Prop := Joined u v 19 20 theorem unitaryHomotopic_refl (u : MatrixUnitary A ι) : UnitaryHomotopic u u := 21 Joined.refl u 22 23 theorem unitaryHomotopic_symm {u v : MatrixUnitary A ι} (h : UnitaryHomotopic u v) : 24 UnitaryHomotopic v u := Joined.symm h 25 26 theorem unitaryHomotopic_trans {u v w : MatrixUnitary A ι} 27 (h : UnitaryHomotopic u v) (k : UnitaryHomotopic v w) : UnitaryHomotopic u w := 28 Joined.trans h k 29 30 theorem unitaryHomotopic_mul {u v w z : MatrixUnitary A ι} 31 (h : UnitaryHomotopic u v) (k : UnitaryHomotopic w z) : 32 UnitaryHomotopic (u * w) (v * z) := Joined.mul h k 33 34 theorem unitaryHomotopic_inv {u v : MatrixUnitary A ι} (h : UnitaryHomotopic u v) : 35 UnitaryHomotopic u⁻¹ v⁻¹ := Joined.inv h 36 37 /-- Fixed-size norm-path components of the unitary group. -/ 38 abbrev UnitaryHomotopyClasses (A : Type*) [CStarAlgebra A] 39 [PartialOrder A] [StarOrderedRing A] (ι : Type*) [Fintype ι] [DecidableEq ι] := 40 Quotient (pathSetoid (MatrixUnitary A ι)) 41 42 omit [PartialOrder A] [StarOrderedRing A] [Fintype ι] [Fintype κ] 43 [DecidableEq ι] [DecidableEq κ] in 44 theorem continuous_matrixBlockSum : 45 Continuous (fun x : CStarMatrix ι ι A × CStarMatrix κ κ A => 46 matrixBlockSum x.1 x.2) := by 47 exact CStarMatrix.ofMatrixL.continuous.comp 48 ((CStarMatrix.ofMatrixL.symm.continuous.comp continuous_fst).matrix_fromBlocks 49 continuous_const continuous_const 50 (CStarMatrix.ofMatrixL.symm.continuous.comp continuous_snd)) 51 52 theorem continuous_unitaryBlockSum : 53 Continuous (fun x : MatrixUnitary A ι × MatrixUnitary A κ => 54 unitaryBlockSum x.1 x.2) := by 55 apply Continuous.subtype_mk 56 exact continuous_matrixBlockSum.comp 57 ((continuous_subtype_val.comp continuous_fst).prodMk 58 (continuous_subtype_val.comp continuous_snd)) 59 60 theorem unitaryHomotopic_blockSum {u v : MatrixUnitary A ι} {w z : MatrixUnitary A κ} 61 (h : UnitaryHomotopic u v) (k : UnitaryHomotopic w z) : 62 UnitaryHomotopic (unitaryBlockSum u w) (unitaryBlockSum v z) := by 63 exact (Joined.prod h k).map 64 continuous_unitaryBlockSum 65 66 theorem unitaryHomotopic_stabilize {u v : MatrixUnitary A ι} 67 (h : UnitaryHomotopic u v) : 68 UnitaryHomotopic (stabilizeUnitary (κ := κ) u) (stabilizeUnitary v) := 69 unitaryHomotopic_blockSum h (unitaryHomotopic_refl 1) 70 71 /-- Stabilization is well-defined on norm-path components at each size. -/ 72 def stabilizeUnitaryClasses : UnitaryHomotopyClasses A ι → 73 UnitaryHomotopyClasses A (ι ⊕ κ) := 74 Quotient.map stabilizeUnitary (fun _ _ h => unitaryHomotopic_stabilize h) 75 76 end BC4lean.OperatorKTheory
源码 SHA-256:64e81b38d480648be4ef60b8def7cb16a622f16290f763a4f91d959c4c1112dd
1 import BC4lean.MatrixStabilization 2 3 /-! # Murray–von Neumann equivalence across finite matrix sizes 4 5 Rectangular witnesses compare projections without choosing an ordering of the 6 finite index sets. Their support identities follow from the C⋆-identity. 7 -/ 8 9 noncomputable section 10 open scoped Matrix 11 namespace BC4lean.OperatorKTheory 12 13 variable {A : Type*} [CStarAlgebra A] [PartialOrder A] [StarOrderedRing A] 14 variable {ι κ τ υ : Type*} [Fintype ι] [Fintype κ] [Fintype τ] [Fintype υ] 15 variable [DecidableEq ι] [DecidableEq κ] [DecidableEq τ] [DecidableEq υ] 16 17 abbrev projectionMatrix (p : MatrixProjection A ι) : Matrix ι ι A := 18 CStarMatrix.ofMatrix.symm p.val 19 20 @[simp] theorem projectionMatrix_star (p : MatrixProjection A ι) : 21 (projectionMatrix p)ᴴ = projectionMatrix p := p.property.isSelfAdjoint.star_eq 22 23 @[simp] theorem projectionMatrix_mul (p : MatrixProjection A ι) : 24 projectionMatrix p * projectionMatrix p = projectionMatrix p := p.property.isIdempotentElem.eq 25 26 /-- Initial and final projections of a rectangular partial isometry. -/ 27 def RectEquivalent (p : MatrixProjection A ι) (q : MatrixProjection A κ) : Prop := 28 ∃ v : Matrix ι κ A, v * vᴴ = projectionMatrix p ∧ vᴴ * v = projectionMatrix q 29 30 /-- The right support equation is derived, rather than included in the definition. -/ 31 theorem rectangular_right_support (q : MatrixProjection A κ) (v : Matrix ι κ A) 32 (hv : vᴴ * v = projectionMatrix q) : v * projectionMatrix q = v := by 33 let V : CStarMatrix (ι ⊕ κ) (ι ⊕ κ) A := 34 CStarMatrix.ofMatrix (Matrix.fromBlocks (0 : Matrix ι ι A) v 0 0) 35 let P : MatrixProjection A (ι ⊕ κ) := projectionBlockSum Projection.zero q 36 have hMat : 37 (Matrix.fromBlocks (0 : Matrix ι ι A) v (0 : Matrix κ ι A) (0 : Matrix κ κ A))ᴴ * 38 Matrix.fromBlocks (0 : Matrix ι ι A) v (0 : Matrix κ ι A) (0 : Matrix κ κ A) = 39 Matrix.fromBlocks (0 : Matrix ι ι A) (0 : Matrix ι κ A) 40 (0 : Matrix κ ι A) (projectionMatrix q) := by 41 simp only [Matrix.fromBlocks_conjTranspose, Matrix.conjTranspose_zero, 42 Matrix.fromBlocks_multiply, Matrix.zero_mul, Matrix.mul_zero, add_zero, hv] 43 have hV : star V * V = P.val := hMat 44 have h := Projection.right_support P V hV 45 have hMat' : 46 Matrix.fromBlocks (0 : Matrix ι ι A) v (0 : Matrix κ ι A) (0 : Matrix κ κ A) * 47 Matrix.fromBlocks (0 : Matrix ι ι A) (0 : Matrix ι κ A) 48 (0 : Matrix κ ι A) (projectionMatrix q) = 49 Matrix.fromBlocks (0 : Matrix ι ι A) v (0 : Matrix κ ι A) (0 : Matrix κ κ A) := h 50 simp only [Matrix.fromBlocks_multiply, Matrix.zero_mul, Matrix.mul_zero, 51 zero_add, add_zero] at hMat' 52 exact congrArg Matrix.toBlocks₁₂ hMat' 53 54 theorem rectangular_left_support (p : MatrixProjection A ι) (v : Matrix ι κ A) 55 (hv : v * vᴴ = projectionMatrix p) : projectionMatrix p * v = v := by 56 have h := rectangular_right_support p vᴴ (by simpa using hv) 57 simpa using congrArg Matrix.conjTranspose h 58 59 theorem rectEquivalent_refl (p : MatrixProjection A ι) : RectEquivalent p p := 60 ⟨projectionMatrix p, by simp, by simp⟩ 61 62 theorem rectEquivalent_symm {p : MatrixProjection A ι} {q : MatrixProjection A κ} 63 (h : RectEquivalent p q) : RectEquivalent q p := by 64 obtain ⟨v, hv, hv'⟩ := h 65 exact ⟨vᴴ, by simpa using hv', by simpa using hv⟩ 66 67 theorem rectEquivalent_trans {p : MatrixProjection A ι} {q : MatrixProjection A κ} 68 {r : MatrixProjection A τ} (h : RectEquivalent p q) (k : RectEquivalent q r) : 69 RectEquivalent p r := by 70 obtain ⟨v, hv, hv'⟩ := h 71 obtain ⟨w, hw, hw'⟩ := k 72 refine ⟨v * w, ?_, ?_⟩ 73 · calc 74 (v * w) * (v * w)ᴴ = (v * (w * wᴴ)) * vᴴ := by 75 simp only [Matrix.conjTranspose_mul, Matrix.mul_assoc] 76 _ = (v * projectionMatrix q) * vᴴ := by rw [hw] 77 _ = projectionMatrix p := by rw [rectangular_right_support q v hv', hv] 78 · calc 79 (v * w)ᴴ * (v * w) = wᴴ * ((vᴴ * v) * w) := by 80 simp only [Matrix.conjTranspose_mul, Matrix.mul_assoc] 81 _ = wᴴ * (projectionMatrix q * w) := by rw [hv'] 82 _ = projectionMatrix r := by rw [rectangular_left_support q w hw, hw'] 83 84 /-- Rectangular equivalence agrees with the earlier relation at equal index types. -/ 85 theorem rectEquivalent_iff_equivalent (p q : MatrixProjection A ι) : 86 RectEquivalent p q ↔ Projection.Equivalent p q := by 87 constructor 88 · rintro ⟨v, hv, hv'⟩ 89 refine ⟨CStarMatrix.ofMatrix vᴴ, ?_, ?_⟩ 90 · change vᴴᴴ * vᴴ = projectionMatrix p 91 simpa only [Matrix.conjTranspose_conjTranspose] using hv 92 · change vᴴ * vᴴᴴ = projectionMatrix q 93 simpa only [Matrix.conjTranspose_conjTranspose] using hv' 94 · rintro ⟨v, hv, hv'⟩ 95 change (CStarMatrix.ofMatrix.symm v)ᴴ * CStarMatrix.ofMatrix.symm v = projectionMatrix p at hv 96 change CStarMatrix.ofMatrix.symm v * (CStarMatrix.ofMatrix.symm v)ᴴ = projectionMatrix q at hv' 97 exact ⟨(CStarMatrix.ofMatrix.symm v)ᴴ, by simpa using hv, by simpa using hv'⟩ 98 99 theorem rectEquivalent_blockSum {p : MatrixProjection A ι} {q : MatrixProjection A κ} 100 {r : MatrixProjection A τ} {s : MatrixProjection A υ} 101 (h : RectEquivalent p q) (k : RectEquivalent r s) : 102 RectEquivalent (projectionBlockSum p r) (projectionBlockSum q s) := by 103 obtain ⟨v, hv, hv'⟩ := h 104 obtain ⟨w, hw, hw'⟩ := k 105 refine ⟨Matrix.fromBlocks v 0 0 w, ?_, ?_⟩ 106 · change Matrix.fromBlocks v (0 : Matrix ι υ A) (0 : Matrix τ κ A) w * 107 (Matrix.fromBlocks v 0 0 w)ᴴ = 108 Matrix.fromBlocks (projectionMatrix p) 0 0 (projectionMatrix r) 109 simp only [Matrix.fromBlocks_conjTranspose, Matrix.conjTranspose_zero, 110 Matrix.fromBlocks_multiply, Matrix.zero_mul, Matrix.mul_zero, zero_add, add_zero, hv, hw] 111 · change (Matrix.fromBlocks v (0 : Matrix ι υ A) (0 : Matrix τ κ A) w)ᴴ * 112 Matrix.fromBlocks v 0 0 w = 113 Matrix.fromBlocks (projectionMatrix q) 0 0 (projectionMatrix s) 114 simp only [Matrix.fromBlocks_conjTranspose, Matrix.conjTranspose_zero, 115 Matrix.fromBlocks_multiply, Matrix.zero_mul, Matrix.mul_zero, zero_add, add_zero, hv', hw'] 116 117 /-- A change of finite matrix indices does not change the equivalence class. -/ 118 theorem rectEquivalent_of_reindex (p : MatrixProjection A ι) (q : MatrixProjection A κ) 119 (e : κ ≃ ι) (hq : projectionMatrix q = (projectionMatrix p).submatrix e e) : 120 RectEquivalent p q := by 121 refine ⟨(projectionMatrix p).submatrix id e, ?_, ?_⟩ 122 · simp only [Matrix.conjTranspose_submatrix, projectionMatrix_star, 123 Matrix.submatrix_mul_equiv, projectionMatrix_mul, Matrix.submatrix_id_id] 124 · rw [Matrix.conjTranspose_submatrix, projectionMatrix_star] 125 change (projectionMatrix p).submatrix e (Equiv.refl ι) * 126 (projectionMatrix p).submatrix (Equiv.refl ι) e = projectionMatrix q 127 rw [Matrix.submatrix_mul_equiv, projectionMatrix_mul, ← hq] 128 129 theorem rectEquivalent_zero : RectEquivalent (Projection.zero : MatrixProjection A ι) 130 (Projection.zero : MatrixProjection A κ) := by 131 refine ⟨0, ?_, ?_⟩ <;> simp only [Matrix.conjTranspose_zero, Matrix.zero_mul] <;> rfl 132 133 theorem rectEquivalent_block_comm (p : MatrixProjection A ι) (q : MatrixProjection A κ) : 134 RectEquivalent (projectionBlockSum p q) (projectionBlockSum q p) := by 135 apply rectEquivalent_of_reindex _ _ (Equiv.sumComm κ ι) 136 ext i j 137 cases i <;> cases j <;> rfl 138 139 /-- Adding a zero block does not change the rectangular equivalence class. -/ 140 theorem rectEquivalent_stabilize (p : MatrixProjection A ι) : 141 RectEquivalent p (stabilizeProjection (κ := κ) p) := by 142 have h : RectEquivalent (projectionBlockSum p (Projection.zero : MatrixProjection A κ)) 143 (projectionBlockSum p (Projection.zero : MatrixProjection A Empty)) := 144 rectEquivalent_blockSum (rectEquivalent_refl p) rectEquivalent_zero 145 have k : RectEquivalent p (projectionBlockSum p (Projection.zero : MatrixProjection A Empty)) := by 146 apply rectEquivalent_of_reindex _ _ (Equiv.sumEmpty ι Empty) 147 ext i j 148 rcases i with i | i 149 · rcases j with j | j 150 · rfl 151 · exact j.elim 152 · exact i.elim 153 exact rectEquivalent_trans k (rectEquivalent_symm h) 154 155 /-- Rectangular witnesses are equivalent to ordinary equivalence in a common 156 matrix algebra after the two projections are placed in disjoint corners. -/ 157 theorem rectEquivalent_iff_padded (p : MatrixProjection A ι) (q : MatrixProjection A κ) : 158 RectEquivalent p q ↔ Projection.Equivalent 159 (projectionBlockSum p (Projection.zero : MatrixProjection A κ)) 160 (projectionBlockSum (Projection.zero : MatrixProjection A ι) q) := by 161 have hp := rectEquivalent_stabilize (κ := κ) p 162 have hq := rectEquivalent_trans (rectEquivalent_stabilize (κ := ι) q) 163 (rectEquivalent_block_comm q (Projection.zero : MatrixProjection A ι)) 164 rw [← rectEquivalent_iff_equivalent] 165 constructor 166 · intro h 167 exact rectEquivalent_trans (rectEquivalent_trans (rectEquivalent_symm hp) h) hq 168 · intro h 169 exact rectEquivalent_trans (rectEquivalent_trans hp h) (rectEquivalent_symm hq) 170 171 end BC4lean.OperatorKTheory
源码 SHA-256:e61cd47688e2e352293eb0a933f93b06d5fdd59275359faf87e6858386e8c6a6
1 import BC4lean.RectangularEquivalence 2 3 /-! # The stable projection monoid 4 5 Objects are projections indexed by arbitrary small finite types. Rectangular 6 Murray–von Neumann witnesses make the quotient independent of the index type. 7 Addition is actual matrix block sum, not a freely imposed relation. 8 -/ 9 10 noncomputable section 11 open scoped Matrix 12 namespace BC4lean.OperatorKTheory 13 14 universe u 15 variable {A : Type u} [CStarAlgebra A] [PartialOrder A] [StarOrderedRing A] 16 17 /-- A finite matrix projection, with its finite index type recorded. -/ 18 structure FiniteProjection (A : Type u) [CStarAlgebra A] [PartialOrder A] [StarOrderedRing A] where 19 Index : Type 20 [indexFintype : Fintype Index] 21 [indexDecidableEq : DecidableEq Index] 22 projection : MatrixProjection A Index 23 24 attribute [instance] FiniteProjection.indexFintype FiniteProjection.indexDecidableEq 25 26 namespace FiniteProjection 27 28 /-- Record the index type of a matrix projection. -/ 29 def ofProjection {ι : Type} [Fintype ι] [DecidableEq ι] (p : MatrixProjection A ι) : 30 FiniteProjection A where 31 Index := ι 32 projection := p 33 34 /-- Every object can be represented using a standard finite ordinal. -/ 35 def toFin (p : FiniteProjection A) : FiniteProjection A where 36 Index := Fin (Fintype.card p.Index) 37 projection := Projection.map 38 (CStarMatrix.reindexₐ ℂ A (Fintype.equivFin p.Index)).toStarAlgHom p.projection 39 40 /-- Block sum of finite matrix projections. -/ 41 def blockSum (p q : FiniteProjection A) : FiniteProjection A where 42 Index := p.Index ⊕ q.Index 43 projection := projectionBlockSum p.projection q.projection 44 45 /-- The empty matrix represents zero. -/ 46 def zero : FiniteProjection A where 47 Index := Empty 48 projection := Projection.zero 49 50 /-- Equivalence compares different sizes using a rectangular partial isometry. -/ 51 def Equivalent (p q : FiniteProjection A) : Prop := RectEquivalent p.projection q.projection 52 53 theorem equivalent_refl (p : FiniteProjection A) : Equivalent p p := 54 rectEquivalent_refl p.projection 55 56 theorem equivalent_symm {p q : FiniteProjection A} (h : Equivalent p q) : Equivalent q p := 57 rectEquivalent_symm h 58 59 theorem equivalent_trans {p q r : FiniteProjection A} 60 (h : Equivalent p q) (k : Equivalent q r) : Equivalent p r := rectEquivalent_trans h k 61 62 theorem equivalent_toFin (p : FiniteProjection A) : Equivalent p p.toFin := by 63 apply rectEquivalent_of_reindex _ _ (Fintype.equivFin p.Index).symm 64 rfl 65 66 theorem equivalent_zero {ι : Type} [Fintype ι] [DecidableEq ι] : 67 Equivalent (ofProjection (Projection.zero : MatrixProjection A ι)) zero := 68 rectEquivalent_zero 69 70 def setoid : Setoid (FiniteProjection A) where 71 r := Equivalent 72 iseqv := ⟨equivalent_refl, equivalent_symm, equivalent_trans⟩ 73 74 theorem blockSum_congr {p q r s : FiniteProjection A} 75 (h : Equivalent p q) (k : Equivalent r s) : Equivalent (blockSum p r) (blockSum q s) := 76 rectEquivalent_blockSum h k 77 78 theorem blockSum_comm (p q : FiniteProjection A) : 79 Equivalent (blockSum p q) (blockSum q p) := by 80 apply rectEquivalent_of_reindex _ _ (Equiv.sumComm q.Index p.Index) 81 ext i j 82 cases i <;> cases j <;> rfl 83 84 theorem blockSum_assoc (p q r : FiniteProjection A) : 85 Equivalent (blockSum (blockSum p q) r) (blockSum p (blockSum q r)) := by 86 apply rectEquivalent_of_reindex _ _ (Equiv.sumAssoc p.Index q.Index r.Index).symm 87 ext i j 88 rcases i with i | (i | i) <;> rcases j with j | (j | j) <;> rfl 89 90 theorem zero_blockSum (p : FiniteProjection A) : Equivalent (blockSum zero p) p := by 91 apply equivalent_symm 92 apply rectEquivalent_of_reindex _ _ (Equiv.emptySum Empty p.Index) 93 ext i j 94 rcases i with i | i 95 · exact i.elim 96 · rcases j with j | j 97 · exact j.elim 98 · rfl 99 100 theorem blockSum_zero (p : FiniteProjection A) : Equivalent (blockSum p zero) p := 101 equivalent_trans (blockSum_comm p zero) (zero_blockSum p) 102 103 end FiniteProjection 104 105 /-- Stable Murray–von Neumann classes of finite matrix projections. -/ 106 abbrev StableProjectionMonoid (A : Type u) [CStarAlgebra A] 107 [PartialOrder A] [StarOrderedRing A] := Quotient (FiniteProjection.setoid (A := A)) 108 109 namespace StableProjectionMonoid 110 111 /-- The class represented by a finite matrix projection. -/ 112 def of (p : FiniteProjection A) : StableProjectionMonoid A := Quotient.mk _ p 113 114 instance : Zero (StableProjectionMonoid A) := ⟨of FiniteProjection.zero⟩ 115 116 instance : Add (StableProjectionMonoid A) := 117 ⟨Quotient.map₂ FiniteProjection.blockSum (fun _ _ h _ _ k => 118 FiniteProjection.blockSum_congr h k)⟩ 119 120 @[simp] theorem of_blockSum (p q : FiniteProjection A) : 121 of (FiniteProjection.blockSum p q) = of p + of q := rfl 122 123 theorem of_eq_of_equivalent {p q : FiniteProjection A} (h : FiniteProjection.Equivalent p q) : 124 of p = of q := Quotient.sound h 125 126 theorem of_eq_iff (p q : FiniteProjection A) : 127 of p = of q ↔ FiniteProjection.Equivalent p q := Quotient.eq 128 129 /-- Block sum gives an additive commutative monoid on the stable classes. -/ 130 instance instAddCommMonoid : AddCommMonoid (StableProjectionMonoid A) where 131 add_assoc a b c := Quotient.inductionOn₃ a b c fun p q r => 132 Quotient.sound (FiniteProjection.blockSum_assoc p q r) 133 zero_add a := Quotient.inductionOn a fun p => Quotient.sound (FiniteProjection.zero_blockSum p) 134 add_zero a := Quotient.inductionOn a fun p => Quotient.sound (FiniteProjection.blockSum_zero p) 135 add_comm a b := Quotient.inductionOn₂ a b fun p q => 136 Quotient.sound (FiniteProjection.blockSum_comm p q) 137 nsmul := nsmulRec 138 139 @[simp] theorem of_zeroProjection {ι : Type} [Fintype ι] [DecidableEq ι] : 140 of (FiniteProjection.ofProjection (Projection.zero : MatrixProjection A ι)) = 0 := 141 Quotient.sound FiniteProjection.equivalent_zero 142 143 /-- The quotient really identifies zero-padding of a projection. -/ 144 theorem of_stabilize {ι κ : Type} [Fintype ι] [Fintype κ] 145 [DecidableEq ι] [DecidableEq κ] (p : MatrixProjection A ι) : 146 of (FiniteProjection.ofProjection (stabilizeProjection (κ := κ) p)) = 147 of (FiniteProjection.ofProjection p) := 148 Quotient.sound (rectEquivalent_symm (rectEquivalent_stabilize p)) 149 150 /-- Allowing arbitrary small finite index types adds no extra classes. -/ 151 theorem exists_finRepresentative (x : StableProjectionMonoid A) : 152 ∃ (n : ℕ) (p : MatrixProjection A (Fin n)), of (FiniteProjection.ofProjection p) = x := by 153 refine Quotient.inductionOn x ?_ 154 intro p 155 exact ⟨Fintype.card p.Index, p.toFin.projection, 156 Quotient.sound (FiniteProjection.equivalent_symm (FiniteProjection.equivalent_toFin p))⟩ 157 158 end StableProjectionMonoid 159 end BC4lean.OperatorKTheory
源码 SHA-256:bf4d9c7370788493ac0339b6bb884700db599ec86a87e5c5f147abe95e1492d6
1 import BC4lean.StableProjectionMonoid 2 import Mathlib.GroupTheory.MonoidLocalization.GrothendieckGroup 3 4 /-! # Unital operator K₀ as a Grothendieck group 5 6 The input is the verified stable projection monoid. No cancellation or 7 injectivity of its canonical map to the group completion is assumed. 8 -/ 9 10 noncomputable section 11 namespace BC4lean.OperatorKTheory 12 13 universe u v 14 variable {A : Type u} [CStarAlgebra A] [PartialOrder A] [StarOrderedRing A] 15 16 /-- The unital operator K₀ group, obtained by group-completing V(A). -/ 17 abbrev K0 (A : Type u) [CStarAlgebra A] [PartialOrder A] [StarOrderedRing A] := 18 Algebra.GrothendieckAddGroup (StableProjectionMonoid A) 19 20 /-- The canonical additive map from stable projection classes to K₀. -/ 21 def k0Class : StableProjectionMonoid A →+ K0 A := Algebra.GrothendieckAddGroup.of 22 23 /-- The K₀ class of a finite matrix projection. -/ 24 def k0Projection (p : FiniteProjection A) : K0 A := k0Class (StableProjectionMonoid.of p) 25 26 @[simp] theorem k0Projection_zero : k0Projection (FiniteProjection.zero : FiniteProjection A) = 0 := 27 map_zero k0Class 28 29 @[simp] theorem k0Projection_blockSum (p q : FiniteProjection A) : 30 k0Projection (FiniteProjection.blockSum p q) = k0Projection p + k0Projection q := by 31 simp only [k0Projection, StableProjectionMonoid.of_blockSum, map_add] 32 33 theorem k0Projection_eq_of_equivalent {p q : FiniteProjection A} 34 (h : FiniteProjection.Equivalent p q) : k0Projection p = k0Projection q := 35 congrArg k0Class (StableProjectionMonoid.of_eq_of_equivalent h) 36 37 /-- Every additive map from V(A) to an abelian group extends uniquely to K₀(A). -/ 38 def k0Universal {G : Type v} [AddCommGroup G] : 39 (StableProjectionMonoid A →+ G) ≃ (K0 A →+ G) := Algebra.GrothendieckAddGroup.lift 40 41 @[simp] theorem k0Universal_comp {G : Type v} [AddCommGroup G] 42 (f : StableProjectionMonoid A →+ G) : (k0Universal f).comp k0Class = f := 43 k0Universal.left_inv f 44 45 @[simp] theorem k0Universal_class {G : Type v} [AddCommGroup G] 46 (f : StableProjectionMonoid A →+ G) (x : StableProjectionMonoid A) : 47 k0Universal f (k0Class x) = f x := DFunLike.congr_fun (k0Universal_comp f) x 48 49 theorem k0Universal_unique {G : Type v} [AddCommGroup G] 50 (f : StableProjectionMonoid A →+ G) (g : K0 A →+ G) 51 (h : g.comp k0Class = f) : k0Universal f = g := by 52 apply k0Universal.symm.injective 53 exact (k0Universal.left_inv f).trans h.symm 54 55 end BC4lean.OperatorKTheory
源码 SHA-256:06b9ab3abc14445efde6e19e43a22cbe74174054d6d99dee277a5a77fbf55ec1
1 import BC4lean.OperatorK0 2 import BC4lean.ReducedGroupCStar 3 import Mathlib.Analysis.CStarAlgebra.ContinuousFunctionalCalculus.Basic 4 5 /-! # The degree-zero analytic target 6 7 The reduced group C⋆-algebra carries its canonical spectral order. This makes 8 its stable projection monoid and unital operator K₀ available for every group. 9 No assembly map, K₁ construction, or computation of these groups is asserted. 10 -/ 11 12 noncomputable section 13 namespace BC4lean 14 15 universe u v 16 variable (Γ : Type u) [Group Γ] 17 18 /-- Stable projection classes for the reduced group C⋆-algebra, with spectral order. -/ 19 def ReducedProjectionMonoid : Type _ := 20 letI := CStarAlgebra.spectralOrder (ReducedGroupCStar Γ) 21 letI := CStarAlgebra.spectralOrderedRing (ReducedGroupCStar Γ) 22 OperatorKTheory.StableProjectionMonoid (ReducedGroupCStar Γ) 23 24 instance reducedProjectionAddCommMonoid : AddCommMonoid (ReducedProjectionMonoid Γ) := by 25 letI := CStarAlgebra.spectralOrder (ReducedGroupCStar Γ) 26 letI := CStarAlgebra.spectralOrderedRing (ReducedGroupCStar Γ) 27 exact inferInstanceAs (AddCommMonoid (OperatorKTheory.StableProjectionMonoid (ReducedGroupCStar Γ))) 28 29 /-- The degree-zero analytic target K₀(Cᵣ*(Γ)), using the canonical spectral order. -/ 30 def ReducedK0 : Type _ := 31 letI := CStarAlgebra.spectralOrder (ReducedGroupCStar Γ) 32 letI := CStarAlgebra.spectralOrderedRing (ReducedGroupCStar Γ) 33 OperatorKTheory.K0 (ReducedGroupCStar Γ) 34 35 instance reducedK0AddCommGroup : AddCommGroup (ReducedK0 Γ) := by 36 letI := CStarAlgebra.spectralOrder (ReducedGroupCStar Γ) 37 letI := CStarAlgebra.spectralOrderedRing (ReducedGroupCStar Γ) 38 exact inferInstanceAs (AddCommGroup (OperatorKTheory.K0 (ReducedGroupCStar Γ))) 39 40 /-- The canonical map from projection classes to the degree-zero analytic group. -/ 41 def reducedK0Class : ReducedProjectionMonoid Γ →+ ReducedK0 Γ := by 42 letI := CStarAlgebra.spectralOrder (ReducedGroupCStar Γ) 43 letI := CStarAlgebra.spectralOrderedRing (ReducedGroupCStar Γ) 44 exact OperatorKTheory.k0Class 45 46 /-- The universal property specialized to the reduced group algebra. -/ 47 def reducedK0Universal {G : Type v} [AddCommGroup G] : 48 (ReducedProjectionMonoid Γ →+ G) ≃ (ReducedK0 Γ →+ G) := by 49 letI := CStarAlgebra.spectralOrder (ReducedGroupCStar Γ) 50 letI := CStarAlgebra.spectralOrderedRing (ReducedGroupCStar Γ) 51 exact OperatorKTheory.k0Universal 52 53 end BC4lean
源码 SHA-256:8302a0991199155f7aa3e835bb5fcc264ba4ad9b845b96f83dd81941cfb37592
1 import BC4lean.StableProjectionMonoid 2 3 /-! # Entrywise maps of finite matrix projections 4 5 A unital complex ⋆-homomorphism acts on rectangular witnesses entrywise. 6 Consequently it preserves stable Murray–von Neumann equivalence and block sums. 7 -/ 8 9 noncomputable section 10 open scoped Matrix 11 namespace BC4lean.OperatorKTheory 12 13 universe u v w 14 variable {A : Type u} {B : Type v} {C : Type w} 15 variable [CStarAlgebra A] [CStarAlgebra B] [CStarAlgebra C] 16 variable {ι κ : Type*} [Fintype ι] [Fintype κ] [DecidableEq ι] [DecidableEq κ] 17 18 /-- The entrywise map, bundled on square matrices with the C⋆-matrix norm. -/ 19 def matrixMap (φ : A →⋆ₐ[ℂ] B) : CStarMatrix ι ι A →⋆ₐ[ℂ] CStarMatrix ι ι B := 20 CStarMatrix.ofMatrixStarAlgEquiv.toStarAlgHom.comp 21 (({ φ.toAlgHom.mapMatrix with 22 map_star' := fun _ => Matrix.conjTranspose_map φ (fun a => map_star φ a) } : 23 Matrix ι ι A →⋆ₐ[ℂ] Matrix ι ι B).comp 24 CStarMatrix.ofMatrixStarAlgEquiv.symm.toStarAlgHom) 25 26 @[simp] theorem matrixMap_apply (φ : A →⋆ₐ[ℂ] B) (M : CStarMatrix ι ι A) (i j : ι) : 27 matrixMap φ M i j = φ (M i j) := rfl 28 29 @[simp] theorem matrixMap_id : 30 matrixMap (ι := ι) (StarAlgHom.id ℂ A) = StarAlgHom.id ℂ (CStarMatrix ι ι A) := by 31 ext M i j 32 rfl 33 34 @[simp] theorem matrixMap_comp (ψ : B →⋆ₐ[ℂ] C) (φ : A →⋆ₐ[ℂ] B) : 35 matrixMap (ι := ι) (ψ.comp φ) = (matrixMap ψ).comp (matrixMap φ) := by 36 ext M i j 37 rfl 38 39 variable [PartialOrder A] [StarOrderedRing A] 40 variable [PartialOrder B] [StarOrderedRing B] 41 variable [PartialOrder C] [StarOrderedRing C] 42 43 /-- Applying the entrywise homomorphism to a matrix projection. -/ 44 def matrixProjectionMap (φ : A →⋆ₐ[ℂ] B) (p : MatrixProjection A ι) : MatrixProjection B ι := 45 Projection.map (matrixMap φ) p 46 47 @[simp] theorem projectionMatrix_map (φ : A →⋆ₐ[ℂ] B) (p : MatrixProjection A ι) : 48 projectionMatrix (matrixProjectionMap φ p) = (projectionMatrix p).map φ := rfl 49 50 @[simp] theorem matrixProjectionMap_id (p : MatrixProjection A ι) : 51 matrixProjectionMap (StarAlgHom.id ℂ A) p = p := by 52 apply Subtype.ext 53 rfl 54 55 @[simp] theorem matrixProjectionMap_comp (ψ : B →⋆ₐ[ℂ] C) (φ : A →⋆ₐ[ℂ] B) 56 (p : MatrixProjection A ι) : 57 matrixProjectionMap (ψ.comp φ) p = matrixProjectionMap ψ (matrixProjectionMap φ p) := rfl 58 59 @[simp] theorem matrixProjectionMap_zero (φ : A →⋆ₐ[ℂ] B) : 60 matrixProjectionMap φ (Projection.zero : MatrixProjection A ι) = Projection.zero := 61 Projection.map_zero _ 62 63 @[simp] theorem matrixProjectionMap_blockSum (φ : A →⋆ₐ[ℂ] B) 64 (p : MatrixProjection A ι) (q : MatrixProjection A κ) : 65 matrixProjectionMap φ (projectionBlockSum p q) = 66 projectionBlockSum (matrixProjectionMap φ p) (matrixProjectionMap φ q) := by 67 apply Subtype.ext 68 ext i j 69 cases i <;> cases j <;> simp [matrixProjectionMap, Projection.map, 70 matrixMap_apply, projectionBlockSum, matrixBlockSum, Matrix.fromBlocks] 71 72 /-- Map the actual rectangular witness; no injectivity of φ is required. -/ 73 theorem rectEquivalent_map (φ : A →⋆ₐ[ℂ] B) 74 {p : MatrixProjection A ι} {q : MatrixProjection A κ} (h : RectEquivalent p q) : 75 RectEquivalent (matrixProjectionMap φ p) (matrixProjectionMap φ q) := by 76 obtain ⟨v, hv, hv'⟩ := h 77 refine ⟨v.map φ, ?_, ?_⟩ 78 · simpa only [Matrix.map_mul, Matrix.conjTranspose_map φ (fun a => map_star φ a), 79 projectionMatrix_map] using congrArg (fun M => M.map φ) hv 80 · simpa only [Matrix.map_mul, Matrix.conjTranspose_map φ (fun a => map_star φ a), 81 projectionMatrix_map] using congrArg (fun M => M.map φ) hv' 82 83 namespace FiniteProjection 84 85 /-- Entrywise transport keeps the finite index type. -/ 86 def map (φ : A →⋆ₐ[ℂ] B) (p : FiniteProjection A) : FiniteProjection B where 87 Index := p.Index 88 projection := matrixProjectionMap φ p.projection 89 90 @[simp] theorem map_id (p : FiniteProjection A) : map (StarAlgHom.id ℂ A) p = p := by 91 cases p 92 simp only [map, matrixProjectionMap_id] 93 94 @[simp] theorem map_comp (ψ : B →⋆ₐ[ℂ] C) (φ : A →⋆ₐ[ℂ] B) (p : FiniteProjection A) : 95 map (ψ.comp φ) p = map ψ (map φ p) := rfl 96 97 @[simp] theorem map_zero (φ : A →⋆ₐ[ℂ] B) : map φ zero = zero := by 98 exact congrArg (fun p : MatrixProjection B Empty => ofProjection p) (matrixProjectionMap_zero φ) 99 100 @[simp] theorem map_blockSum (φ : A →⋆ₐ[ℂ] B) (p q : FiniteProjection A) : 101 map φ (blockSum p q) = blockSum (map φ p) (map φ q) := by 102 exact congrArg (fun r : MatrixProjection B (p.Index ⊕ q.Index) => ofProjection r) 103 (matrixProjectionMap_blockSum φ p.projection q.projection) 104 105 theorem equivalent_map (φ : A →⋆ₐ[ℂ] B) {p q : FiniteProjection A} 106 (h : Equivalent p q) : Equivalent (map φ p) (map φ q) := rectEquivalent_map φ h 107 108 end FiniteProjection 109 end BC4lean.OperatorKTheory
源码 SHA-256:c8a9e804b78fef151656b5af0b31794e6400684db49dd051775e2a018dad8e37
1 import BC4lean.MatrixProjectionMap 2 import BC4lean.OperatorK0 3 4 /-! # Functoriality of unital operator K₀ 5 6 First descend entrywise maps to the stable projection monoid, then use the 7 Grothendieck group universal property. No cancellation hypothesis is needed. 8 -/ 9 10 noncomputable section 11 namespace BC4lean.OperatorKTheory 12 13 universe u v w t 14 variable {A : Type u} {B : Type v} {C : Type w} 15 variable [CStarAlgebra A] [CStarAlgebra B] [CStarAlgebra C] 16 variable [PartialOrder A] [StarOrderedRing A] 17 variable [PartialOrder B] [StarOrderedRing B] 18 variable [PartialOrder C] [StarOrderedRing C] 19 20 namespace StableProjectionMonoid 21 22 /-- The additive map on stable projection classes induced by a unital ⋆-homomorphism. -/ 23 def map (φ : A →⋆ₐ[ℂ] B) : StableProjectionMonoid A →+ StableProjectionMonoid B where 24 toFun := Quotient.map (FiniteProjection.map φ) (fun _ _ h => FiniteProjection.equivalent_map φ h) 25 map_zero' := by 26 change of (FiniteProjection.map φ FiniteProjection.zero) = of FiniteProjection.zero 27 rw [FiniteProjection.map_zero] 28 map_add' x y := by 29 refine Quotient.inductionOn₂ x y ?_ 30 intro p q 31 change of (FiniteProjection.map φ (FiniteProjection.blockSum p q)) = 32 of (FiniteProjection.blockSum (FiniteProjection.map φ p) (FiniteProjection.map φ q)) 33 rw [FiniteProjection.map_blockSum] 34 35 @[simp] theorem map_of (φ : A →⋆ₐ[ℂ] B) (p : FiniteProjection A) : 36 map φ (of p) = of (FiniteProjection.map φ p) := rfl 37 38 @[simp] theorem map_id : map (StarAlgHom.id ℂ A) = AddMonoidHom.id (StableProjectionMonoid A) := by 39 ext x 40 refine Quotient.inductionOn x ?_ 41 intro p 42 change of (FiniteProjection.map (StarAlgHom.id ℂ A) p) = of p 43 rw [FiniteProjection.map_id] 44 45 @[simp] theorem map_comp (ψ : B →⋆ₐ[ℂ] C) (φ : A →⋆ₐ[ℂ] B) : 46 map (ψ.comp φ) = (map ψ).comp (map φ) := by 47 ext x 48 refine Quotient.inductionOn x ?_ 49 intro p 50 rfl 51 52 end StableProjectionMonoid 53 54 /-- The homomorphism K₀(A) → K₀(B) induced by a unital complex ⋆-homomorphism. -/ 55 def k0Map (φ : A →⋆ₐ[ℂ] B) : K0 A →+ K0 B := 56 k0Universal (k0Class.comp (StableProjectionMonoid.map φ)) 57 58 @[simp] theorem k0Map_class (φ : A →⋆ₐ[ℂ] B) (x : StableProjectionMonoid A) : 59 k0Map φ (k0Class x) = k0Class (StableProjectionMonoid.map φ x) := 60 k0Universal_class _ x 61 62 /-- Naturality of the canonical group-completion homomorphism. -/ 63 theorem k0Map_comp_class (φ : A →⋆ₐ[ℂ] B) : 64 (k0Map φ).comp k0Class = k0Class.comp (StableProjectionMonoid.map φ) := 65 k0Universal_comp _ 66 67 @[simp] theorem k0Map_projection (φ : A →⋆ₐ[ℂ] B) (p : FiniteProjection A) : 68 k0Map φ (k0Projection p) = k0Projection (FiniteProjection.map φ p) := 69 k0Map_class φ (StableProjectionMonoid.of p) 70 71 /-- Homomorphisms out of K₀ are determined by their values on projection classes. -/ 72 theorem k0Hom_ext {G : Type t} [AddCommGroup G] {f g : K0 A →+ G} 73 (h : ∀ p : FiniteProjection A, f (k0Projection p) = g (k0Projection p)) : f = g := by 74 apply k0Universal.symm.injective 75 change f.comp k0Class = g.comp k0Class 76 ext x 77 refine Quotient.inductionOn x ?_ 78 intro p 79 exact h p 80 81 @[simp] theorem k0Map_id : k0Map (StarAlgHom.id ℂ A) = AddMonoidHom.id (K0 A) := by 82 apply k0Hom_ext 83 intro p 84 simp only [k0Map_projection, FiniteProjection.map_id, AddMonoidHom.id_apply] 85 86 @[simp] theorem k0Map_comp (ψ : B →⋆ₐ[ℂ] C) (φ : A →⋆ₐ[ℂ] B) : 87 k0Map (ψ.comp φ) = (k0Map ψ).comp (k0Map φ) := by 88 apply k0Hom_ext 89 intro p 90 simp only [k0Map_projection, FiniteProjection.map_comp, AddMonoidHom.comp_apply] 91 92 /-- The induced map is the unique homomorphism with the entrywise projection-class formula. -/ 93 theorem k0Map_unique (φ : A →⋆ₐ[ℂ] B) (f : K0 A →+ K0 B) 94 (h : ∀ p : FiniteProjection A, f (k0Projection p) = k0Projection (FiniteProjection.map φ p)) : 95 k0Map φ = f := by 96 apply k0Hom_ext 97 intro p 98 exact (k0Map_projection φ p).trans (h p).symm 99 100 end BC4lean.OperatorKTheory
源码 SHA-256:9e950900ab47ebfbfe4b9f715a551aade982f90c85b6e2d88b9ed5a56a9c0307
1 import BC4lean.OperatorK0Functoriality 2 3 /-! # Invariance of unital K₀ under star-algebra equivalence 4 5 The forward map comes from the given equivalence and the inverse map from its 6 inverse. Both inverse laws follow from functoriality. The compatible star orders 7 remain the explicit implementation assumptions of the matrix-algebra API. 8 -/ 9 10 noncomputable section 11 namespace BC4lean.OperatorKTheory 12 13 universe u v w 14 variable {A : Type u} {B : Type v} {C : Type w} 15 variable [CStarAlgebra A] [CStarAlgebra B] [CStarAlgebra C] 16 variable [PartialOrder A] [StarOrderedRing A] 17 variable [PartialOrder B] [StarOrderedRing B] 18 variable [PartialOrder C] [StarOrderedRing C] 19 20 namespace StableProjectionMonoid 21 22 theorem map_leftInverse (e : A ≃⋆ₐ[ℂ] B) : 23 Function.LeftInverse (map e.symm.toStarAlgHom) (map e.toStarAlgHom) := by 24 intro x 25 have h : e.symm.toStarAlgHom.comp e.toStarAlgHom = StarAlgHom.id ℂ A := by 26 ext a 27 exact e.symm_apply_apply a 28 change ((map e.symm.toStarAlgHom).comp (map e.toStarAlgHom)) x = x 29 rw [← map_comp, h, map_id] 30 rfl 31 32 theorem map_rightInverse (e : A ≃⋆ₐ[ℂ] B) : 33 Function.RightInverse (map e.symm.toStarAlgHom) (map e.toStarAlgHom) := by 34 intro x 35 have h : e.toStarAlgHom.comp e.symm.toStarAlgHom = StarAlgHom.id ℂ B := by 36 ext a 37 exact e.apply_symm_apply a 38 change ((map e.toStarAlgHom).comp (map e.symm.toStarAlgHom)) x = x 39 rw [← map_comp, h, map_id] 40 rfl 41 42 /-- A unital star-algebra equivalence induces an additive equivalence of stable projection monoids. -/ 43 def mapEquiv (e : A ≃⋆ₐ[ℂ] B) : StableProjectionMonoid A ≃+ StableProjectionMonoid B where 44 toFun := map e.toStarAlgHom 45 invFun := map e.symm.toStarAlgHom 46 left_inv := map_leftInverse e 47 right_inv := map_rightInverse e 48 map_add' := (map e.toStarAlgHom).map_add 49 50 @[simp] theorem mapEquiv_toAddMonoidHom (e : A ≃⋆ₐ[ℂ] B) : 51 (mapEquiv e).toAddMonoidHom = map e.toStarAlgHom := rfl 52 53 @[simp] theorem mapEquiv_of (e : A ≃⋆ₐ[ℂ] B) (p : FiniteProjection A) : 54 mapEquiv e (of p) = of (FiniteProjection.map e.toStarAlgHom p) := rfl 55 56 @[simp] theorem mapEquiv_refl : 57 mapEquiv (StarAlgEquiv.refl ℂ A) = AddEquiv.refl (StableProjectionMonoid A) := by 58 ext x 59 change map (StarAlgHom.id ℂ A) x = x 60 rw [map_id] 61 rfl 62 63 @[simp] theorem mapEquiv_symm (e : A ≃⋆ₐ[ℂ] B) : mapEquiv e.symm = (mapEquiv e).symm := by 64 ext x 65 rfl 66 67 @[simp] theorem mapEquiv_trans (e : A ≃⋆ₐ[ℂ] B) (f : B ≃⋆ₐ[ℂ] C) : 68 mapEquiv (e.trans f) = (mapEquiv e).trans (mapEquiv f) := by 69 ext x 70 exact DFunLike.congr_fun (map_comp f.toStarAlgHom e.toStarAlgHom) x 71 72 end StableProjectionMonoid 73 74 theorem k0Map_leftInverse (e : A ≃⋆ₐ[ℂ] B) : 75 Function.LeftInverse (k0Map e.symm.toStarAlgHom) (k0Map e.toStarAlgHom) := by 76 intro x 77 have h : e.symm.toStarAlgHom.comp e.toStarAlgHom = StarAlgHom.id ℂ A := by 78 ext a 79 exact e.symm_apply_apply a 80 change ((k0Map e.symm.toStarAlgHom).comp (k0Map e.toStarAlgHom)) x = x 81 rw [← k0Map_comp, h, k0Map_id] 82 rfl 83 84 theorem k0Map_rightInverse (e : A ≃⋆ₐ[ℂ] B) : 85 Function.RightInverse (k0Map e.symm.toStarAlgHom) (k0Map e.toStarAlgHom) := by 86 intro x 87 have h : e.toStarAlgHom.comp e.symm.toStarAlgHom = StarAlgHom.id ℂ B := by 88 ext a 89 exact e.apply_symm_apply a 90 change ((k0Map e.toStarAlgHom).comp (k0Map e.symm.toStarAlgHom)) x = x 91 rw [← k0Map_comp, h, k0Map_id] 92 rfl 93 94 /-- The canonical additive equivalence on unital K₀ induced by a star-algebra equivalence. -/ 95 def k0Equiv (e : A ≃⋆ₐ[ℂ] B) : K0 A ≃+ K0 B where 96 toFun := k0Map e.toStarAlgHom 97 invFun := k0Map e.symm.toStarAlgHom 98 left_inv := k0Map_leftInverse e 99 right_inv := k0Map_rightInverse e 100 map_add' := (k0Map e.toStarAlgHom).map_add 101 102 @[simp] theorem k0Equiv_toAddMonoidHom (e : A ≃⋆ₐ[ℂ] B) : 103 (k0Equiv e).toAddMonoidHom = k0Map e.toStarAlgHom := rfl 104 105 @[simp] theorem k0Equiv_class (e : A ≃⋆ₐ[ℂ] B) (x : StableProjectionMonoid A) : 106 k0Equiv e (k0Class x) = k0Class (StableProjectionMonoid.mapEquiv e x) := 107 k0Map_class e.toStarAlgHom x 108 109 @[simp] theorem k0Equiv_projection (e : A ≃⋆ₐ[ℂ] B) (p : FiniteProjection A) : 110 k0Equiv e (k0Projection p) = k0Projection (FiniteProjection.map e.toStarAlgHom p) := 111 k0Map_projection e.toStarAlgHom p 112 113 @[simp] theorem k0Equiv_refl : k0Equiv (StarAlgEquiv.refl ℂ A) = AddEquiv.refl (K0 A) := by 114 ext x 115 change k0Map (StarAlgHom.id ℂ A) x = x 116 rw [k0Map_id] 117 rfl 118 119 @[simp] theorem k0Equiv_symm (e : A ≃⋆ₐ[ℂ] B) : k0Equiv e.symm = (k0Equiv e).symm := by 120 ext x 121 rfl 122 123 @[simp] theorem k0Equiv_trans (e : A ≃⋆ₐ[ℂ] B) (f : B ≃⋆ₐ[ℂ] C) : 124 k0Equiv (e.trans f) = (k0Equiv e).trans (k0Equiv f) := by 125 ext x 126 exact DFunLike.congr_fun (k0Map_comp f.toStarAlgHom e.toStarAlgHom) x 127 128 end BC4lean.OperatorKTheory
源码 SHA-256:f46dd10925af007c8f7fa33ec2becbc25df9a0082c739a1de12cc630f4fcb21c
1 import BC4lean.OperatorK0Equivalence 2 import BC4lean.ReducedCompletion 3 import BC4lean.ReducedOperatorK0 4 5 /-! # Abstract and concrete models of the degree-zero analytic target 6 7 The actual reduced-norm completion and the concrete reduced group C⋆-algebra 8 are equipped with their canonical spectral orders. Their already verified 9 star-algebra equivalence induces the comparison on projection classes and K₀. 10 No countability assumption, computation of K₀, or assembly theorem is used. 11 -/ 12 13 noncomputable section 14 namespace BC4lean 15 open OperatorKTheory 16 17 universe u 18 variable (Γ : Type u) [Group Γ] 19 20 local instance completionSpectralOrder : PartialOrder (ReducedCompletion Γ) := 21 CStarAlgebra.spectralOrder (ReducedCompletion Γ) 22 23 local instance completionSpectralOrderedRing : StarOrderedRing (ReducedCompletion Γ) := 24 CStarAlgebra.spectralOrderedRing (ReducedCompletion Γ) 25 26 local instance reducedSpectralOrder : PartialOrder (ReducedGroupCStar Γ) := 27 CStarAlgebra.spectralOrder (ReducedGroupCStar Γ) 28 29 local instance reducedSpectralOrderedRing : StarOrderedRing (ReducedGroupCStar Γ) := 30 CStarAlgebra.spectralOrderedRing (ReducedGroupCStar Γ) 31 32 /-- Stable projection classes in the actual abstract reduced-norm completion. -/ 33 def ReducedCompletionProjectionMonoid : Type _ := StableProjectionMonoid (ReducedCompletion Γ) 34 35 instance reducedCompletionProjectionAddCommMonoid : 36 AddCommMonoid (ReducedCompletionProjectionMonoid Γ) := 37 inferInstanceAs (AddCommMonoid (StableProjectionMonoid (ReducedCompletion Γ))) 38 39 /-- K₀ of the abstract reduced-norm completion, using its canonical spectral order. -/ 40 def ReducedCompletionK0 : Type _ := K0 (ReducedCompletion Γ) 41 42 instance reducedCompletionK0AddCommGroup : AddCommGroup (ReducedCompletionK0 Γ) := 43 inferInstanceAs (AddCommGroup (K0 (ReducedCompletion Γ))) 44 45 /-- The group-completion map for stable projection classes in the abstract model. -/ 46 def reducedCompletionK0Class : ReducedCompletionProjectionMonoid Γ →+ ReducedCompletionK0 Γ := 47 k0Class 48 49 /-- Apply the canonical algebra comparison entrywise to a finite matrix projection. -/ 50 def reducedCompletionProjectionMap (p : FiniteProjection (ReducedCompletion Γ)) : 51 FiniteProjection (ReducedGroupCStar Γ) := 52 FiniteProjection.map (reducedCompletionEquiv Γ).toStarAlgHom p 53 54 @[simp] theorem reducedCompletionProjectionMap_entry (p : FiniteProjection (ReducedCompletion Γ)) 55 (i j : p.Index) : 56 projectionMatrix (reducedCompletionProjectionMap Γ p).projection i j = 57 reducedCompletionEquiv Γ (projectionMatrix p.projection i j) := rfl 58 59 /-- Canonical comparison of the stable projection monoids of the two models. -/ 60 def reducedCompletionProjectionEquiv : 61 ReducedCompletionProjectionMonoid Γ ≃+ ReducedProjectionMonoid Γ := 62 StableProjectionMonoid.mapEquiv (reducedCompletionEquiv Γ) 63 64 @[simp] theorem reducedCompletionProjectionEquiv_of (p : FiniteProjection (ReducedCompletion Γ)) : 65 reducedCompletionProjectionEquiv Γ (StableProjectionMonoid.of p) = 66 StableProjectionMonoid.of (reducedCompletionProjectionMap Γ p) := 67 StableProjectionMonoid.mapEquiv_of (reducedCompletionEquiv Γ) p 68 69 @[simp] theorem reducedCompletionProjectionEquiv_symm_of 70 (p : FiniteProjection (ReducedGroupCStar Γ)) : 71 (reducedCompletionProjectionEquiv Γ).symm (StableProjectionMonoid.of p) = 72 StableProjectionMonoid.of 73 (FiniteProjection.map (reducedCompletionEquiv Γ).symm.toStarAlgHom p) := rfl 74 75 /-- The abstract completion gives canonically the same degree-zero analytic target. -/ 76 def reducedCompletionK0Equiv : ReducedCompletionK0 Γ ≃+ ReducedK0 Γ := 77 k0Equiv (reducedCompletionEquiv Γ) 78 79 @[simp] theorem reducedCompletionK0Equiv_class (x : ReducedCompletionProjectionMonoid Γ) : 80 reducedCompletionK0Equiv Γ (reducedCompletionK0Class Γ x) = 81 reducedK0Class Γ (reducedCompletionProjectionEquiv Γ x) := 82 k0Equiv_class (reducedCompletionEquiv Γ) x 83 84 @[simp] theorem reducedCompletionK0Equiv_symm_class (x : ReducedProjectionMonoid Γ) : 85 (reducedCompletionK0Equiv Γ).symm (reducedK0Class Γ x) = 86 reducedCompletionK0Class Γ ((reducedCompletionProjectionEquiv Γ).symm x) := 87 k0Equiv_class (reducedCompletionEquiv Γ).symm x 88 89 /-- Naturality of group completion for the abstract/concrete comparison. -/ 90 theorem reducedCompletionK0Equiv_comp_class : 91 (reducedCompletionK0Equiv Γ).toAddMonoidHom.comp (reducedCompletionK0Class Γ) = 92 (reducedK0Class Γ).comp (reducedCompletionProjectionEquiv Γ).toAddMonoidHom := by 93 ext x 94 exact reducedCompletionK0Equiv_class Γ x 95 96 @[simp] theorem reducedCompletionK0Equiv_projection (p : FiniteProjection (ReducedCompletion Γ)) : 97 reducedCompletionK0Equiv Γ (reducedCompletionK0Class Γ (StableProjectionMonoid.of p)) = 98 reducedK0Class Γ (StableProjectionMonoid.of (reducedCompletionProjectionMap Γ p)) := 99 k0Equiv_projection (reducedCompletionEquiv Γ) p 100 101 /-- The comparison is uniquely determined by compatibility with projection classes. -/ 102 theorem reducedCompletionK0Equiv_unique (f : ReducedCompletionK0 Γ →+ ReducedK0 Γ) 103 (h : f.comp (reducedCompletionK0Class Γ) = 104 (reducedK0Class Γ).comp (reducedCompletionProjectionEquiv Γ).toAddMonoidHom) : 105 (reducedCompletionK0Equiv Γ).toAddMonoidHom = f := by 106 apply k0Hom_ext 107 intro p 108 exact (reducedCompletionK0Equiv_class Γ (StableProjectionMonoid.of p)).trans 109 (DFunLike.congr_fun h (StableProjectionMonoid.of p)).symm 110 111 end BC4lean
源码 SHA-256:997580bc744a09a0c35007ceb52f228aaefc3f5a884f3e7b564ccced1e999dc7
1 import BC4lean.UnitaryHomotopy 2 import Mathlib.Analysis.SpecialFunctions.Trigonometric.Basic 3 4 /-! # Block rotation and the inverse homotopy for matrix unitaries 5 6 The explicit rotation path gives the inverse mechanism for stable K₁. 7 The stable quotient and its group structure are separate constructions. 8 -/ 9 10 noncomputable section 11 namespace BC4lean.OperatorKTheory 12 open scoped Matrix 13 14 variable {A : Type*} [CStarAlgebra A] [PartialOrder A] [StarOrderedRing A] 15 variable {ι : Type*} [Fintype ι] [DecidableEq ι] 16 17 /-- The scalar block rotation through angle `t`, with identity blocks indexed by `ι`. -/ 18 def rotationMatrix (t : ℝ) : CStarMatrix (ι ⊕ ι) (ι ⊕ ι) A := 19 CStarMatrix.ofMatrix (Matrix.fromBlocks 20 (Real.cos t • (1 : Matrix ι ι A)) (-Real.sin t • (1 : Matrix ι ι A)) 21 (Real.sin t • (1 : Matrix ι ι A)) (Real.cos t • (1 : Matrix ι ι A))) 22 23 omit [PartialOrder A] [StarOrderedRing A] in 24 theorem rotationMatrix_mem_unitary (t : ℝ) : 25 rotationMatrix (A := A) (ι := ι) t ∈ unitary (CStarMatrix (ι ⊕ ι) (ι ⊕ ι) A) := by 26 have h : Real.cos t * Real.cos t + Real.sin t * Real.sin t = 1 := by 27 nlinarith [Real.sin_sq_add_cos_sq t] 28 have h' : Real.sin t * Real.sin t + Real.cos t * Real.cos t = 1 := by 29 simpa only [add_comm] using h 30 rw [Unitary.mem_iff] 31 let M : Matrix (ι ⊕ ι) (ι ⊕ ι) A := Matrix.fromBlocks 32 (Real.cos t • (1 : Matrix ι ι A)) (-Real.sin t • (1 : Matrix ι ι A)) 33 (Real.sin t • (1 : Matrix ι ι A)) (Real.cos t • (1 : Matrix ι ι A)) 34 change (Mᴴ * M = 1) ∧ (M * Mᴴ = 1) 35 dsimp [M] 36 simp only [Matrix.fromBlocks_conjTranspose, Matrix.conjTranspose_smul, 37 star_trivial, Matrix.conjTranspose_one, Matrix.fromBlocks_multiply, 38 Matrix.smul_mul, Matrix.mul_smul, Matrix.one_mul, smul_smul] 39 constructor <;> 40 simp [mul_neg, neg_smul, ← add_smul, h, h', mul_comm, Matrix.fromBlocks_one] 41 42 /-- Scalar rotations, bundled as matrix unitaries. -/ 43 def rotationUnitary (t : ℝ) : MatrixUnitary A (ι ⊕ ι) := 44 ⟨rotationMatrix t, rotationMatrix_mem_unitary t⟩ 45 46 theorem continuous_rotationUnitary : 47 Continuous (rotationUnitary (A := A) (ι := ι)) := by 48 apply Continuous.subtype_mk 49 exact CStarMatrix.ofMatrixL.continuous.comp 50 ((Real.continuous_cos.smul continuous_const).matrix_fromBlocks 51 (Real.continuous_sin.neg.smul continuous_const) 52 (Real.continuous_sin.smul continuous_const) 53 (Real.continuous_cos.smul continuous_const)) 54 55 @[simp] theorem rotationUnitary_zero : rotationUnitary (A := A) (ι := ι) 0 = 1 := by 56 apply Subtype.ext 57 change rotationMatrix 0 = 1 58 simp only [rotationMatrix, Real.cos_zero, Real.sin_zero, neg_zero, 59 one_smul, zero_smul, Matrix.fromBlocks_one] 60 rfl 61 62 @[simp] theorem unitaryBlockSum_one : 63 unitaryBlockSum (1 : MatrixUnitary A ι) (1 : MatrixUnitary A ι) = 1 := by 64 apply Subtype.ext 65 exact matrixBlockSum_one 66 67 theorem unitaryBlockSum_mul (u v w z : MatrixUnitary A ι) : 68 unitaryBlockSum u v * unitaryBlockSum w z = unitaryBlockSum (u * w) (v * z) := by 69 apply Subtype.ext 70 change matrixBlockSum (u : CStarMatrix ι ι A) (v : CStarMatrix ι ι A) * 71 matrixBlockSum (w : CStarMatrix ι ι A) (z : CStarMatrix ι ι A) = 72 matrixBlockSum ((u : CStarMatrix ι ι A) * (w : CStarMatrix ι ι A)) 73 ((v : CStarMatrix ι ι A) * (z : CStarMatrix ι ι A)) 74 exact matrixBlockSum_mul (u : CStarMatrix ι ι A) (w : CStarMatrix ι ι A) 75 (v : CStarMatrix ι ι A) (z : CStarMatrix ι ι A) 76 77 /-- A quarter-turn exchanges diagonal blocks by conjugation. -/ 78 theorem rotationUnitary_conjugate (u v : MatrixUnitary A ι) : 79 rotationUnitary (Real.pi / 2) * unitaryBlockSum u v * 80 (rotationUnitary (Real.pi / 2))⁻¹ = unitaryBlockSum v u := by 81 apply Subtype.ext 82 let U : Matrix ι ι A := CStarMatrix.ofMatrix.symm u 83 let V : Matrix ι ι A := CStarMatrix.ofMatrix.symm v 84 let R : Matrix (ι ⊕ ι) (ι ⊕ ι) A := Matrix.fromBlocks 85 (Real.cos (Real.pi / 2) • (1 : Matrix ι ι A)) 86 (-Real.sin (Real.pi / 2) • (1 : Matrix ι ι A)) 87 (Real.sin (Real.pi / 2) • (1 : Matrix ι ι A)) 88 (Real.cos (Real.pi / 2) • (1 : Matrix ι ι A)) 89 change R * Matrix.fromBlocks U 0 0 V * Rᴴ = Matrix.fromBlocks V 0 0 U 90 dsimp [R] 91 simp [Real.cos_pi_div_two, Real.sin_pi_div_two, 92 Matrix.fromBlocks_conjTranspose, Matrix.fromBlocks_multiply] 93 94 /-- Rotate the second factor from the lower block into the upper block. -/ 95 def unitaryBlockProductPath (u v : MatrixUnitary A ι) : 96 Path (unitaryBlockSum u v) (unitaryBlockSum (u * v) 1) where 97 toFun t := unitaryBlockSum u 1 * rotationUnitary ((t : ℝ) * (Real.pi / 2)) * 98 unitaryBlockSum 1 v * (rotationUnitary ((t : ℝ) * (Real.pi / 2)))⁻¹ 99 continuous_toFun := by 100 have h : Continuous (fun t : unitInterval => 101 rotationUnitary (A := A) (ι := ι) ((t : ℝ) * (Real.pi / 2))) := 102 continuous_rotationUnitary.comp 103 (continuous_subtype_val.mul_const (Real.pi / 2)) 104 exact ((continuous_const.mul h).mul continuous_const).mul h.inv 105 source' := by 106 simp [unitaryBlockSum_mul] 107 target' := by 108 simp only [Set.Icc.coe_one, one_mul] 109 rw [mul_assoc (unitaryBlockSum u 1), mul_assoc (unitaryBlockSum u 1), 110 rotationUnitary_conjugate] 111 simp only [unitaryBlockSum_mul, one_mul] 112 113 /-- After doubling the matrix size, block sum agrees with multiplication up to norm homotopy. -/ 114 theorem unitaryHomotopic_blockSum_mul (u v : MatrixUnitary A ι) : 115 UnitaryHomotopic (unitaryBlockSum u v) (unitaryBlockSum (u * v) 1) := 116 ⟨unitaryBlockProductPath u v⟩ 117 118 /-- The block sum of a unitary and its adjoint has an explicit path to the identity. -/ 119 def unitaryInversePath (u : MatrixUnitary A ι) : 120 Path (unitaryBlockSum u (star u)) 1 := by 121 simpa using unitaryBlockProductPath u (star u) 122 123 theorem unitaryHomotopic_blockSum_star (u : MatrixUnitary A ι) : 124 UnitaryHomotopic (unitaryBlockSum u (star u)) 1 := 125 ⟨unitaryInversePath u⟩ 126 127 theorem unitaryHomotopic_star_blockSum (u : MatrixUnitary A ι) : 128 UnitaryHomotopic (unitaryBlockSum (star u) u) 1 := by 129 simpa using unitaryHomotopic_blockSum_star (star u) 130 131 end BC4lean.OperatorKTheory
源码 SHA-256:9e3fbfdfcf96bcc88a2345931487a93224ccd8636020ecd7f12c590ed279fe17
1 import BC4lean.UnitaryRotation 2 import BC4lean.MatrixProjectionMap 3 import Mathlib.Logic.Relation 4 5 /-! # Stable norm-homotopy of finite matrix unitaries 6 7 The generators are actual norm homotopies (after a change of finite coordinates) 8 and adjoining identity blocks. No additive or inverse relations are imposed. 9 -/ 10 noncomputable section 11 namespace BC4lean.OperatorKTheory 12 universe u 13 variable {A : Type u} [CStarAlgebra A] [PartialOrder A] [StarOrderedRing A] 14 variable {ι κ ρ σ : Type} [Fintype ι] [Fintype κ] [Fintype ρ] [Fintype σ] 15 variable [DecidableEq ι] [DecidableEq κ] [DecidableEq ρ] [DecidableEq σ] 16 17 def unitaryReindex (e : ι ≃ κ) (a : MatrixUnitary A ι) : MatrixUnitary A κ := 18 ⟨CStarMatrix.reindexₐ ℂ A e a, Unitary.map_mem (CStarMatrix.reindexₐ ℂ A e) a.property⟩ 19 20 @[simp] theorem unitaryReindex_apply (e : ι ≃ κ) (a : MatrixUnitary A ι) (i j : κ) : 21 (unitaryReindex e a : CStarMatrix κ κ A) i j = (a : CStarMatrix ι ι A) (e.symm i) (e.symm j) := rfl 22 23 @[simp] theorem unitaryReindex_refl (a : MatrixUnitary A ι) : 24 unitaryReindex (Equiv.refl ι) a = a := by apply Subtype.ext; rfl 25 26 @[simp] theorem unitaryReindex_star (e : ι ≃ κ) (a : MatrixUnitary A ι) : 27 unitaryReindex e (star a) = star (unitaryReindex e a) := by 28 apply Subtype.ext 29 exact map_star (CStarMatrix.reindexₐ ℂ A e) (a : CStarMatrix ι ι A) 30 31 theorem unitaryReindex_blockSum (e : ι ≃ κ) (f : ρ ≃ σ) 32 (a : MatrixUnitary A ι) (b : MatrixUnitary A ρ) : 33 unitaryReindex (e.sumCongr f) (unitaryBlockSum a b) = 34 unitaryBlockSum (unitaryReindex e a) (unitaryReindex f b) := by 35 apply Subtype.ext 36 ext i j 37 cases i <;> cases j <;> rfl 38 39 @[simp] theorem unitaryBlockSum_star (a : MatrixUnitary A ι) (b : MatrixUnitary A κ) : 40 star (unitaryBlockSum a b) = unitaryBlockSum (star a) (star b) := by 41 apply Subtype.ext 42 exact matrixBlockSum_star (a : CStarMatrix ι ι A) (b : CStarMatrix κ κ A) 43 44 structure FiniteUnitary (A : Type u) [CStarAlgebra A] [PartialOrder A] [StarOrderedRing A] where 45 Index : Type 46 [indexFintype : Fintype Index] 47 [indexDecidableEq : DecidableEq Index] 48 val : MatrixUnitary A Index 49 attribute [instance] FiniteUnitary.indexFintype FiniteUnitary.indexDecidableEq 50 51 namespace FiniteUnitary 52 53 abbrev ofUnitary (a : MatrixUnitary A ι) : FiniteUnitary A := ⟨ι, a⟩ 54 abbrev identity (ι : Type) [Fintype ι] [DecidableEq ι] : FiniteUnitary A := ofUnitary (1 : MatrixUnitary A ι) 55 abbrev zero : FiniteUnitary A := identity Empty 56 57 abbrev blockSum (a b : FiniteUnitary A) : FiniteUnitary A := 58 ofUnitary (unitaryBlockSum a.val b.val) 59 60 abbrev adjoint (a : FiniteUnitary A) : FiniteUnitary A := ofUnitary (star a.val) 61 62 /-- The geometric moves defining the stable quotient. -/ 63 inductive Move : FiniteUnitary A → FiniteUnitary A → Prop 64 | homotopy (a b : FiniteUnitary A) (e : a.Index ≃ b.Index) 65 (h : UnitaryHomotopic (unitaryReindex e a.val) b.val) : Move a b 66 | stabilize (a : FiniteUnitary A) (κ : Type) [Fintype κ] [DecidableEq κ] : 67 Move a (blockSum a (identity κ)) 68 69 /-- A finite chain of coordinate changes, norm homotopies, and identity stabilizations. -/ 70 def Equivalent : FiniteUnitary A → FiniteUnitary A → Prop := Relation.EqvGen Move 71 72 theorem equivalent_refl (a : FiniteUnitary A) : Equivalent a a := .refl _ 73 theorem equivalent_symm {a b : FiniteUnitary A} (h : Equivalent a b) : Equivalent b a := .symm _ _ h 74 theorem equivalent_trans {a b c : FiniteUnitary A} (h : Equivalent a b) (k : Equivalent b c) : 75 Equivalent a c := .trans _ _ _ h k 76 77 theorem equivalent_reindex (a b : FiniteUnitary A) (e : a.Index ≃ b.Index) 78 (h : unitaryReindex e a.val = b.val) : Equivalent a b := 79 .rel _ _ (.homotopy a b e (h ▸ unitaryHomotopic_refl _)) 80 81 theorem equivalent_homotopy {a b : MatrixUnitary A ι} (h : UnitaryHomotopic a b) : 82 Equivalent (ofUnitary a) (ofUnitary b) := 83 .rel _ _ (.homotopy _ _ (Equiv.refl ι) (by 84 change UnitaryHomotopic (unitaryReindex (Equiv.refl ι) a) b 85 simpa only [unitaryReindex_refl] using h)) 86 87 theorem equivalent_stabilize (a : FiniteUnitary A) (κ : Type) [Fintype κ] [DecidableEq κ] : 88 Equivalent a (blockSum a (identity κ)) := .rel _ _ (.stabilize a κ) 89 90 theorem blockSum_comm (a b : FiniteUnitary A) : Equivalent (blockSum a b) (blockSum b a) := by 91 apply equivalent_reindex _ _ (Equiv.sumComm a.Index b.Index) 92 apply Subtype.ext 93 ext i j 94 cases i <;> cases j <;> rfl 95 96 theorem blockSum_assoc (a b c : FiniteUnitary A) : 97 Equivalent (blockSum (blockSum a b) c) (blockSum a (blockSum b c)) := by 98 apply equivalent_reindex _ _ (Equiv.sumAssoc a.Index b.Index c.Index) 99 apply Subtype.ext 100 ext i j 101 rcases i with i | (i | i) <;> rcases j with j | (j | j) <;> rfl 102 103 theorem zero_blockSum (a : FiniteUnitary A) : Equivalent (blockSum zero a) a := by 104 apply equivalent_reindex _ _ (Equiv.emptySum Empty a.Index) 105 apply Subtype.ext 106 ext i j 107 rfl 108 109 theorem blockSum_zero (a : FiniteUnitary A) : Equivalent (blockSum a zero) a := 110 equivalent_trans (blockSum_comm a zero) (zero_blockSum a) 111 112 /-- Compatibility with a block context is derived from the geometric moves. -/ 113 theorem blockSum_right {a b : FiniteUnitary A} (h : Equivalent a b) (c : FiniteUnitary A) : 114 Equivalent (blockSum a c) (blockSum b c) := by 115 induction h with 116 | refl a => exact equivalent_refl _ 117 | symm a b h ih => exact equivalent_symm ih 118 | trans a b d h k ih ik => exact equivalent_trans ih ik 119 | rel a b h => 120 cases h with 121 | homotopy b e h => 122 apply Relation.EqvGen.rel 123 apply Move.homotopy _ _ (e.sumCongr (Equiv.refl c.Index)) 124 simpa only [blockSum, ofUnitary, unitaryReindex_blockSum, unitaryReindex_refl] using 125 unitaryHomotopic_blockSum h (unitaryHomotopic_refl c.val) 126 | stabilize κ => 127 -- Move the new identity block past the fixed context by finite reindexing. 128 apply equivalent_trans (equivalent_stabilize (blockSum a c) κ) 129 apply equivalent_reindex _ _ 130 (((Equiv.sumAssoc a.Index c.Index κ).trans 131 ((Equiv.refl a.Index).sumCongr (Equiv.sumComm c.Index κ))).trans 132 (Equiv.sumAssoc a.Index κ c.Index).symm) 133 apply Subtype.ext 134 ext i j 135 rcases i with (i | i) | i <;> rcases j with (j | j) | j <;> rfl 136 137 theorem blockSum_congr {a b c d : FiniteUnitary A} 138 (h : Equivalent a b) (k : Equivalent c d) : Equivalent (blockSum a c) (blockSum b d) := 139 equivalent_trans (blockSum_right h c) 140 (equivalent_trans (blockSum_comm b c) 141 (equivalent_trans (blockSum_right k b) (blockSum_comm d b))) 142 143 theorem adjoint_congr {a b : FiniteUnitary A} (h : Equivalent a b) : 144 Equivalent (adjoint a) (adjoint b) := by 145 induction h with 146 | refl a => exact equivalent_refl _ 147 | symm a b h ih => exact equivalent_symm ih 148 | trans a b c h k ih ik => exact equivalent_trans ih ik 149 | rel a b h => 150 cases h with 151 | homotopy b e h => 152 apply Relation.EqvGen.rel 153 apply Move.homotopy (adjoint a) (adjoint b) e 154 change UnitaryHomotopic (unitaryReindex e (star a.val)) (star b.val) 155 rw [unitaryReindex_star] 156 exact unitaryHomotopic_inv h 157 | stabilize κ => 158 have eq : adjoint (blockSum a (identity κ)) = blockSum (adjoint a) (identity κ) := by 159 change ofUnitary (star (unitaryBlockSum a.val 1)) = ofUnitary (unitaryBlockSum (star a.val) 1) 160 rw [unitaryBlockSum_star, star_one] 161 rw [eq] 162 exact equivalent_stabilize (adjoint a) κ 163 164 theorem equivalent_identity (ι : Type) [Fintype ι] [DecidableEq ι] : 165 Equivalent (identity (A := A) ι) zero := 166 equivalent_symm (equivalent_trans (equivalent_stabilize zero ι) (zero_blockSum (identity ι))) 167 168 theorem adjoint_blockSum (a : FiniteUnitary A) : Equivalent (blockSum (adjoint a) a) zero := 169 equivalent_trans (equivalent_homotopy (unitaryHomotopic_star_blockSum a.val)) 170 (equivalent_identity (a.Index ⊕ a.Index)) 171 172 def setoid : Setoid (FiniteUnitary A) := Relation.EqvGen.setoid Move 173 174 end FiniteUnitary 175 176 /-- The stable unitary norm-homotopy quotient, with arbitrary finite coordinates. -/ 177 abbrev K1 (A : Type u) [CStarAlgebra A] [PartialOrder A] [StarOrderedRing A] := 178 Quotient (FiniteUnitary.setoid (A := A)) 179 180 namespace K1 181 182 def of (a : FiniteUnitary A) : K1 A := Quotient.mk _ a 183 instance : Zero (K1 A) := ⟨of FiniteUnitary.zero⟩ 184 instance : Add (K1 A) := ⟨Quotient.map₂ FiniteUnitary.blockSum 185 (fun _ _ h _ _ k => FiniteUnitary.blockSum_congr h k)⟩ 186 instance : Neg (K1 A) := ⟨Quotient.map FiniteUnitary.adjoint (fun _ _ h => FiniteUnitary.adjoint_congr h)⟩ 187 188 @[simp] theorem of_blockSum (a b : FiniteUnitary A) : of (FiniteUnitary.blockSum a b) = of a + of b := rfl 189 @[simp] theorem of_adjoint (a : FiniteUnitary A) : of (FiniteUnitary.adjoint a) = -of a := rfl 190 191 theorem of_eq_iff (a b : FiniteUnitary A) : of a = of b ↔ FiniteUnitary.Equivalent a b := Quotient.eq 192 193 instance instAddCommGroup : AddCommGroup (K1 A) where 194 add_assoc a b c := Quotient.inductionOn₃ a b c fun a b c => Quotient.sound (FiniteUnitary.blockSum_assoc a b c) 195 zero_add a := Quotient.inductionOn a fun a => Quotient.sound (FiniteUnitary.zero_blockSum a) 196 add_zero a := Quotient.inductionOn a fun a => Quotient.sound (FiniteUnitary.blockSum_zero a) 197 add_comm a b := Quotient.inductionOn₂ a b fun a b => Quotient.sound (FiniteUnitary.blockSum_comm a b) 198 neg_add_cancel a := Quotient.inductionOn a fun a => Quotient.sound (FiniteUnitary.adjoint_blockSum a) 199 nsmul := nsmulRec 200 zsmul := zsmulRec 201 202 @[simp] theorem of_identity (ι : Type) [Fintype ι] [DecidableEq ι] : 203 of (FiniteUnitary.identity (A := A) ι) = 0 := Quotient.sound (FiniteUnitary.equivalent_identity ι) 204 205 theorem of_homotopic {a b : MatrixUnitary A ι} (h : UnitaryHomotopic a b) : 206 of (FiniteUnitary.ofUnitary a) = of (FiniteUnitary.ofUnitary b) := 207 Quotient.sound (FiniteUnitary.equivalent_homotopy h) 208 209 theorem of_stabilize (a : FiniteUnitary A) (κ : Type) [Fintype κ] [DecidableEq κ] : 210 of (FiniteUnitary.blockSum a (FiniteUnitary.identity κ)) = of a := 211 Quotient.sound (FiniteUnitary.equivalent_symm (FiniteUnitary.equivalent_stabilize a κ)) 212 213 end K1 214 /-- Every stable unitary class has an ordinary finite-matrix representative. -/ 215 theorem K1.exists_finRepresentative (x : K1 A) : 216 ∃ (n : ℕ) (a : MatrixUnitary A (Fin n)), K1.of (FiniteUnitary.ofUnitary a) = x := by 217 refine Quotient.inductionOn x ?_ 218 intro a 219 let e := Fintype.equivFin a.Index 220 refine ⟨Fintype.card a.Index, unitaryReindex e a.val, ?_⟩ 221 exact Quotient.sound (FiniteUnitary.equivalent_symm 222 (FiniteUnitary.equivalent_reindex a (FiniteUnitary.ofUnitary (unitaryReindex e a.val)) e rfl)) 223 224 end BC4lean.OperatorKTheory
源码 SHA-256:5d5948fa08aa8143f5187ab32a022d327e46ee58c17c7f9d957bef1ca9fe327e
1 import BC4lean.StableUnitary 2 import Mathlib.Analysis.CStarAlgebra.Spectrum 3 4 /-! # Functoriality of the stable unitary quotient -/ 5 noncomputable section 6 open scoped CStarAlgebra 7 namespace BC4lean.OperatorKTheory 8 universe u v w 9 variable {A : Type u} {B : Type v} {C : Type w} 10 variable [CStarAlgebra A] [CStarAlgebra B] [CStarAlgebra C] 11 variable [PartialOrder A] [StarOrderedRing A] [PartialOrder B] [StarOrderedRing B] 12 variable [PartialOrder C] [StarOrderedRing C] 13 variable {ι κ : Type} [Fintype ι] [Fintype κ] [DecidableEq ι] [DecidableEq κ] 14 15 def matrixUnitaryMap (φ : A →⋆ₐ[ℂ] B) (a : MatrixUnitary A ι) : MatrixUnitary B ι := 16 ⟨matrixMap φ a, Unitary.map_mem (matrixMap φ) a.property⟩ 17 18 @[simp] theorem matrixUnitaryMap_apply (φ : A →⋆ₐ[ℂ] B) (a : MatrixUnitary A ι) (i j : ι) : 19 (matrixUnitaryMap φ a : CStarMatrix ι ι B) i j = φ ((a : CStarMatrix ι ι A) i j) := rfl 20 21 theorem continuous_matrixUnitaryMap (φ : A →⋆ₐ[ℂ] B) : 22 Continuous (matrixUnitaryMap (ι := ι) φ) := 23 ((map_continuous (matrixMap φ)).comp continuous_subtype_val).subtype_mk _ 24 25 @[simp] theorem matrixUnitaryMap_one (φ : A →⋆ₐ[ℂ] B) : 26 matrixUnitaryMap φ (1 : MatrixUnitary A ι) = 1 := by 27 apply Subtype.ext 28 exact map_one (matrixMap φ) 29 30 @[simp] theorem matrixUnitaryMap_blockSum (φ : A →⋆ₐ[ℂ] B) 31 (a : MatrixUnitary A ι) (b : MatrixUnitary A κ) : 32 matrixUnitaryMap φ (unitaryBlockSum a b) = 33 unitaryBlockSum (matrixUnitaryMap φ a) (matrixUnitaryMap φ b) := by 34 apply Subtype.ext 35 ext i j 36 cases i <;> cases j <;> simp [unitaryBlockSum, matrixBlockSum, Matrix.fromBlocks, matrixUnitaryMap_apply] 37 38 @[simp] theorem matrixUnitaryMap_reindex (φ : A →⋆ₐ[ℂ] B) (e : ι ≃ κ) (a : MatrixUnitary A ι) : 39 matrixUnitaryMap φ (unitaryReindex e a) = unitaryReindex e (matrixUnitaryMap φ a) := by 40 apply Subtype.ext 41 rfl 42 43 theorem unitaryHomotopic_map (φ : A →⋆ₐ[ℂ] B) {a b : MatrixUnitary A ι} 44 (h : UnitaryHomotopic a b) : UnitaryHomotopic (matrixUnitaryMap φ a) (matrixUnitaryMap φ b) := 45 h.map (continuous_matrixUnitaryMap φ) 46 47 namespace FiniteUnitary 48 49 abbrev map (φ : A →⋆ₐ[ℂ] B) (a : FiniteUnitary A) : FiniteUnitary B := 50 ofUnitary (matrixUnitaryMap φ a.val) 51 52 @[simp] theorem map_identity (φ : A →⋆ₐ[ℂ] B) (ι : Type) [Fintype ι] [DecidableEq ι] : 53 map φ (identity ι) = identity ι := by 54 change ofUnitary (matrixUnitaryMap φ 1) = ofUnitary 1 55 rw [matrixUnitaryMap_one] 56 57 @[simp] theorem map_blockSum (φ : A →⋆ₐ[ℂ] B) (a b : FiniteUnitary A) : 58 map φ (blockSum a b) = blockSum (map φ a) (map φ b) := by 59 change ofUnitary (matrixUnitaryMap φ (unitaryBlockSum a.val b.val)) = _ 60 rw [matrixUnitaryMap_blockSum] 61 62 theorem equivalent_map (φ : A →⋆ₐ[ℂ] B) {a b : FiniteUnitary A} (h : Equivalent a b) : 63 Equivalent (map φ a) (map φ b) := by 64 induction h with 65 | refl a => exact equivalent_refl _ 66 | symm a b h ih => exact equivalent_symm ih 67 | trans a b c h k ih ik => exact equivalent_trans ih ik 68 | rel a b h => 69 cases h with 70 | homotopy b e h => 71 apply Relation.EqvGen.rel 72 apply Move.homotopy (map φ a) (map φ b) e 73 simpa only [map, ofUnitary, matrixUnitaryMap_reindex] using unitaryHomotopic_map φ h 74 | stabilize κ => 75 rw [map_blockSum, map_identity] 76 exact equivalent_stabilize _ κ 77 78 @[simp] theorem map_id (a : FiniteUnitary A) : map (StarAlgHom.id ℂ A) a = a := by 79 cases a 80 rfl 81 82 @[simp] theorem map_comp (ψ : B →⋆ₐ[ℂ] C) (φ : A →⋆ₐ[ℂ] B) (a : FiniteUnitary A) : 83 map (ψ.comp φ) a = map ψ (map φ a) := rfl 84 end FiniteUnitary 85 86 def k1Map (φ : A →⋆ₐ[ℂ] B) : K1 A →+ K1 B where 87 toFun := Quotient.map (FiniteUnitary.map φ) (fun _ _ h => FiniteUnitary.equivalent_map φ h) 88 map_zero' := by 89 change K1.of (FiniteUnitary.map φ (FiniteUnitary.identity Empty)) = _ 90 rw [FiniteUnitary.map_identity] 91 rfl 92 map_add' a b := by 93 refine Quotient.inductionOn₂ a b ?_ 94 intro a b 95 change K1.of (FiniteUnitary.map φ (FiniteUnitary.blockSum a b)) = _ 96 rw [FiniteUnitary.map_blockSum] 97 rfl 98 99 @[simp] theorem k1Map_of (φ : A →⋆ₐ[ℂ] B) (a : FiniteUnitary A) : 100 k1Map φ (K1.of a) = K1.of (FiniteUnitary.map φ a) := rfl 101 102 @[simp] theorem k1Map_id : k1Map (StarAlgHom.id ℂ A) = AddMonoidHom.id (K1 A) := by 103 ext x 104 refine Quotient.inductionOn x ?_ 105 intro a 106 exact congrArg K1.of (FiniteUnitary.map_id a) 107 108 @[simp] theorem k1Map_comp (ψ : B →⋆ₐ[ℂ] C) (φ : A →⋆ₐ[ℂ] B) : 109 k1Map (ψ.comp φ) = (k1Map ψ).comp (k1Map φ) := by 110 ext x 111 refine Quotient.inductionOn x ?_ 112 intro a 113 rfl 114 115 end BC4lean.OperatorKTheory
源码 SHA-256:ad22a2a965520e0c299eaf26b9a0d3058ebba09caf978568a32cec3c54e570bd
1 import BC4lean.OperatorK0Functoriality 2 import BC4lean.OperatorK1Functoriality 3 import Mathlib.Analysis.CStarAlgebra.Unitization 4 import Mathlib.Analysis.CStarAlgebra.ContinuousFunctionalCalculus.Basic 5 import Mathlib.Algebra.Group.Subgroup.Ker 6 7 /-! # Operator K-groups through forced unitization 8 9 For a possibly nonunital complex C*-algebra, take the kernels of the scalar 10 quotient maps in degrees zero and one. All matrix orders are spectral orders. 11 -/ 12 noncomputable section 13 namespace BC4lean.OperatorKTheory 14 universe u v w 15 16 local instance operatorSpectralOrder (B : Type*) [CStarAlgebra B] : PartialOrder B := 17 CStarAlgebra.spectralOrder B 18 local instance operatorSpectralOrderedRing (B : Type*) [CStarAlgebra B] : StarOrderedRing B := 19 CStarAlgebra.spectralOrderedRing B 20 21 variable (A : Type u) [NonUnitalCStarAlgebra A] 22 23 /-- The scalar quotient of the forced unitization. -/ 24 def scalarQuotient : Unitization ℂ A →⋆ₐ[ℂ] ℂ := 25 { Unitization.fstHom ℂ A with map_star' := Unitization.fst_star } 26 27 /-- The scalar inclusion is a unital section. -/ 28 def scalarSection : ℂ →⋆ₐ[ℂ] Unitization ℂ A := StarAlgHom.ofId ℂ _ 29 30 @[simp] theorem scalarQuotient_section : 31 (scalarQuotient A).comp (scalarSection A) = StarAlgHom.id ℂ ℂ := by 32 ext z 33 rfl 34 35 /-- Degree-zero operator K-theory for a possibly nonunital algebra. -/ 36 def OperatorK0 : Type _ := (k0Map (scalarQuotient A)).ker 37 38 /-- Degree-one operator K-theory for a possibly nonunital algebra. -/ 39 def OperatorK1 : Type _ := (k1Map (scalarQuotient A)).ker 40 41 instance operatorK0AddCommGroup : AddCommGroup (OperatorK0 A) := 42 inferInstanceAs (AddCommGroup (k0Map (scalarQuotient A)).ker) 43 instance operatorK1AddCommGroup : AddCommGroup (OperatorK1 A) := 44 inferInstanceAs (AddCommGroup (k1Map (scalarQuotient A)).ker) 45 46 /-- Inclusion of the degree-zero kernel into the K-group of the unitization. -/ 47 def operatorK0Inclusion : OperatorK0 A →+ K0 (Unitization ℂ A) := 48 (k0Map (scalarQuotient A)).ker.subtype 49 50 /-- Inclusion of the degree-one kernel into the K-group of the unitization. -/ 51 def operatorK1Inclusion : OperatorK1 A →+ K1 (Unitization ℂ A) := 52 (k1Map (scalarQuotient A)).ker.subtype 53 54 theorem operatorK0Inclusion_injective : Function.Injective (operatorK0Inclusion A) := Subtype.val_injective 55 theorem operatorK1Inclusion_injective : Function.Injective (operatorK1Inclusion A) := Subtype.val_injective 56 57 theorem operatorK0_scalar_zero (x : OperatorK0 A) : k0Map (scalarQuotient A) (operatorK0Inclusion A x) = 0 := x.property 58 theorem operatorK1_scalar_zero (x : OperatorK1 A) : k1Map (scalarQuotient A) (operatorK1Inclusion A x) = 0 := x.property 59 60 variable {A} {B : Type v} {C : Type w} [NonUnitalCStarAlgebra B] [NonUnitalCStarAlgebra C] 61 62 theorem scalarQuotient_natural (φ : A →⋆ₙₐ[ℂ] B) : 63 (scalarQuotient B).comp (Unitization.starMap φ) = scalarQuotient A := by 64 ext x 65 change (Unitization.starMap φ (x : Unitization ℂ A)).fst = 0 66 simp 67 68 def operatorK0Map (φ : A →⋆ₙₐ[ℂ] B) : OperatorK0 A →+ OperatorK0 B where 69 toFun x := ⟨k0Map (Unitization.starMap φ) x.val, by 70 change k0Map (scalarQuotient B) (k0Map (Unitization.starMap φ) x.val) = 0 71 rw [← AddMonoidHom.comp_apply, ← k0Map_comp, scalarQuotient_natural] 72 exact x.property⟩ 73 map_zero' := Subtype.ext (map_zero _) 74 map_add' x y := Subtype.ext (map_add _ x.val y.val) 75 76 def operatorK1Map (φ : A →⋆ₙₐ[ℂ] B) : OperatorK1 A →+ OperatorK1 B where 77 toFun x := ⟨k1Map (Unitization.starMap φ) x.val, by 78 change k1Map (scalarQuotient B) (k1Map (Unitization.starMap φ) x.val) = 0 79 rw [← AddMonoidHom.comp_apply, ← k1Map_comp, scalarQuotient_natural] 80 exact x.property⟩ 81 map_zero' := Subtype.ext (map_zero _) 82 map_add' x y := Subtype.ext (map_add _ x.val y.val) 83 84 @[simp] theorem operatorK0Map_id : operatorK0Map (NonUnitalStarAlgHom.id ℂ A) = AddMonoidHom.id (OperatorK0 A) := by 85 ext x 86 apply Subtype.ext 87 change k0Map (Unitization.starMap (NonUnitalStarAlgHom.id ℂ A)) x.val = x.val 88 rw [Unitization.starMap_id, k0Map_id] 89 rfl 90 91 @[simp] theorem operatorK1Map_id : operatorK1Map (NonUnitalStarAlgHom.id ℂ A) = AddMonoidHom.id (OperatorK1 A) := by 92 ext x 93 apply Subtype.ext 94 change k1Map (Unitization.starMap (NonUnitalStarAlgHom.id ℂ A)) x.val = x.val 95 rw [Unitization.starMap_id, k1Map_id] 96 rfl 97 98 @[simp] theorem operatorK0Map_comp (ψ : B →⋆ₙₐ[ℂ] C) (φ : A →⋆ₙₐ[ℂ] B) : 99 operatorK0Map (ψ.comp φ) = (operatorK0Map ψ).comp (operatorK0Map φ) := by 100 ext x 101 apply Subtype.ext 102 change k0Map (Unitization.starMap (ψ.comp φ)) x.val = _ 103 rw [Unitization.starMap_comp, k0Map_comp] 104 rfl 105 106 @[simp] theorem operatorK1Map_comp (ψ : B →⋆ₙₐ[ℂ] C) (φ : A →⋆ₙₐ[ℂ] B) : 107 operatorK1Map (ψ.comp φ) = (operatorK1Map ψ).comp (operatorK1Map φ) := by 108 ext x 109 apply Subtype.ext 110 change k1Map (Unitization.starMap (ψ.comp φ)) x.val = _ 111 rw [Unitization.starMap_comp, k1Map_comp] 112 rfl 113 114 end BC4lean.OperatorKTheory
源码 SHA-256:23ba89c79c9406c8da472fd19c7e6c049475c780ecd507f96da440b9b0b5a9f3
1 import Mathlib.Analysis.CStarAlgebra.Unitization 2 import Mathlib.Algebra.Star.StarAlgHom 3 4 /-! # The forced unitization of an already unital algebra -/ 5 noncomputable section 6 namespace BC4lean.OperatorKTheory 7 variable (A : Type*) [CStarAlgebra A] 8 9 /-- Evaluation of the new scalar unit using the original unit. -/ 10 def unitizationEval : Unitization ℂ A →⋆ₐ[ℂ] A := 11 Unitization.starLift (NonUnitalStarAlgHom.id ℂ A) 12 13 @[simp] theorem unitizationEval_apply (x : Unitization ℂ A) : 14 unitizationEval A x = algebraMap ℂ A x.fst + x.snd := rfl 15 16 /-- The scalar coordinate and original-unit evaluation split the forced unitization. -/ 17 def unitizationProductHom : Unitization ℂ A →⋆ₐ[ℂ] ℂ × A := 18 ({ Unitization.fstHom ℂ A with map_star' := Unitization.fst_star } : 19 Unitization ℂ A →⋆ₐ[ℂ] ℂ).prod (unitizationEval A) 20 21 /-- The splitting is an actual star-algebra isomorphism, with no K-theory premise. -/ 22 def unitizationProductEquiv : Unitization ℂ A ≃⋆ₐ[ℂ] ℂ × A := 23 StarAlgEquiv.ofBijective (unitizationProductHom A) (by 24 constructor 25 · intro x y h 26 have hfst := congrArg (fun z : ℂ × A => z.1) h 27 change x.fst = y.fst at hfst 28 have hsnd := congrArg (fun z : ℂ × A => z.2) h 29 change algebraMap ℂ A x.fst + x.snd = algebraMap ℂ A y.fst + y.snd at hsnd 30 apply Unitization.ext hfst 31 rw [hfst] at hsnd 32 exact add_left_cancel hsnd 33 · intro x 34 refine ⟨⟨x.1, x.2 - algebraMap ℂ A x.1⟩, ?_⟩ 35 apply Prod.ext 36 · rfl 37 · change algebraMap ℂ A x.1 + (x.2 - algebraMap ℂ A x.1) = x.2 38 abel) 39 40 @[simp] theorem unitizationProductEquiv_fst (x : Unitization ℂ A) : 41 (unitizationProductEquiv A x).1 = x.fst := rfl 42 43 @[simp] theorem unitizationProductEquiv_snd (x : Unitization ℂ A) : 44 (unitizationProductEquiv A x).2 = algebraMap ℂ A x.fst + x.snd := rfl 45 46 end BC4lean.OperatorKTheory
源码 SHA-256:6abdad4e56e332f8b07d47c080f2c6e8fcbc67e4d274573d8d8cc5bb2ad46596
1 import BC4lean.OperatorK0Functoriality 2 3 /-! # Nonunital homomorphisms on the projection definition of unital K₀ -/ 4 noncomputable section 5 open scoped Matrix 6 namespace BC4lean.OperatorKTheory 7 universe u v w 8 variable {A : Type u} {B : Type v} {C : Type w} 9 variable [CStarAlgebra A] [CStarAlgebra B] [CStarAlgebra C] 10 variable [PartialOrder A] [StarOrderedRing A] [PartialOrder B] [StarOrderedRing B] 11 variable [PartialOrder C] [StarOrderedRing C] 12 variable {ι κ : Type} [Fintype ι] [Fintype κ] [DecidableEq ι] [DecidableEq κ] 13 14 def projectionMapNU (φ : A →⋆ₙₐ[ℂ] B) (p : MatrixProjection A ι) : MatrixProjection B ι := 15 ⟨CStarMatrix.ofMatrix ((projectionMatrix p).map φ), ⟨by 16 change (projectionMatrix p).map φ * (projectionMatrix p).map φ = (projectionMatrix p).map φ 17 rw [← Matrix.map_mul, projectionMatrix_mul], by 18 change ((projectionMatrix p).map φ)ᴴ = (projectionMatrix p).map φ 19 rw [← Matrix.conjTranspose_map φ (fun x => map_star φ x), projectionMatrix_star]⟩⟩ 20 21 @[simp] theorem projectionMatrix_mapNU (φ : A →⋆ₙₐ[ℂ] B) (p : MatrixProjection A ι) : 22 projectionMatrix (projectionMapNU φ p) = (projectionMatrix p).map φ := rfl 23 24 theorem rectEquivalent_mapNU (φ : A →⋆ₙₐ[ℂ] B) 25 {p : MatrixProjection A ι} {q : MatrixProjection A κ} (h : RectEquivalent p q) : 26 RectEquivalent (projectionMapNU φ p) (projectionMapNU φ q) := by 27 obtain ⟨v, hv, hv'⟩ := h 28 refine ⟨v.map φ, ?_, ?_⟩ 29 · simpa only [Matrix.map_mul, Matrix.conjTranspose_map φ (fun a => map_star φ a), 30 projectionMatrix_mapNU] using congrArg (fun M => M.map φ) hv 31 · simpa only [Matrix.map_mul, Matrix.conjTranspose_map φ (fun a => map_star φ a), 32 projectionMatrix_mapNU] using congrArg (fun M => M.map φ) hv' 33 34 namespace FiniteProjection 35 36 def mapNU (φ : A →⋆ₙₐ[ℂ] B) (p : FiniteProjection A) : FiniteProjection B := 37 ofProjection (projectionMapNU φ p.projection) 38 39 @[simp] theorem mapNU_blockSum (φ : A →⋆ₙₐ[ℂ] B) (p q : FiniteProjection A) : 40 mapNU φ (blockSum p q) = blockSum (mapNU φ p) (mapNU φ q) := by 41 apply congrArg (fun p : MatrixProjection B (p.Index ⊕ q.Index) => ofProjection p) 42 apply Subtype.ext 43 change (Matrix.fromBlocks (projectionMatrix p.projection) (0 : Matrix p.Index q.Index A) 44 (0 : Matrix q.Index p.Index A) (projectionMatrix q.projection)).map φ = 45 Matrix.fromBlocks ((projectionMatrix p.projection).map φ) 0 0 ((projectionMatrix q.projection).map φ) 46 ext i j 47 cases i <;> cases j <;> simp [Matrix.fromBlocks] 48 49 @[simp] theorem mapNU_zero (φ : A →⋆ₙₐ[ℂ] B) : mapNU φ zero = zero := by 50 apply congrArg (fun p : MatrixProjection B Empty => ofProjection p) 51 apply Subtype.ext 52 ext i 53 exact i.elim 54 55 theorem equivalent_mapNU (φ : A →⋆ₙₐ[ℂ] B) {p q : FiniteProjection A} (h : Equivalent p q) : 56 Equivalent (mapNU φ p) (mapNU φ q) := rectEquivalent_mapNU φ h 57 58 @[simp] theorem mapNU_id (p : FiniteProjection A) : mapNU (NonUnitalStarAlgHom.id ℂ A) p = p := by 59 cases p 60 rfl 61 62 @[simp] theorem mapNU_comp (ψ : B →⋆ₙₐ[ℂ] C) (φ : A →⋆ₙₐ[ℂ] B) (p : FiniteProjection A) : 63 mapNU (ψ.comp φ) p = mapNU ψ (mapNU φ p) := rfl 64 65 @[simp] theorem mapNU_unital (φ : A →⋆ₐ[ℂ] B) (p : FiniteProjection A) : 66 mapNU φ.toNonUnitalStarAlgHom p = map φ p := rfl 67 end FiniteProjection 68 69 namespace StableProjectionMonoid 70 71 def mapNU (φ : A →⋆ₙₐ[ℂ] B) : StableProjectionMonoid A →+ StableProjectionMonoid B where 72 toFun := Quotient.map (FiniteProjection.mapNU φ) (fun _ _ h => FiniteProjection.equivalent_mapNU φ h) 73 map_zero' := congrArg of (FiniteProjection.mapNU_zero φ) 74 map_add' p q := by 75 refine Quotient.inductionOn₂ p q ?_ 76 intro p q 77 exact congrArg of (FiniteProjection.mapNU_blockSum φ p q) 78 79 @[simp] theorem mapNU_of (φ : A →⋆ₙₐ[ℂ] B) (p : FiniteProjection A) : 80 mapNU φ (of p) = of (FiniteProjection.mapNU φ p) := rfl 81 end StableProjectionMonoid 82 83 def k0MapNU (φ : A →⋆ₙₐ[ℂ] B) : K0 A →+ K0 B := 84 k0Universal (k0Class.comp (StableProjectionMonoid.mapNU φ)) 85 86 @[simp] theorem k0MapNU_projection (φ : A →⋆ₙₐ[ℂ] B) (p : FiniteProjection A) : 87 k0MapNU φ (k0Projection p) = k0Projection (FiniteProjection.mapNU φ p) := k0Universal_class _ _ 88 89 @[simp] theorem k0MapNU_id : k0MapNU (NonUnitalStarAlgHom.id ℂ A) = AddMonoidHom.id (K0 A) := by 90 apply k0Hom_ext 91 intro p 92 simp only [k0MapNU_projection, FiniteProjection.mapNU_id, AddMonoidHom.id_apply] 93 94 @[simp] theorem k0MapNU_comp (ψ : B →⋆ₙₐ[ℂ] C) (φ : A →⋆ₙₐ[ℂ] B) : 95 k0MapNU (ψ.comp φ) = (k0MapNU ψ).comp (k0MapNU φ) := by 96 apply k0Hom_ext 97 intro p 98 simp only [k0MapNU_projection, FiniteProjection.mapNU_comp, AddMonoidHom.comp_apply] 99 100 @[simp] theorem k0MapNU_unital (φ : A →⋆ₐ[ℂ] B) : k0MapNU φ.toNonUnitalStarAlgHom = k0Map φ := by 101 apply k0Hom_ext 102 intro p 103 simp only [k0MapNU_projection, FiniteProjection.mapNU_unital, k0Map_projection] 104 105 end BC4lean.OperatorKTheory
源码 SHA-256:ee890a855e1f628ce2f800f5d8498a696ebd8d9e1b73bed497776c1afe6c86ff
1 import BC4lean.NonUnitalK0Map 2 import Mathlib.Data.Matrix.ColumnRowPartitioned 3 4 /-! # Product decomposition for projection K₀ -/ 5 noncomputable section 6 open scoped Matrix 7 namespace BC4lean.OperatorKTheory 8 universe u v 9 variable {A : Type u} {B : Type v} [CStarAlgebra A] [CStarAlgebra B] 10 variable [PartialOrder A] [StarOrderedRing A] [PartialOrder B] [StarOrderedRing B] 11 variable [PartialOrder (A × B)] [StarOrderedRing (A × B)] 12 13 /-- A projection over a product is the orthogonal sum of its two components. -/ 14 theorem productProjection_split (p : FiniteProjection (A × B)) : 15 FiniteProjection.Equivalent p 16 (FiniteProjection.blockSum 17 (FiniteProjection.mapNU (NonUnitalStarAlgHom.inl ℂ A B) 18 (FiniteProjection.map (StarAlgHom.fst ℂ A B) p)) 19 (FiniteProjection.mapNU (NonUnitalStarAlgHom.inr ℂ A B) 20 (FiniteProjection.map (StarAlgHom.snd ℂ A B) p))) := by 21 let P := projectionMatrix p.projection 22 let l : A × B →⋆ₙₐ[ℂ] A × B := 23 (NonUnitalStarAlgHom.inl ℂ A B).comp (NonUnitalStarAlgHom.fst ℂ A B) 24 let r : A × B →⋆ₙₐ[ℂ] A × B := 25 (NonUnitalStarAlgHom.inr ℂ A B).comp (NonUnitalStarAlgHom.snd ℂ A B) 26 let L := P.map l 27 let R := P.map r 28 have hL : Lᴴ = L := by 29 dsimp [L] 30 rw [← Matrix.conjTranspose_map l (fun x => map_star l x)] 31 exact congrArg (fun M => M.map l) (projectionMatrix_star p.projection) 32 have hR : Rᴴ = R := by 33 dsimp [R] 34 rw [← Matrix.conjTranspose_map r (fun x => map_star r x)] 35 exact congrArg (fun M => M.map r) (projectionMatrix_star p.projection) 36 have hLL : L * L = L := by 37 dsimp [L] 38 rw [← Matrix.map_mul] 39 exact congrArg (fun M => M.map l) (projectionMatrix_mul p.projection) 40 have hRR : R * R = R := by 41 dsimp [R] 42 rw [← Matrix.map_mul] 43 exact congrArg (fun M => M.map r) (projectionMatrix_mul p.projection) 44 have hLR : L * R = 0 := by 45 funext i j 46 apply Prod.ext <;> simp [L, R, l, r, Matrix.mul_apply] 47 have hRL : R * L = 0 := by 48 funext i j 49 apply Prod.ext <;> simp [L, R, l, r, Matrix.mul_apply] 50 have hsum : L + R = P := by 51 funext i j 52 apply Prod.ext <;> simp [L, R, l, r] 53 change ∃ v : Matrix p.Index (p.Index ⊕ p.Index) (A × B), 54 v * vᴴ = P ∧ vᴴ * v = Matrix.fromBlocks L 0 0 R 55 refine ⟨Matrix.fromCols L R, ?_, ?_⟩ 56 · rw [Matrix.conjTranspose_fromCols_eq_fromRows_conjTranspose, 57 Matrix.fromCols_mul_fromRows, hL, hR, hLL, hRR] 58 exact hsum 59 · rw [Matrix.conjTranspose_fromCols_eq_fromRows_conjTranspose, 60 Matrix.fromRows_mul_fromCols, hL, hR, hLL, hRR, hLR, hRL] 61 62 variable (A B) 63 64 def k0ProductForward : K0 (A × B) →+ K0 A × K0 B := 65 (k0Map (StarAlgHom.fst ℂ A B)).prod (k0Map (StarAlgHom.snd ℂ A B)) 66 67 def k0ProductInverse : K0 A × K0 B →+ K0 (A × B) := 68 (k0MapNU (NonUnitalStarAlgHom.inl ℂ A B)).coprod (k0MapNU (NonUnitalStarAlgHom.inr ℂ A B)) 69 70 /-- The component maps reconstruct every K₀ class. -/ 71 theorem k0Product_leftInverse : Function.LeftInverse (k0ProductInverse A B) (k0ProductForward A B) := by 72 have h : (k0ProductInverse A B).comp (k0ProductForward A B) = AddMonoidHom.id _ := by 73 apply k0Hom_ext 74 intro p 75 change k0MapNU _ (k0Map _ (k0Projection p)) + k0MapNU _ (k0Map _ (k0Projection p)) = k0Projection p 76 simp only [k0Map_projection, k0MapNU_projection] 77 rw [← k0Projection_blockSum] 78 exact (k0Projection_eq_of_equivalent (productProjection_split p)).symm 79 intro x 80 exact DFunLike.congr_fun h x 81 82 variable {A B} 83 84 omit [PartialOrder (A × B)] [StarOrderedRing (A × B)] in 85 @[simp] theorem k0MapNU_zero : k0MapNU (0 : A →⋆ₙₐ[ℂ] B) = 0 := by 86 apply k0Hom_ext 87 intro p 88 rw [k0MapNU_projection] 89 change k0Projection (FiniteProjection.ofProjection (projectionMapNU 0 p.projection)) = 0 90 have h : projectionMapNU (0 : A →⋆ₙₐ[ℂ] B) p.projection = Projection.zero := by 91 apply Subtype.ext 92 rfl 93 rw [h] 94 exact (congrArg k0Class (StableProjectionMonoid.of_zeroProjection (A := B) (ι := p.Index))).trans 95 (map_zero k0Class) 96 97 variable (A B) 98 99 theorem k0Product_rightInverse : Function.RightInverse (k0ProductInverse A B) (k0ProductForward A B) := by 100 have fl : (k0Map (StarAlgHom.fst ℂ A B)).comp (k0MapNU (NonUnitalStarAlgHom.inl ℂ A B)) = 101 AddMonoidHom.id (K0 A) := by 102 rw [← k0MapNU_unital, ← k0MapNU_comp] 103 have h : ((StarAlgHom.fst ℂ A B).toNonUnitalStarAlgHom).comp 104 (NonUnitalStarAlgHom.inl ℂ A B) = NonUnitalStarAlgHom.id ℂ A := by ext; rfl 105 rw [h, k0MapNU_id] 106 have fr : (k0Map (StarAlgHom.fst ℂ A B)).comp (k0MapNU (NonUnitalStarAlgHom.inr ℂ A B)) = 0 := by 107 rw [← k0MapNU_unital, ← k0MapNU_comp] 108 have h : ((StarAlgHom.fst ℂ A B).toNonUnitalStarAlgHom).comp 109 (NonUnitalStarAlgHom.inr ℂ A B) = 0 := by ext; rfl 110 rw [h, k0MapNU_zero] 111 have sl : (k0Map (StarAlgHom.snd ℂ A B)).comp (k0MapNU (NonUnitalStarAlgHom.inl ℂ A B)) = 0 := by 112 rw [← k0MapNU_unital, ← k0MapNU_comp] 113 have h : ((StarAlgHom.snd ℂ A B).toNonUnitalStarAlgHom).comp 114 (NonUnitalStarAlgHom.inl ℂ A B) = 0 := by ext; rfl 115 rw [h, k0MapNU_zero] 116 have sr : (k0Map (StarAlgHom.snd ℂ A B)).comp (k0MapNU (NonUnitalStarAlgHom.inr ℂ A B)) = 117 AddMonoidHom.id (K0 B) := by 118 rw [← k0MapNU_unital, ← k0MapNU_comp] 119 have h : ((StarAlgHom.snd ℂ A B).toNonUnitalStarAlgHom).comp 120 (NonUnitalStarAlgHom.inr ℂ A B) = NonUnitalStarAlgHom.id ℂ B := by ext; rfl 121 rw [h, k0MapNU_id] 122 intro x 123 apply Prod.ext 124 · change k0Map (StarAlgHom.fst ℂ A B) 125 (k0MapNU (NonUnitalStarAlgHom.inl ℂ A B) x.1 + 126 k0MapNU (NonUnitalStarAlgHom.inr ℂ A B) x.2) = x.1 127 rw [map_add] 128 exact (congrArg₂ (· + ·) (DFunLike.congr_fun fl x.1) (DFunLike.congr_fun fr x.2)).trans (add_zero _) 129 · change k0Map (StarAlgHom.snd ℂ A B) 130 (k0MapNU (NonUnitalStarAlgHom.inl ℂ A B) x.1 + 131 k0MapNU (NonUnitalStarAlgHom.inr ℂ A B) x.2) = x.2 132 rw [map_add] 133 exact (congrArg₂ (· + ·) (DFunLike.congr_fun sl x.1) (DFunLike.congr_fun sr x.2)).trans (zero_add _) 134 135 /-- K₀ carries finite products of unital C*-algebras to products of abelian groups. -/ 136 def k0ProductEquiv : K0 (A × B) ≃+ K0 A × K0 B where 137 toFun := k0ProductForward A B 138 invFun := k0ProductInverse A B 139 left_inv := k0Product_leftInverse A B 140 right_inv := k0Product_rightInverse A B 141 map_add' := map_add (k0ProductForward A B) 142 143 end BC4lean.OperatorKTheory
源码 SHA-256:0966564a77291ae5744a7b05ad77755cf02df4b4aa0b03b3b4c5b7581f72dbe4
1 import BC4lean.OperatorK1Functoriality 2 3 /-! # Product decomposition for stable unitary K₁ -/ 4 noncomputable section 5 open scoped CStarAlgebra 6 namespace BC4lean.OperatorKTheory 7 universe u v 8 variable {A : Type u} {B : Type v} [CStarAlgebra A] [CStarAlgebra B] 9 variable {ι κ : Type} [Fintype ι] [Fintype κ] [DecidableEq ι] [DecidableEq κ] 10 11 def matrixPair (x : CStarMatrix ι ι A) (y : CStarMatrix ι ι B) : CStarMatrix ι ι (A × B) := 12 CStarMatrix.ofMatrix (fun i j => (x i j, y i j)) 13 14 @[simp] theorem matrixMap_fst_pair (x : CStarMatrix ι ι A) (y : CStarMatrix ι ι B) : 15 matrixMap (StarAlgHom.fst ℂ A B) (matrixPair x y) = x := rfl 16 @[simp] theorem matrixMap_snd_pair (x : CStarMatrix ι ι A) (y : CStarMatrix ι ι B) : 17 matrixMap (StarAlgHom.snd ℂ A B) (matrixPair x y) = y := rfl 18 19 theorem matrix_prod_ext {x y : CStarMatrix ι ι (A × B)} 20 (h : matrixMap (StarAlgHom.fst ℂ A B) x = matrixMap (StarAlgHom.fst ℂ A B) y) 21 (k : matrixMap (StarAlgHom.snd ℂ A B) x = matrixMap (StarAlgHom.snd ℂ A B) y) : x = y := by 22 funext i j 23 exact Prod.ext (congrArg (fun M : CStarMatrix ι ι A => M i j) h) 24 (congrArg (fun M : CStarMatrix ι ι B => M i j) k) 25 26 variable [PartialOrder A] [StarOrderedRing A] [PartialOrder B] [StarOrderedRing B] 27 variable [PartialOrder (A × B)] [StarOrderedRing (A × B)] 28 29 /-- Pair finite matrix unitaries of the same size, entry by entry. -/ 30 def unitaryPair (a : MatrixUnitary A ι) (b : MatrixUnitary B ι) : MatrixUnitary (A × B) ι := 31 ⟨matrixPair a b, by 32 rw [Unitary.mem_iff] 33 constructor <;> apply matrix_prod_ext <;> 34 simp only [map_mul, map_star, map_one, matrixMap_fst_pair, matrixMap_snd_pair, 35 Unitary.star_mul_self_of_mem a.property, Unitary.mul_star_self_of_mem a.property, 36 Unitary.star_mul_self_of_mem b.property, Unitary.mul_star_self_of_mem b.property]⟩ 37 38 @[simp] theorem unitaryPair_fst (a : MatrixUnitary A ι) (b : MatrixUnitary B ι) : 39 matrixUnitaryMap (StarAlgHom.fst ℂ A B) (unitaryPair a b) = a := by apply Subtype.ext; rfl 40 @[simp] theorem unitaryPair_snd (a : MatrixUnitary A ι) (b : MatrixUnitary B ι) : 41 matrixUnitaryMap (StarAlgHom.snd ℂ A B) (unitaryPair a b) = b := by apply Subtype.ext; rfl 42 43 @[simp] theorem unitaryPair_one : unitaryPair (1 : MatrixUnitary A ι) (1 : MatrixUnitary B ι) = 1 := by 44 apply Subtype.ext 45 change matrixPair (1 : CStarMatrix ι ι A) (1 : CStarMatrix ι ι B) = 1 46 apply matrix_prod_ext <;> simp only [map_one, matrixMap_fst_pair, matrixMap_snd_pair] 47 48 theorem continuous_unitaryPair : Continuous (fun x : MatrixUnitary A ι × MatrixUnitary B ι => unitaryPair x.1 x.2) := by 49 apply Continuous.subtype_mk 50 apply CStarMatrix.ofMatrixL.continuous.comp 51 apply continuous_pi 52 intro i 53 apply continuous_pi 54 intro j 55 have ha := CStarMatrix.ofMatrixL.symm.continuous.comp 56 (continuous_subtype_val.comp (continuous_fst : Continuous (fun x : MatrixUnitary A ι × MatrixUnitary B ι => x.1))) 57 have hb := CStarMatrix.ofMatrixL.symm.continuous.comp 58 (continuous_subtype_val.comp (continuous_snd : Continuous (fun x : MatrixUnitary A ι × MatrixUnitary B ι => x.2))) 59 exact ((continuous_apply j).comp ((continuous_apply i).comp ha)).prodMk 60 ((continuous_apply j).comp ((continuous_apply i).comp hb)) 61 62 @[simp] theorem unitaryReindex_one (e : ι ≃ κ) : unitaryReindex e (1 : MatrixUnitary A ι) = 1 := by 63 apply Subtype.ext 64 exact map_one (CStarMatrix.reindexₐ ℂ A e) 65 66 theorem unitaryPair_reindex (e : ι ≃ κ) (a : MatrixUnitary A ι) (b : MatrixUnitary B ι) : 67 unitaryReindex e (unitaryPair a b) = unitaryPair (unitaryReindex e a) (unitaryReindex e b) := by 68 apply Subtype.ext 69 rfl 70 71 theorem unitaryPair_blockSum (a : MatrixUnitary A ι) (b : MatrixUnitary B ι) 72 (c : MatrixUnitary A κ) (d : MatrixUnitary B κ) : 73 unitaryPair (unitaryBlockSum a c) (unitaryBlockSum b d) = 74 unitaryBlockSum (unitaryPair a b) (unitaryPair c d) := by 75 apply Subtype.ext 76 funext i j 77 cases i <;> cases j <;> rfl 78 79 namespace FiniteUnitary 80 abbrev prodInl (a : FiniteUnitary A) : FiniteUnitary (A × B) := ofUnitary (unitaryPair a.val 1) 81 82 theorem prodInl_blockSum (a b : FiniteUnitary A) : 83 prodInl (B := B) (blockSum a b) = blockSum (prodInl a) (prodInl b) := by 84 have h : unitaryBlockSum (1 : MatrixUnitary B a.Index) (1 : MatrixUnitary B b.Index) = 1 := 85 Subtype.ext matrixBlockSum_one 86 change ofUnitary (unitaryPair (unitaryBlockSum a.val b.val) 1) = _ 87 rw [← h, unitaryPair_blockSum] 88 89 @[simp] theorem prodInl_identity (ι : Type) [Fintype ι] [DecidableEq ι] : 90 prodInl (B := B) (identity (A := A) ι) = identity ι := by 91 change ofUnitary (unitaryPair (1 : MatrixUnitary A ι) (1 : MatrixUnitary B ι)) = ofUnitary 1 92 rw [unitaryPair_one] 93 94 theorem prodInl_congr {a b : FiniteUnitary A} (h : Equivalent a b) : 95 Equivalent (prodInl (B := B) a) (prodInl b) := by 96 induction h with 97 | refl a => exact equivalent_refl _ 98 | symm a b h ih => exact equivalent_symm ih 99 | trans a b c h k ih ik => exact equivalent_trans ih ik 100 | rel a b h => 101 cases h with 102 | homotopy b e h => 103 apply Relation.EqvGen.rel 104 apply Move.homotopy (prodInl a) (prodInl b) e 105 change UnitaryHomotopic (unitaryReindex e (unitaryPair a.val 1)) (unitaryPair b.val 1) 106 rw [unitaryPair_reindex, unitaryReindex_one] 107 exact (Joined.prod h (unitaryHomotopic_refl (1 : MatrixUnitary B b.Index))).map continuous_unitaryPair 108 | stabilize κ => 109 rw [prodInl_blockSum, prodInl_identity] 110 exact equivalent_stabilize _ κ 111 end FiniteUnitary 112 113 variable (A B) 114 def k1ProductInl : K1 A →+ K1 (A × B) where 115 toFun := Quotient.map FiniteUnitary.prodInl (fun _ _ h => FiniteUnitary.prodInl_congr h) 116 map_zero' := congrArg K1.of (FiniteUnitary.prodInl_identity (A := A) (B := B) Empty) 117 map_add' a b := by 118 refine Quotient.inductionOn₂ a b ?_ 119 intro a b 120 exact congrArg K1.of (FiniteUnitary.prodInl_blockSum a b) 121 122 /-- Swap the factors using the unital coordinate homomorphisms. -/ 123 def productSwap : B × A →⋆ₐ[ℂ] A × B := (StarAlgHom.snd ℂ B A).prod (StarAlgHom.fst ℂ B A) 124 125 def k1ProductInr : K1 B →+ K1 (A × B) := (k1Map (productSwap A B)).comp (k1ProductInl B A) 126 127 @[simp] theorem k1ProductInl_of (a : FiniteUnitary A) : 128 k1ProductInl A B (K1.of a) = K1.of (FiniteUnitary.ofUnitary (unitaryPair a.val (1 : MatrixUnitary B a.Index))) := rfl 129 130 @[simp] theorem k1ProductInr_of (b : FiniteUnitary B) : 131 k1ProductInr A B (K1.of b) = K1.of (FiniteUnitary.ofUnitary (unitaryPair (1 : MatrixUnitary A b.Index) b.val)) := by 132 apply congrArg K1.of 133 apply congrArg FiniteUnitary.ofUnitary 134 apply Subtype.ext 135 rfl 136 137 variable {A B} 138 /-- Multiplication and block sum give the same stable K₁ class. -/ 139 theorem k1_of_mul (a b : MatrixUnitary A ι) : 140 K1.of (FiniteUnitary.ofUnitary (a * b)) = 141 K1.of (FiniteUnitary.ofUnitary a) + K1.of (FiniteUnitary.ofUnitary b) := by 142 calc 143 _ = K1.of (FiniteUnitary.ofUnitary (unitaryBlockSum (a * b) 1)) := 144 (K1.of_stabilize (FiniteUnitary.ofUnitary (a * b)) ι).symm 145 _ = K1.of (FiniteUnitary.ofUnitary (unitaryBlockSum a b)) := 146 (K1.of_homotopic (unitaryHomotopic_blockSum_mul a b)).symm 147 _ = _ := rfl 148 149 variable (A B) 150 151 def k1ProductForward : K1 (A × B) →+ K1 A × K1 B := 152 (k1Map (StarAlgHom.fst ℂ A B)).prod (k1Map (StarAlgHom.snd ℂ A B)) 153 154 def k1ProductInverse : K1 A × K1 B →+ K1 (A × B) := 155 (k1ProductInl A B).coprod (k1ProductInr A B) 156 157 theorem k1Product_leftInverse : Function.LeftInverse (k1ProductInverse A B) (k1ProductForward A B) := by 158 intro x 159 refine Quotient.inductionOn x ?_ 160 intro p 161 change k1ProductInl A B (k1Map (StarAlgHom.fst ℂ A B) (K1.of p)) + 162 k1ProductInr A B (k1Map (StarAlgHom.snd ℂ A B) (K1.of p)) = K1.of p 163 rw [k1Map_of, k1Map_of, k1ProductInl_of, k1ProductInr_of, ← k1_of_mul] 164 apply congrArg K1.of 165 apply congrArg FiniteUnitary.ofUnitary 166 apply Subtype.ext 167 change matrixPair (matrixMap (StarAlgHom.fst ℂ A B) (p.val : CStarMatrix p.Index p.Index (A × B))) 168 (1 : CStarMatrix p.Index p.Index B) * 169 matrixPair (1 : CStarMatrix p.Index p.Index A) 170 (matrixMap (StarAlgHom.snd ℂ A B) (p.val : CStarMatrix p.Index p.Index (A × B))) = 171 (p.val : CStarMatrix p.Index p.Index (A × B)) 172 apply matrix_prod_ext <;> 173 simp only [map_mul, matrixMap_fst_pair, matrixMap_snd_pair, one_mul, mul_one] 174 175 theorem k1Product_rightInverse : Function.RightInverse (k1ProductInverse A B) (k1ProductForward A B) := by 176 rintro ⟨x,y⟩ 177 refine Quotient.inductionOn₂ x y ?_ 178 intro p q 179 apply Prod.ext 180 · change k1Map (StarAlgHom.fst ℂ A B) (k1ProductInl A B (K1.of p) + k1ProductInr A B (K1.of q)) = K1.of p 181 rw [map_add, k1ProductInl_of, k1ProductInr_of, k1Map_of, k1Map_of] 182 change K1.of (FiniteUnitary.ofUnitary (matrixUnitaryMap (StarAlgHom.fst ℂ A B) (unitaryPair p.val 1))) + 183 K1.of (FiniteUnitary.ofUnitary (matrixUnitaryMap (StarAlgHom.fst ℂ A B) (unitaryPair 1 q.val))) = _ 184 rw [unitaryPair_fst, unitaryPair_fst] 185 change K1.of p + K1.of (FiniteUnitary.identity q.Index) = K1.of p 186 rw [K1.of_identity, add_zero] 187 · change k1Map (StarAlgHom.snd ℂ A B) (k1ProductInl A B (K1.of p) + k1ProductInr A B (K1.of q)) = K1.of q 188 rw [map_add, k1ProductInl_of, k1ProductInr_of, k1Map_of, k1Map_of] 189 change K1.of (FiniteUnitary.ofUnitary (matrixUnitaryMap (StarAlgHom.snd ℂ A B) (unitaryPair p.val 1))) + 190 K1.of (FiniteUnitary.ofUnitary (matrixUnitaryMap (StarAlgHom.snd ℂ A B) (unitaryPair 1 q.val))) = _ 191 rw [unitaryPair_snd, unitaryPair_snd] 192 change K1.of (FiniteUnitary.identity p.Index) + K1.of q = K1.of q 193 rw [K1.of_identity, zero_add] 194 195 /-- K₁ carries finite products to products of abelian groups. -/ 196 def k1ProductEquiv : K1 (A × B) ≃+ K1 A × K1 B where 197 toFun := k1ProductForward A B 198 invFun := k1ProductInverse A B 199 left_inv := k1Product_leftInverse A B 200 right_inv := k1Product_rightInverse A B 201 map_add' := map_add (k1ProductForward A B) 202 203 end BC4lean.OperatorKTheory
源码 SHA-256:7fb17db3a3e1dceabd714e9f0fda1fcf944509133ce8b13ac83606be2a168033
1 import Mathlib.Algebra.Group.Subgroup.Ker 2 3 /-! # Identifying a kernel from an additive product decomposition -/ 4 namespace BC4lean.OperatorKTheory 5 variable {G H J : Type*} [AddCommGroup G] [AddCommGroup H] [AddCommGroup J] 6 7 /-- If the first coordinate of an additive product decomposition is `f`, its kernel 8 is canonically the second factor. -/ 9 def kernelProductEquiv (e : G ≃+ H × J) (f : G →+ H) (h : ∀ x, (e x).1 = f x) : 10 f.ker ≃+ J where 11 toFun x := (e x.val).2 12 invFun y := ⟨e.symm (0, y), by 13 change f (e.symm (0, y)) = 0 14 rw [← h, e.apply_symm_apply]⟩ 15 left_inv x := by 16 apply Subtype.ext 17 apply e.injective 18 rw [e.apply_symm_apply] 19 apply Prod.ext 20 · exact (h x.val |>.trans x.property).symm 21 · rfl 22 right_inv y := by simp 23 map_add' x y := by 24 change (e (x.val + y.val)).2 = (e x.val).2 + (e y.val).2 25 rw [map_add] 26 rfl 27 28 end BC4lean.OperatorKTheory
源码 SHA-256:503ff9463a93acf00a5c3c0db5fa6642280fe3c42834ef3d4495dde2a731e513
1 import BC4lean.OperatorK1Functoriality 2 3 /-! # Isomorphism invariance of unital K₁ -/ 4 noncomputable section 5 namespace BC4lean.OperatorKTheory 6 universe u v w 7 variable {A : Type u} {B : Type v} {C : Type w} 8 variable [CStarAlgebra A] [CStarAlgebra B] [CStarAlgebra C] 9 variable [PartialOrder A] [StarOrderedRing A] 10 variable [PartialOrder B] [StarOrderedRing B] 11 variable [PartialOrder C] [StarOrderedRing C] 12 13 theorem k1Map_leftInverse (e : A ≃⋆ₐ[ℂ] B) : 14 Function.LeftInverse (k1Map e.symm.toStarAlgHom) (k1Map e.toStarAlgHom) := by 15 intro x 16 have h : e.symm.toStarAlgHom.comp e.toStarAlgHom = StarAlgHom.id ℂ A := by 17 ext a 18 exact e.symm_apply_apply a 19 change ((k1Map e.symm.toStarAlgHom).comp (k1Map e.toStarAlgHom)) x = x 20 rw [← k1Map_comp, h, k1Map_id] 21 rfl 22 23 theorem k1Map_rightInverse (e : A ≃⋆ₐ[ℂ] B) : 24 Function.RightInverse (k1Map e.symm.toStarAlgHom) (k1Map e.toStarAlgHom) := by 25 intro x 26 have h : e.toStarAlgHom.comp e.symm.toStarAlgHom = StarAlgHom.id ℂ B := by 27 ext a 28 exact e.apply_symm_apply a 29 change ((k1Map e.toStarAlgHom).comp (k1Map e.symm.toStarAlgHom)) x = x 30 rw [← k1Map_comp, h, k1Map_id] 31 rfl 32 33 /-- The canonical additive equivalence on unital K₁ induced by a star-algebra equivalence. -/ 34 def k1Equiv (e : A ≃⋆ₐ[ℂ] B) : K1 A ≃+ K1 B where 35 toFun := k1Map e.toStarAlgHom 36 invFun := k1Map e.symm.toStarAlgHom 37 left_inv := k1Map_leftInverse e 38 right_inv := k1Map_rightInverse e 39 map_add' := (k1Map e.toStarAlgHom).map_add 40 41 @[simp] theorem k1Equiv_toAddMonoidHom (e : A ≃⋆ₐ[ℂ] B) : 42 (k1Equiv e).toAddMonoidHom = k1Map e.toStarAlgHom := rfl 43 44 @[simp] theorem k1Equiv_refl : k1Equiv (StarAlgEquiv.refl ℂ A) = AddEquiv.refl (K1 A) := by 45 ext x 46 change k1Map (StarAlgHom.id ℂ A) x = x 47 rw [k1Map_id] 48 rfl 49 50 @[simp] theorem k1Equiv_symm (e : A ≃⋆ₐ[ℂ] B) : k1Equiv e.symm = (k1Equiv e).symm := by 51 ext x 52 rfl 53 54 @[simp] theorem k1Equiv_trans (e : A ≃⋆ₐ[ℂ] B) (f : B ≃⋆ₐ[ℂ] C) : 55 k1Equiv (e.trans f) = (k1Equiv e).trans (k1Equiv f) := by 56 ext x 57 exact DFunLike.congr_fun (k1Map_comp f.toStarAlgHom e.toStarAlgHom) x 58 59 end BC4lean.OperatorKTheory
源码 SHA-256:726791d722f2b3f3bc5daa4c777a47e8b5f21ddb627dbfa68a1c9cbc3c72796d
1 import BC4lean.NonunitalOperatorK 2 import BC4lean.UnitizationSplitting 3 import BC4lean.OperatorK0Equivalence 4 import BC4lean.OperatorK1Equivalence 5 import BC4lean.OperatorK0Product 6 import BC4lean.OperatorK1Product 7 import BC4lean.KernelProductEquiv 8 9 /-! # Agreement of the unitization-kernel and unital definitions 10 11 Split the forced unitization as ℂ × A, split the K-groups of that product, 12 and identify the scalar kernel with the second factor. The construction uses 13 canonical spectral orders throughout. 14 -/ 15 noncomputable section 16 namespace BC4lean.OperatorKTheory 17 18 local instance comparisonSpectralOrder (B : Type*) [CStarAlgebra B] : PartialOrder B := 19 CStarAlgebra.spectralOrder B 20 local instance comparisonSpectralOrderedRing (B : Type*) [CStarAlgebra B] : StarOrderedRing B := 21 CStarAlgebra.spectralOrderedRing B 22 23 variable (A : Type*) [CStarAlgebra A] 24 25 theorem unitizationProduct_fst : 26 (StarAlgHom.fst ℂ ℂ A).comp (unitizationProductEquiv A).toStarAlgHom = scalarQuotient A := by 27 apply DFunLike.ext 28 intro x 29 rfl 30 31 theorem unitizationProduct_snd : 32 (StarAlgHom.snd ℂ ℂ A).comp (unitizationProductEquiv A).toStarAlgHom = unitizationEval A := by 33 apply DFunLike.ext 34 intro x 35 rfl 36 37 /-- The degree-zero kernel definition agrees canonically with unital projection K₀. -/ 38 def operatorK0UnitalEquiv : OperatorK0 A ≃+ K0 A := 39 kernelProductEquiv 40 ((k0Equiv (unitizationProductEquiv A)).trans (k0ProductEquiv ℂ A)) 41 (k0Map (scalarQuotient A)) (by 42 intro x 43 change k0Map (StarAlgHom.fst ℂ ℂ A) (k0Map (unitizationProductEquiv A).toStarAlgHom x) = _ 44 rw [← AddMonoidHom.comp_apply, ← k0Map_comp, unitizationProduct_fst]) 45 46 /-- The degree-one kernel definition agrees canonically with stable unitary K₁. -/ 47 def operatorK1UnitalEquiv : OperatorK1 A ≃+ K1 A := 48 kernelProductEquiv 49 ((k1Equiv (unitizationProductEquiv A)).trans (k1ProductEquiv ℂ A)) 50 (k1Map (scalarQuotient A)) (by 51 intro x 52 change k1Map (StarAlgHom.fst ℂ ℂ A) (k1Map (unitizationProductEquiv A).toStarAlgHom x) = _ 53 rw [← AddMonoidHom.comp_apply, ← k1Map_comp, unitizationProduct_fst]) 54 55 /-- The comparison sends a kernel class by evaluation using the original unit. -/ 56 theorem operatorK0UnitalEquiv_apply (x : OperatorK0 A) : 57 operatorK0UnitalEquiv A x = k0Map (unitizationEval A) (operatorK0Inclusion A x) := by 58 change k0Map (StarAlgHom.snd ℂ ℂ A) (k0Map (unitizationProductEquiv A).toStarAlgHom x.val) = _ 59 rw [← AddMonoidHom.comp_apply, ← k0Map_comp, unitizationProduct_snd] 60 rfl 61 62 theorem operatorK1UnitalEquiv_apply (x : OperatorK1 A) : 63 operatorK1UnitalEquiv A x = k1Map (unitizationEval A) (operatorK1Inclusion A x) := by 64 change k1Map (StarAlgHom.snd ℂ ℂ A) (k1Map (unitizationProductEquiv A).toStarAlgHom x.val) = _ 65 rw [← AddMonoidHom.comp_apply, ← k1Map_comp, unitizationProduct_snd] 66 rfl 67 68 variable {A} {B : Type*} [CStarAlgebra B] 69 70 theorem unitizationEval_natural (φ : A →⋆ₐ[ℂ] B) : 71 (unitizationEval B).comp (Unitization.starMap φ.toNonUnitalStarAlgHom) = 72 φ.comp (unitizationEval A) := by 73 ext x 74 change unitizationEval B (Unitization.starMap φ.toNonUnitalStarAlgHom (x : Unitization ℂ A)) = 75 φ (unitizationEval A (x : Unitization ℂ A)) 76 simp [unitizationEval_apply] 77 78 /-- Agreement with the unital definition is natural for unital star homomorphisms. -/ 79 theorem operatorK0UnitalEquiv_natural (φ : A →⋆ₐ[ℂ] B) (x : OperatorK0 A) : 80 operatorK0UnitalEquiv B (operatorK0Map φ.toNonUnitalStarAlgHom x) = 81 k0Map φ (operatorK0UnitalEquiv A x) := by 82 rw [operatorK0UnitalEquiv_apply, operatorK0UnitalEquiv_apply] 83 change k0Map (unitizationEval B) (k0Map (Unitization.starMap φ.toNonUnitalStarAlgHom) x.val) = 84 k0Map φ (k0Map (unitizationEval A) x.val) 85 have h := congrArg k0Map (unitizationEval_natural φ) 86 simpa only [k0Map_comp, AddMonoidHom.comp_apply] using DFunLike.congr_fun h x.val 87 88 theorem operatorK1UnitalEquiv_natural (φ : A →⋆ₐ[ℂ] B) (x : OperatorK1 A) : 89 operatorK1UnitalEquiv B (operatorK1Map φ.toNonUnitalStarAlgHom x) = 90 k1Map φ (operatorK1UnitalEquiv A x) := by 91 rw [operatorK1UnitalEquiv_apply, operatorK1UnitalEquiv_apply] 92 change k1Map (unitizationEval B) (k1Map (Unitization.starMap φ.toNonUnitalStarAlgHom) x.val) = 93 k1Map φ (k1Map (unitizationEval A) x.val) 94 have h := congrArg k1Map (unitizationEval_natural φ) 95 simpa only [k1Map_comp, AddMonoidHom.comp_apply] using DFunLike.congr_fun h x.val 96 97 end BC4lean.OperatorKTheory
源码 SHA-256:02c9efd88aede956d34f6eacce288287e66e15793c42218dfae316791ba91a1c
1 import BC4lean.StableUnitary 2 import BC4lean.ReducedOperatorK0 3 4 /-! # The degree-one reduced analytic target -/ 5 noncomputable section 6 namespace BC4lean 7 variable (Γ : Type*) [Group Γ] 8 9 /-- Stable norm-homotopy K₁ of the reduced group C*-algebra, with spectral order. -/ 10 def ReducedK1 : Type _ := 11 letI := CStarAlgebra.spectralOrder (ReducedGroupCStar Γ) 12 letI := CStarAlgebra.spectralOrderedRing (ReducedGroupCStar Γ) 13 OperatorKTheory.K1 (ReducedGroupCStar Γ) 14 15 instance reducedK1AddCommGroup : AddCommGroup (ReducedK1 Γ) := by 16 letI := CStarAlgebra.spectralOrder (ReducedGroupCStar Γ) 17 letI := CStarAlgebra.spectralOrderedRing (ReducedGroupCStar Γ) 18 exact inferInstanceAs (AddCommGroup (OperatorKTheory.K1 (ReducedGroupCStar Γ))) 19 20 end BC4lean
源码 SHA-256:8db6d5e677d31606b748f997feffc45c4c26cee79bbed4f3b865e106dc03c33c
1 import BC4lean.StableUnitary 2 3 /-! # A geometric justification for stable changes of coordinates -/ 4 noncomputable section 5 namespace BC4lean.OperatorKTheory 6 variable {A : Type*} [CStarAlgebra A] [PartialOrder A] [StarOrderedRing A] 7 variable {ι : Type} [Fintype ι] [DecidableEq ι] 8 9 /-- Conjugation by any matrix unitary is norm homotopic to the identity action 10 on a unitary after adjoining an identity block. -/ 11 theorem unitaryHomotopic_stable_conjugate (w a : MatrixUnitary A ι) : 12 UnitaryHomotopic (unitaryBlockSum (w * a * star w) (1 : MatrixUnitary A ι)) (unitaryBlockSum a (1 : MatrixUnitary A ι)) := by 13 have h := unitaryHomotopic_blockSum_star w 14 have hi := unitaryHomotopic_inv h 15 have hstar : (unitaryBlockSum w (star w))⁻¹ = unitaryBlockSum (star w) w := by 16 change star (unitaryBlockSum w (star w)) = _ 17 rw [unitaryBlockSum_star, star_star] 18 rw [hstar, inv_one] at hi 19 have hh := unitaryHomotopic_mul (unitaryHomotopic_mul h 20 (unitaryHomotopic_refl (unitaryBlockSum a (1 : MatrixUnitary A ι)))) hi 21 simpa only [unitaryBlockSum_mul, one_mul, mul_one, Unitary.star_mul_self] using hh 22 23 end BC4lean.OperatorKTheory
源码 SHA-256:9ede6e13834de074b9c88a4af30ab4e414bf555843c982b99cc87b23571decc1
1 import BC4lean.OperatorProjections 2 import Mathlib.Analysis.CStarAlgebra.ContinuousFunctionalCalculus.Basic 3 import Mathlib.Analysis.CStarAlgebra.ContinuousFunctionalCalculus.Commute 4 import Mathlib.Analysis.SpecialFunctions.ContinuousFunctionalCalculus.Rpow.Basic 5 import Mathlib.Analysis.Normed.Ring.Units 6 import Mathlib.Topology.LocallyConstant.Basic 7 import Mathlib.Topology.Connected.PathConnected 8 import Mathlib.Tactic.NoncommRing 9 10 /-! # Norm homotopies of projections preserve Murray–von Neumann classes -/ 11 noncomputable section 12 open Filter Topology 13 namespace BC4lean.OperatorKTheory 14 namespace Projection 15 variable {A : Type*} [CStarAlgebra A] 16 17 /-- An invertible intertwiner between projections can be normalized to a partial isometry. -/ 18 theorem equivalent_of_invertible_intertwiner (p q : Projection A) (s : A) 19 (hs : IsUnit s) (hsp : s * p = q * s) : Equivalent p q := by 20 let _ := CStarAlgebra.spectralOrder A 21 let _ := CStarAlgebra.spectralOrderedRing A 22 let t := star s * s 23 have ht : IsUnit t := hs.star.mul hs 24 have htpos : 0 ≤ t := star_mul_self_nonneg s 25 let z : A := CFC.rpow t (- (1 / 2 : ℝ)) 26 have hzstar : star z = z := (CFC.rpow_nonneg (a := t) (y := -(1 / 2 : ℝ))).isSelfAdjoint.star_eq 27 have hzunit : IsUnit z := ht.cfcRpow _ htpos 28 have hstar : (p : A) * star s = star s * q := by 29 simpa only [star_mul, star_coe] using congrArg star hsp 30 have htp : Commute t (p : A) := by 31 show (star s * s) * p = p * (star s * s) 32 calc 33 (star s * s) * p = star s * (q * s) := by rw [mul_assoc, hsp] 34 _ = (p * star s) * s := by rw [hstar, mul_assoc] 35 _ = p * (star s * s) := mul_assoc _ _ _ 36 have hzp : z * p = p * z := (htp.cfc_nnreal (fun x => x ^ (-(1 / 2 : ℝ)))).eq 37 have hztz : z * t * z = 1 := by 38 simp only [z, CFC.rpow_eq_pow] 39 calc 40 t ^ (-(1 / 2 : ℝ)) * t * t ^ (-(1 / 2 : ℝ)) = (t ^ (-(1 / 2 : ℝ)) * t ^ (1 : ℝ)) * 41 t ^ (-(1 / 2 : ℝ)) := by rw [CFC.rpow_one t htpos] 42 _ = t ^ ((-(1 / 2 : ℝ) + 1) + -(1 / 2 : ℝ)) := by 43 rw [CFC.rpow_add ht, CFC.rpow_add ht] 44 _ = 1 := by norm_num; exact CFC.rpow_zero t htpos 45 let u := s * z 46 have hu : star u * u = 1 := by 47 calc 48 star u * u = z * t * z := by simp only [u, t, star_mul, hzstar, mul_assoc] 49 _ = 1 := hztz 50 have huu : u * star u = 1 := by 51 apply (hs.mul hzunit).mul_right_cancel 52 change (u * star u) * u = 1 * u 53 rw [mul_assoc, hu, mul_one, one_mul] 54 have hup : u * p = q * u := by 55 change (s * z) * p = q * (s * z) 56 rw [mul_assoc, hzp, ← mul_assoc, hsp, mul_assoc] 57 refine ⟨u * p, ?_, ?_⟩ 58 · calc 59 star (u * p) * (u * p) = p * (star u * u) * p := by simp only [star_mul, star_coe, mul_assoc] 60 _ = p := by rw [hu, mul_one, mul_self] 61 · calc 62 (u * p) * star (u * p) = u * ((p * p) * star u) := by simp only [star_mul, star_coe, mul_assoc] 63 _ = (u * p) * star u := by rw [mul_self]; exact (mul_assoc u (p : A) (star u)).symm 64 _ = q * (u * star u) := by rw [hup, mul_assoc] 65 _ = q := by rw [huu, mul_one] 66 67 /-- The standard intertwiner is invertible on a neighborhood of a projection. -/ 68 theorem eventually_equivalent (p : Projection A) : ∀ᶠ q in nhds p, Equivalent p q := by 69 let s : Projection A → A := fun q => (q : A) * p + (1 - q) * (1 - p) 70 have hc : Continuous s := 71 (continuous_subtype_val.mul continuous_const).add 72 ((continuous_const.sub continuous_subtype_val).mul continuous_const) 73 have hsp : s p = 1 := by 74 dsimp [s] 75 noncomm_ring [mul_self p] 76 have he : ∀ᶠ q in nhds p, IsUnit (s q) := 77 hc.continuousAt (Units.isOpen.mem_nhds (hsp ▸ isUnit_one)) 78 filter_upwards [he] with q hq 79 apply equivalent_of_invertible_intertwiner p q (s q) hq 80 dsimp [s] 81 simp only [add_mul, mul_add, sub_mul, mul_sub, one_mul, mul_one, mul_assoc, 82 ← mul_assoc (q : A) (q : A) (p : A), mul_self] 83 noncomm_ring 84 85 /-- The Murray–von Neumann class of a projection is locally constant in norm. -/ 86 theorem isLocallyConstant_class : 87 IsLocallyConstant (fun p : Projection A => (Quotient.mk _ p : Classes A)) := by 88 rw [IsLocallyConstant.iff_eventually_eq] 89 intro p 90 filter_upwards [eventually_equivalent p] with q hq 91 exact Quotient.sound (equivalent_symm hq) 92 93 /-- Endpoints of a norm-continuous projection path are Murray–von Neumann equivalent. -/ 94 theorem equivalent_of_path {p q : Projection A} (h : Path p q) : Equivalent p q := by 95 have hc := isLocallyConstant_class.comp_continuous h.continuous 96 have he := hc.apply_eq_of_preconnectedSpace (0 : unitInterval) 1 97 change (Quotient.mk _ (h 0) : Classes A) = Quotient.mk _ (h 1) at he 98 rw [h.source, h.target] at he 99 exact Quotient.exact he 100 101 end Projection 102 end BC4lean.OperatorKTheory
源码 SHA-256:5de668399d50bc41ef29e3ad531f47e942c089f519e267cf5e731b8969fb820f
1 import BC4lean.OperatorK1Functoriality 2 import Mathlib.Analysis.CStarAlgebra.Unitization 3 4 /-! # Point-norm homotopies of complex star homomorphisms 5 6 Continuity is required separately at every fixed algebra element; no continuity 7 in the operator norm on the space of homomorphisms is assumed. 8 -/ 9 noncomputable section 10 namespace BC4lean.OperatorKTheory 11 12 /-- A point-norm homotopy through unital complex star homomorphisms. -/ 13 structure UnitalStarHomotopy {A B : Type*} [CStarAlgebra A] [CStarAlgebra B] 14 (φ ψ : A →⋆ₐ[ℂ] B) where 15 toFun : unitInterval → A →⋆ₐ[ℂ] B 16 continuous_apply : ∀ a : A, Continuous (fun t => toFun t a) 17 source : toFun 0 = φ 18 target : toFun 1 = ψ 19 20 /-- A point-norm homotopy through possibly nonunital complex star homomorphisms. -/ 21 structure StarHomotopy {A B : Type*} [NonUnitalCStarAlgebra A] [NonUnitalCStarAlgebra B] 22 (φ ψ : A →⋆ₙₐ[ℂ] B) where 23 toFun : unitInterval → A →⋆ₙₐ[ℂ] B 24 continuous_apply : ∀ a : A, Continuous (fun t => toFun t a) 25 source : toFun 0 = φ 26 target : toFun 1 = ψ 27 28 namespace UnitalStarHomotopy 29 variable {A B : Type*} [CStarAlgebra A] [CStarAlgebra B] 30 variable {φ ψ : A →⋆ₐ[ℂ] B} 31 32 /-- A constant family is a point-norm homotopy. -/ 33 def refl (φ : A →⋆ₐ[ℂ] B) : UnitalStarHomotopy φ φ where 34 toFun _ := φ 35 continuous_apply _ := continuous_const 36 source := rfl 37 target := rfl 38 39 /-- Forget preservation of the unit without changing the point-norm continuity. -/ 40 def toStarHomotopy (h : UnitalStarHomotopy φ ψ) : 41 StarHomotopy φ.toNonUnitalStarAlgHom ψ.toNonUnitalStarAlgHom where 42 toFun t := (h.toFun t).toNonUnitalStarAlgHom 43 continuous_apply := h.continuous_apply 44 source := congrArg StarAlgHom.toNonUnitalStarAlgHom h.source 45 target := congrArg StarAlgHom.toNonUnitalStarAlgHom h.target 46 47 variable {ι : Type*} [Fintype ι] [DecidableEq ι] 48 49 /-- Point-norm continuity gives norm continuity on each fixed finite matrix. -/ 50 theorem continuous_matrixMap (h : UnitalStarHomotopy φ ψ) (M : CStarMatrix ι ι A) : 51 Continuous (fun t => matrixMap (h.toFun t) M) := by 52 apply CStarMatrix.ofMatrixL.continuous.comp 53 exact continuous_pi (fun i => continuous_pi (fun j => h.continuous_apply (M i j))) 54 55 variable [PartialOrder A] [StarOrderedRing A] [PartialOrder B] [StarOrderedRing B] 56 57 /-- Evaluate a point-norm homotopy on a matrix projection. -/ 58 def projectionPath (h : UnitalStarHomotopy φ ψ) (p : MatrixProjection A ι) : 59 Path (matrixProjectionMap φ p) (matrixProjectionMap ψ p) where 60 toFun t := matrixProjectionMap (h.toFun t) p 61 continuous_toFun := (h.continuous_matrixMap p.val).subtype_mk _ 62 source' := by rw [h.source] 63 target' := by rw [h.target] 64 65 /-- Evaluate a point-norm homotopy on a matrix unitary. -/ 66 def unitaryPath (h : UnitalStarHomotopy φ ψ) (u : MatrixUnitary A ι) : 67 Path (⟨matrixMap φ u, Unitary.map_mem (matrixMap φ) u.property⟩ : MatrixUnitary B ι) 68 ⟨matrixMap ψ u, Unitary.map_mem (matrixMap ψ) u.property⟩ where 69 toFun t := ⟨matrixMap (h.toFun t) u, Unitary.map_mem (matrixMap (h.toFun t)) u.property⟩ 70 continuous_toFun := (h.continuous_matrixMap u.val).subtype_mk _ 71 source' := by rw [h.source] 72 target' := by rw [h.target] 73 end UnitalStarHomotopy 74 75 namespace StarHomotopy 76 variable {A B : Type*} [NonUnitalCStarAlgebra A] [NonUnitalCStarAlgebra B] 77 variable {φ ψ : A →⋆ₙₐ[ℂ] B} 78 79 def refl (φ : A →⋆ₙₐ[ℂ] B) : StarHomotopy φ φ where 80 toFun _ := φ 81 continuous_apply _ := continuous_const 82 source := rfl 83 target := rfl 84 85 /-- Forced unitization preserves point-norm homotopies. -/ 86 def unitization (h : StarHomotopy φ ψ) : 87 UnitalStarHomotopy (Unitization.starMap φ) (Unitization.starMap ψ) where 88 toFun t := Unitization.starMap (h.toFun t) 89 continuous_apply x := by 90 have hx : (fun t => Unitization.starMap (h.toFun t) x) = 91 fun t => algebraMap ℂ (Unitization ℂ B) x.fst + (h.toFun t x.snd : Unitization ℂ B) := by 92 funext t 93 conv_lhs => rw [← Unitization.inl_fst_add_inr_snd_eq x] 94 rw [map_add, Unitization.starMap_inl, Unitization.starMap_inr] 95 rw [hx] 96 exact continuous_const.add (Unitization.continuous_inr.comp (h.continuous_apply x.snd)) 97 source := congrArg Unitization.starMap h.source 98 target := congrArg Unitization.starMap h.target 99 end StarHomotopy 100 end BC4lean.OperatorKTheory
源码 SHA-256:e0de7464914e757552fbd6966586697dccecb552450d8f33eee790673b0e08af
1 import BC4lean.ProjectionHomotopy 2 import BC4lean.StarHomotopy 3 import BC4lean.NonunitalOperatorK 4 5 /-! # Homotopy invariance of maps on operator K-theory -/ 6 noncomputable section 7 namespace BC4lean.OperatorKTheory 8 section Unital 9 variable {A B : Type*} [CStarAlgebra A] [CStarAlgebra B] 10 variable [PartialOrder A] [StarOrderedRing A] [PartialOrder B] [StarOrderedRing B] 11 variable {φ ψ : A →⋆ₐ[ℂ] B} 12 13 /-- Point-norm homotopic unital homomorphisms have equivalent images of projections. -/ 14 theorem finiteProjection_equivalent_of_homotopy (h : UnitalStarHomotopy φ ψ) 15 (p : FiniteProjection A) : FiniteProjection.Equivalent (FiniteProjection.map φ p) 16 (FiniteProjection.map ψ p) := by 17 obtain ⟨v, hv, hv'⟩ := Projection.equivalent_of_path (h.projectionPath p.projection) 18 change ∃ w : CStarMatrix p.Index p.Index B, 19 w * star w = (matrixProjectionMap φ p.projection).val ∧ 20 star w * w = (matrixProjectionMap ψ p.projection).val 21 exact ⟨star v, by simpa using hv, by simpa using hv'⟩ 22 23 /-- Point-norm homotopic unital homomorphisms induce the same map on V(A). -/ 24 theorem stableProjectionMap_homotopy (h : UnitalStarHomotopy φ ψ) : 25 StableProjectionMonoid.map φ = StableProjectionMonoid.map ψ := by 26 ext x 27 refine Quotient.inductionOn x ?_ 28 intro p 29 exact Quotient.sound (finiteProjection_equivalent_of_homotopy h p) 30 31 /-- Point-norm homotopic unital homomorphisms induce the same K₀ map. -/ 32 theorem k0Map_homotopy (h : UnitalStarHomotopy φ ψ) : k0Map φ = k0Map ψ := by 33 apply k0Hom_ext 34 intro p 35 rw [k0Map_projection, k0Map_projection] 36 exact k0Projection_eq_of_equivalent (finiteProjection_equivalent_of_homotopy h p) 37 38 /-- Point-norm homotopic unital homomorphisms induce the same K₁ map. -/ 39 theorem k1Map_homotopy (h : UnitalStarHomotopy φ ψ) : k1Map φ = k1Map ψ := by 40 ext x 41 refine Quotient.inductionOn x ?_ 42 intro u 43 change k1Map φ (K1.of u) = k1Map ψ (K1.of u) 44 rw [k1Map_of, k1Map_of] 45 exact K1.of_homotopic ⟨h.unitaryPath u.val⟩ 46 end Unital 47 48 section Nonunital 49 variable {A B : Type*} [NonUnitalCStarAlgebra A] [NonUnitalCStarAlgebra B] 50 variable {φ ψ : A →⋆ₙₐ[ℂ] B} 51 52 /-- Point-norm homotopic possibly nonunital homomorphisms induce the same operator K₀ map. -/ 53 theorem operatorK0Map_homotopy (h : StarHomotopy φ ψ) : operatorK0Map φ = operatorK0Map ψ := by 54 let _ := CStarAlgebra.spectralOrder (Unitization ℂ A) 55 let _ := CStarAlgebra.spectralOrderedRing (Unitization ℂ A) 56 let _ := CStarAlgebra.spectralOrder (Unitization ℂ B) 57 let _ := CStarAlgebra.spectralOrderedRing (Unitization ℂ B) 58 ext x 59 apply Subtype.ext 60 exact DFunLike.congr_fun (k0Map_homotopy h.unitization) x.val 61 62 /-- Point-norm homotopic possibly nonunital homomorphisms induce the same operator K₁ map. -/ 63 theorem operatorK1Map_homotopy (h : StarHomotopy φ ψ) : operatorK1Map φ = operatorK1Map ψ := by 64 let _ := CStarAlgebra.spectralOrder (Unitization ℂ A) 65 let _ := CStarAlgebra.spectralOrderedRing (Unitization ℂ A) 66 let _ := CStarAlgebra.spectralOrder (Unitization ℂ B) 67 let _ := CStarAlgebra.spectralOrderedRing (Unitization ℂ B) 68 ext x 69 apply Subtype.ext 70 exact DFunLike.congr_fun (k1Map_homotopy h.unitization) x.val 71 end Nonunital 72 end BC4lean.OperatorKTheory
源码 SHA-256:b0eebca03ad3cab0dda38aad1dafc667edfb67196ea5d8c3042bb5b0bad4a9eb
1 import Mathlib.Topology.Algebra.ProperAction.CompactlyGenerated 2 3 /-! # Proper actions of discrete groups 4 5 We use Mathlib's `ProperSMul`, defined by properness of the action-pair map. 6 The compact-transporter criterion requires a locally compact Hausdorff space; 7 finite stabilizers are proved as a consequence, not used as a definition. 8 -/ 9 namespace BC4lean.ProperActions 10 open scoped Pointwise 11 12 variable {Γ X : Type*} [Group Γ] [TopologicalSpace Γ] 13 variable [TopologicalSpace X] [MulAction Γ X] 14 15 /-- The map whose properness defines a proper action. -/ 16 def actionMap : Γ × X → X × X := fun p => (p.1 • p.2, p.2) 17 18 /-- The project uses precisely Mathlib's proper-action predicate. -/ 19 theorem proper_iff_actionMap : ProperSMul Γ X ↔ IsProperMap (actionMap (Γ := Γ) (X := X)) := 20 properSMul_iff Γ X 21 22 /-- Group elements moving one set to meet another. -/ 23 def transporter (K L : Set X) : Set Γ := {g | (g • K ∩ L).Nonempty} 24 25 /-- A proper discrete-group action has finite compact transporters. -/ 26 theorem finite_transporter [DiscreteTopology Γ] [ProperSMul Γ X] 27 {K L : Set X} (hK : IsCompact K) (hL : IsCompact L) : 28 (transporter (Γ := Γ) K L).Finite := 29 isCompact_iff_finite.mp (ProperSMul.isCompact_setOfPred_inter_nonempty hK hL) 30 31 /-- Properness implies finite stabilizers without a local compactness hypothesis. -/ 32 theorem finite_stabilizer [DiscreteTopology Γ] [ProperSMul Γ X] (x : X) : 33 (MulAction.stabilizer Γ x : Set Γ).Finite := by 34 apply (finite_transporter (Γ := Γ) (K := {x}) (L := {x}) 35 isCompact_singleton isCompact_singleton).subset 36 intro g hg 37 refine ⟨g • x, Set.smul_mem_smul_set (Set.mem_singleton x), ?_⟩ 38 exact Set.mem_singleton_iff.mpr (MulAction.mem_stabilizer_iff.mp hg) 39 40 /-- A proper action has a Hausdorff orbit space. -/ 41 theorem orbitSpace_t2 [ProperSMul Γ X] : T2Space (Quotient (MulAction.orbitRel Γ X)) := 42 inferInstance 43 44 omit [TopologicalSpace Γ] in 45 /-- An orbit space of a locally compact space is locally compact for a continuous action. -/ 46 theorem orbitSpace_locallyCompact [ContinuousConstSMul Γ X] [LocallyCompactSpace X] : 47 LocallyCompactSpace (Quotient (MulAction.orbitRel Γ X)) := 48 MulAction.isOpenQuotientMap_quotientMk.locallyCompactSpace 49 50 /-- Restricting a proper discrete-group action to any subgroup preserves properness. -/ 51 theorem proper_subgroup [DiscreteTopology Γ] [ProperSMul Γ X] (H : Subgroup Γ) : 52 ProperSMul H X := 53 properSMul_of_isClosedEmbedding H.subtype 54 (isClosed_discrete (H : Set Γ)).isClosedEmbedding_subtypeVal (fun _ _ => rfl) 55 56 /-- A proper action on a nonempty compact space forces a discrete group to be finite. -/ 57 theorem finite_group_of_compact [DiscreteTopology Γ] [ProperSMul Γ X] 58 [CompactSpace X] [Nonempty X] : Finite Γ := by 59 have h : (Set.univ : Set Γ).Finite := by 60 simpa [transporter] using 61 (finite_transporter (Γ := Γ) (X := X) isCompact_univ isCompact_univ) 62 exact Set.finite_univ_iff.mp h 63 64 section LocallyCompact 65 variable [LocallyCompactSpace X] [T2Space X] [ContinuousSMul Γ X] 66 67 /-- On a locally compact Hausdorff space, properness is compactness of compact preimages. -/ 68 theorem proper_iff_compact_preimages : ProperSMul Γ X ↔ 69 ∀ {K : Set (X × X)}, IsCompact K → 70 IsCompact ((actionMap (Γ := Γ) (X := X)) ⁻¹' K) := by 71 rw [proper_iff_actionMap, isProperMap_iff_isCompact_preimage] 72 exact and_iff_right (continuous_smul.prodMk continuous_snd) 73 74 /-- The compact-transporter characterization of proper discrete-group actions. -/ 75 theorem proper_iff_finite_transporters [DiscreteTopology Γ] : ProperSMul Γ X ↔ 76 ∀ {K L : Set X}, IsCompact K → IsCompact L → (transporter (Γ := Γ) K L).Finite := by 77 rw [MulAction.properSMul_iff_isCompact_setOfPred_inter_nonempty] 78 simp only [transporter, isCompact_iff_finite] 79 80 /-- Every continuous action of a finite discrete group on an LCH space is proper. -/ 81 theorem proper_of_finite [DiscreteTopology Γ] [Finite Γ] : ProperSMul Γ X := 82 proper_iff_finite_transporters.mpr (fun _ _ => Set.toFinite _) 83 end LocallyCompact 84 85 /-- Left translation is proper for every topological group, in particular a discrete one. -/ 86 theorem proper_leftTranslation [IsTopologicalGroup Γ] : ProperSMul Γ Γ := 87 inferInstance 88 89 end BC4lean.ProperActions
源码 SHA-256:c81d7199622a28f862a8973980c1438010386ff359ca0ef7e1fc461b59329c90
1 import BC4lean.ProperActions 2 3 /-! # Subgroup fixed points of proper discrete-group actions 4 5 The empty-fixed-point condition for infinite subgroups follows from properness. 6 Contractibility of fixed points for finite subgroups is additional data, not a 7 consequence of properness. 8 -/ 9 namespace BC4lean.ProperActions 10 11 variable {Γ X : Type*} [Group Γ] [MulAction Γ X] 12 13 /-- The fixed-point space carries the subspace topology when `X` is topological. -/ 14 abbrev FixedPointSpace (H : Subgroup Γ) (X : Type*) [MulAction Γ X] := 15 ↥(MulAction.fixedPoints H X) 16 17 /-- A point is fixed by a subgroup exactly when that subgroup lies in its stabilizer. -/ 18 theorem mem_fixedPoints_iff_le_stabilizer (H : Subgroup Γ) (x : X) : 19 x ∈ MulAction.fixedPoints H X ↔ H ≤ MulAction.stabilizer Γ x := by 20 constructor 21 · intro hx g hg 22 exact hx ⟨g, hg⟩ 23 · intro hx g 24 exact hx g.property 25 26 /-- Passing to a smaller subgroup enlarges the fixed-point set. -/ 27 theorem fixedPoints_antitone {H K : Subgroup Γ} (hHK : H ≤ K) : 28 MulAction.fixedPoints K X ⊆ MulAction.fixedPoints H X := by 29 intro x hx 30 exact (mem_fixedPoints_iff_le_stabilizer H x).mpr 31 (hHK.trans ((mem_fixedPoints_iff_le_stabilizer K x).mp hx)) 32 33 /-- Every point is fixed by the trivial subgroup. -/ 34 theorem fixedPoints_bot : MulAction.fixedPoints (⊥ : Subgroup Γ) X = Set.univ := by 35 ext x 36 simp 37 38 section Topology 39 variable [TopologicalSpace X] [ContinuousConstSMul Γ X] [T2Space X] 40 41 /-- Fixed-point sets of subgroups are closed in a Hausdorff space. -/ 42 theorem isClosed_fixedPoints (H : Subgroup Γ) : IsClosed (MulAction.fixedPoints H X) := by 43 rw [MulAction.fixed_eq_iInter_fixedBy] 44 apply isClosed_iInter 45 intro h 46 exact isClosed_eq (continuous_const_smul (h : Γ)) continuous_id 47 48 /-- Subgroup fixed-point spaces of LCH spaces are locally compact. -/ 49 theorem fixedPointSpace_locallyCompact [LocallyCompactSpace X] (H : Subgroup Γ) : 50 LocallyCompactSpace (FixedPointSpace H X) := 51 (isClosed_fixedPoints (X := X) H).locallyCompactSpace 52 end Topology 53 54 section Proper 55 variable [TopologicalSpace Γ] [DiscreteTopology Γ] [TopologicalSpace X] [ProperSMul Γ X] 56 57 /-- A subgroup fixing a point in a proper discrete-group action is finite. -/ 58 theorem finite_subgroup_of_fixedPoint {H : Subgroup Γ} {x : X} 59 (hx : x ∈ MulAction.fixedPoints H X) : (H : Set Γ).Finite := 60 (finite_stabilizer (Γ := Γ) x).subset 61 ((mem_fixedPoints_iff_le_stabilizer H x).mp hx) 62 63 /-- Infinite subgroups have empty fixed-point sets in proper discrete-group actions. -/ 64 theorem fixedPoints_eq_empty_of_infinite (H : Subgroup Γ) [Infinite H] : 65 MulAction.fixedPoints H X = ∅ := by 66 apply Set.eq_empty_iff_forall_notMem.mpr 67 intro x hx 68 have : Finite H := (finite_subgroup_of_fixedPoint hx).to_subtype 69 exact not_finite H 70 71 /-- The topological fixed-point space is empty for an infinite subgroup. -/ 72 theorem fixedPointSpace_isEmpty (H : Subgroup Γ) [Infinite H] : 73 IsEmpty (FixedPointSpace H X) := 74 Set.isEmpty_coe_sort.mpr (fixedPoints_eq_empty_of_infinite H) 75 end Proper 76 77 end BC4lean.ProperActions
源码 SHA-256:454abee2c148ae393bbf0ef5f8f10bf3364a68646718c2b005227eff4b091989
1 import BC4lean.ProperFixedPoints 2 import Mathlib.GroupTheory.GroupAction.Hom 3 4 /-! # Continuous equivariant maps and their restrictions to fixed points -/ 5 namespace BC4lean.ProperActions 6 7 /-- A continuous map commuting with the action of the same group on source and target. -/ 8 structure EquivariantMap (Γ X Y : Type*) [Group Γ] [TopologicalSpace X] 9 [TopologicalSpace Y] [MulAction Γ X] [MulAction Γ Y] extends C(X, Y) where 10 map_smul' : ∀ (g : Γ) (x : X), toFun (g • x) = g • toFun x 11 12 namespace EquivariantMap 13 variable {Γ X Y Z W : Type*} [Group Γ] 14 variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z] [TopologicalSpace W] 15 variable [MulAction Γ X] [MulAction Γ Y] [MulAction Γ Z] [MulAction Γ W] 16 17 instance instFunLike : FunLike (EquivariantMap Γ X Y) X Y where 18 coe f := f.toContinuousMap 19 coe_injective f g h := by 20 cases f with 21 | mk f hf => 22 cases g with 23 | mk g hg => 24 have hfg : f = g := ContinuousMap.ext (congrFun h) 25 cases hfg 26 rfl 27 28 @[ext] theorem ext {f g : EquivariantMap Γ X Y} (h : ∀ x, f x = g x) : f = g := 29 DFunLike.ext _ _ h 30 31 @[simp] theorem map_smul (f : EquivariantMap Γ X Y) (g : Γ) (x : X) : 32 f (g • x) = g • f x := f.map_smul' g x 33 34 theorem continuous (f : EquivariantMap Γ X Y) : Continuous f := f.toContinuousMap.continuous 35 36 /-- Forget topology, retaining Mathlib's existing equivariant-map structure. -/ 37 def toMulActionHom (f : EquivariantMap Γ X Y) : X →[Γ] Y where 38 toFun := f 39 map_smul' := f.map_smul 40 41 /-- The equivariant identity map. -/ 42 def id : EquivariantMap Γ X X where 43 toContinuousMap := ContinuousMap.id X 44 map_smul' _ _ := rfl 45 46 /-- Composition of continuous equivariant maps. -/ 47 def comp (g : EquivariantMap Γ Y Z) (f : EquivariantMap Γ X Y) : EquivariantMap Γ X Z where 48 toContinuousMap := g.toContinuousMap.comp f.toContinuousMap 49 map_smul' a x := by 50 change g (f (a • x)) = a • g (f x) 51 rw [f.map_smul, g.map_smul] 52 53 @[simp] theorem id_apply (x : X) : id (Γ := Γ) x = x := rfl 54 @[simp] theorem comp_apply (g : EquivariantMap Γ Y Z) (f : EquivariantMap Γ X Y) (x : X) : 55 g.comp f x = g (f x) := rfl 56 @[simp] theorem id_comp (f : EquivariantMap Γ X Y) : id.comp f = f := by ext; rfl 57 @[simp] theorem comp_id (f : EquivariantMap Γ X Y) : f.comp id = f := by ext; rfl 58 theorem comp_assoc (h : EquivariantMap Γ Z W) (g : EquivariantMap Γ Y Z) 59 (f : EquivariantMap Γ X Y) : (h.comp g).comp f = h.comp (g.comp f) := by ext; rfl 60 61 /-- An equivariant map sends subgroup fixed points to subgroup fixed points. -/ 62 theorem map_fixedPoint (f : EquivariantMap Γ X Y) (H : Subgroup Γ) {x : X} 63 (hx : x ∈ MulAction.fixedPoints H X) : f x ∈ MulAction.fixedPoints H Y := by 64 intro h 65 change (h : Γ) • f x = f x 66 rw [← f.map_smul] 67 exact congrArg f (hx h) 68 69 /-- Restrict an equivariant map to the H-fixed-point subspaces. -/ 70 def fixedPointsMap (f : EquivariantMap Γ X Y) (H : Subgroup Γ) : 71 C(FixedPointSpace H X, FixedPointSpace H Y) where 72 toFun x := ⟨f x, f.map_fixedPoint H x.property⟩ 73 continuous_toFun := (f.continuous.comp continuous_subtype_val).subtype_mk _ 74 75 @[simp] theorem fixedPointsMap_apply (f : EquivariantMap Γ X Y) (H : Subgroup Γ) 76 (x : FixedPointSpace H X) : (f.fixedPointsMap H x : Y) = f x := rfl 77 78 @[simp] theorem fixedPointsMap_id (H : Subgroup Γ) : 79 (id (Γ := Γ) (X := X)).fixedPointsMap H = ContinuousMap.id (FixedPointSpace H X) := by 80 ext; rfl 81 82 @[simp] theorem fixedPointsMap_comp (g : EquivariantMap Γ Y Z) (f : EquivariantMap Γ X Y) 83 (H : Subgroup Γ) : 84 (g.comp f).fixedPointsMap H = (g.fixedPointsMap H).comp (f.fixedPointsMap H) := by 85 ext; rfl 86 87 end EquivariantMap 88 end BC4lean.ProperActions
源码 SHA-256:41fbf68c613d5372a733d5d9520bb8c925df4356c5403bc79e20259e446c7a79
1 import BC4lean.EquivariantMaps 2 import Mathlib.Topology.Homotopy.Basic 3 4 /-! # Jointly continuous equivariant homotopies and fixed-point restriction -/ 5 noncomputable section 6 namespace BC4lean.ProperActions 7 variable {Γ X Y Z : Type*} [Group Γ] 8 variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z] 9 variable [MulAction Γ X] [MulAction Γ Y] [MulAction Γ Z] 10 11 /-- A jointly continuous homotopy all of whose time slices are equivariant. -/ 12 abbrev EquivariantHomotopy (f g : EquivariantMap Γ X Y) := 13 ContinuousMap.HomotopyWith f.toContinuousMap g.toContinuousMap 14 (fun k => ∀ (a : Γ) (x : X), k (a • x) = a • k x) 15 16 namespace EquivariantHomotopy 17 variable {f₀ f₁ f₂ : EquivariantMap Γ X Y} 18 19 /-- The constant equivariant homotopy. -/ 20 def refl (f : EquivariantMap Γ X Y) : EquivariantHomotopy f f := 21 ContinuousMap.HomotopyWith.refl f.toContinuousMap f.map_smul 22 23 /-- Reverse an equivariant homotopy. -/ 24 def symm (F : EquivariantHomotopy f₀ f₁) : EquivariantHomotopy f₁ f₀ := 25 ContinuousMap.HomotopyWith.symm F 26 27 /-- Concatenate equivariant homotopies using the usual half-interval parametrization. -/ 28 def trans (F : EquivariantHomotopy f₀ f₁) (G : EquivariantHomotopy f₁ f₂) : 29 EquivariantHomotopy f₀ f₂ := ContinuousMap.HomotopyWith.trans F G 30 31 /-- Compose two equivariant homotopies at the same time parameter. -/ 32 def comp {g₀ g₁ : EquivariantMap Γ Y Z} (G : EquivariantHomotopy g₀ g₁) 33 (F : EquivariantHomotopy f₀ f₁) : EquivariantHomotopy (g₀.comp f₀) (g₁.comp f₁) where 34 toHomotopy := G.toHomotopy.comp F.toHomotopy 35 prop' t a x := by 36 change G (t, F (t, a • x)) = a • G (t, F (t, x)) 37 have hF : F (t, a • x) = a • F (t, x) := F.prop t a x 38 rw [hF] 39 exact G.prop t a (F (t, x)) 40 41 /-- Each time slice is itself a continuous equivariant map. -/ 42 def atTime (F : EquivariantHomotopy f₀ f₁) (t : unitInterval) : EquivariantMap Γ X Y where 43 toContinuousMap := F.toHomotopy.curry t 44 map_smul' := F.prop t 45 46 @[simp] theorem at_apply (F : EquivariantHomotopy f₀ f₁) (t : unitInterval) (x : X) : 47 F.atTime t x = F (t, x) := rfl 48 @[simp] theorem at_zero (F : EquivariantHomotopy f₀ f₁) : F.atTime 0 = f₀ := by 49 ext x 50 exact F.apply_zero x 51 @[simp] theorem at_one (F : EquivariantHomotopy f₀ f₁) : F.atTime 1 = f₁ := by 52 ext x 53 exact F.apply_one x 54 55 /-- Restrict the whole jointly continuous homotopy to subgroup fixed-point spaces. -/ 56 def onFixedPoints (F : EquivariantHomotopy f₀ f₁) (H : Subgroup Γ) : 57 ContinuousMap.Homotopy (f₀.fixedPointsMap H) (f₁.fixedPointsMap H) where 58 toFun p := (F.atTime p.1).fixedPointsMap H p.2 59 continuous_toFun := (F.continuous.comp 60 (continuous_fst.prodMk (continuous_subtype_val.comp continuous_snd))).subtype_mk _ 61 map_zero_left x := Subtype.ext (F.apply_zero x.val) 62 map_one_left x := Subtype.ext (F.apply_one x.val) 63 64 @[simp] theorem onFixedPoints_apply (F : EquivariantHomotopy f₀ f₁) (H : Subgroup Γ) 65 (t : unitInterval) (x : FixedPointSpace H X) : 66 (F.onFixedPoints H (t, x) : Y) = F (t, x.val) := rfl 67 68 @[simp] theorem onFixedPoints_refl (f : EquivariantMap Γ X Y) (H : Subgroup Γ) : 69 (refl f).onFixedPoints H = ContinuousMap.Homotopy.refl (f.fixedPointsMap H) := by 70 ext p; rfl 71 72 @[simp] theorem onFixedPoints_symm (F : EquivariantHomotopy f₀ f₁) (H : Subgroup Γ) : 73 (symm F).onFixedPoints H = (F.onFixedPoints H).symm := by 74 ext p; rfl 75 76 theorem onFixedPoints_trans (F : EquivariantHomotopy f₀ f₁) (G : EquivariantHomotopy f₁ f₂) 77 (H : Subgroup Γ) : (trans F G).onFixedPoints H = 78 (F.onFixedPoints H).trans (G.onFixedPoints H) := by 79 ext ⟨t, x⟩ 80 simp only [onFixedPoints_apply, trans, ContinuousMap.HomotopyWith.trans_apply, 81 ContinuousMap.Homotopy.trans_apply] 82 split_ifs <;> rfl 83 84 theorem onFixedPoints_comp {g₀ g₁ : EquivariantMap Γ Y Z} 85 (G : EquivariantHomotopy g₀ g₁) (F : EquivariantHomotopy f₀ f₁) (H : Subgroup Γ) : 86 (comp G F).onFixedPoints H = (G.onFixedPoints H).comp (F.onFixedPoints H) := by 87 ext p; rfl 88 end EquivariantHomotopy 89 90 /-- Existence of a jointly continuous equivariant homotopy. -/ 91 def EquivariantlyHomotopic (f g : EquivariantMap Γ X Y) : Prop := 92 Nonempty (EquivariantHomotopy f g) 93 94 namespace EquivariantlyHomotopic 95 variable {f₀ f₁ f₂ : EquivariantMap Γ X Y} 96 97 theorem refl (f : EquivariantMap Γ X Y) : EquivariantlyHomotopic f f := 98 ⟨EquivariantHomotopy.refl f⟩ 99 theorem symm (h : EquivariantlyHomotopic f₀ f₁) : EquivariantlyHomotopic f₁ f₀ := 100 h.elim (fun F => ⟨EquivariantHomotopy.symm F⟩) 101 theorem trans (h : EquivariantlyHomotopic f₀ f₁) (k : EquivariantlyHomotopic f₁ f₂) : 102 EquivariantlyHomotopic f₀ f₂ := 103 h.elim (fun F => k.elim (fun G => ⟨EquivariantHomotopy.trans F G⟩)) 104 theorem comp {g₀ g₁ : EquivariantMap Γ Y Z} (h : EquivariantlyHomotopic g₀ g₁) 105 (k : EquivariantlyHomotopic f₀ f₁) : EquivariantlyHomotopic (g₀.comp f₀) (g₁.comp f₁) := 106 h.elim (fun G => k.elim (fun F => ⟨EquivariantHomotopy.comp G F⟩)) 107 108 /-- Fixed-point restriction sends equivariant homotopy to ordinary homotopy. -/ 109 theorem onFixedPoints (h : EquivariantlyHomotopic f₀ f₁) (H : Subgroup Γ) : 110 ContinuousMap.Homotopic (f₀.fixedPointsMap H) (f₁.fixedPointsMap H) := 111 h.elim (fun F => ⟨F.onFixedPoints H⟩) 112 end EquivariantlyHomotopic 113 end BC4lean.ProperActions
源码 SHA-256:7994a431988bbe1f489665e11f76bac2d711bc726de2bc079e102cb13a567a96
1 import BC4lean.EquivariantHomotopy 2 import Mathlib.Topology.Homotopy.Equiv 3 4 /-! # Equivariant homotopy equivalences induce equivalences on fixed-point spaces -/ 5 noncomputable section 6 namespace BC4lean.ProperActions 7 8 /-- Equivariant maps inverse up to jointly continuous equivariant homotopy. -/ 9 structure EquivariantHomotopyEquiv (Γ X Y : Type*) [Group Γ] 10 [TopologicalSpace X] [TopologicalSpace Y] [MulAction Γ X] [MulAction Γ Y] where 11 toMap : EquivariantMap Γ X Y 12 invMap : EquivariantMap Γ Y X 13 left_inv : EquivariantlyHomotopic (invMap.comp toMap) EquivariantMap.id 14 right_inv : EquivariantlyHomotopic (toMap.comp invMap) EquivariantMap.id 15 16 namespace EquivariantHomotopyEquiv 17 variable {Γ X Y Z : Type*} [Group Γ] 18 variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z] 19 variable [MulAction Γ X] [MulAction Γ Y] [MulAction Γ Z] 20 21 /-- The identity equivariant homotopy equivalence. -/ 22 def refl : EquivariantHomotopyEquiv Γ X X where 23 toMap := EquivariantMap.id 24 invMap := EquivariantMap.id 25 left_inv := EquivariantlyHomotopic.refl _ 26 right_inv := EquivariantlyHomotopic.refl _ 27 28 /-- Reverse an equivariant homotopy equivalence. -/ 29 def symm (e : EquivariantHomotopyEquiv Γ X Y) : EquivariantHomotopyEquiv Γ Y X where 30 toMap := e.invMap 31 invMap := e.toMap 32 left_inv := e.right_inv 33 right_inv := e.left_inv 34 35 /-- Compose equivariant homotopy equivalences. -/ 36 def trans (e : EquivariantHomotopyEquiv Γ X Y) (d : EquivariantHomotopyEquiv Γ Y Z) : 37 EquivariantHomotopyEquiv Γ X Z where 38 toMap := d.toMap.comp e.toMap 39 invMap := e.invMap.comp d.invMap 40 left_inv := by 41 have h := (EquivariantlyHomotopic.refl e.invMap).comp 42 (d.left_inv.comp (EquivariantlyHomotopic.refl e.toMap)) 43 simp only [EquivariantMap.comp_assoc, EquivariantMap.id_comp] at h 44 exact h.trans e.left_inv 45 right_inv := by 46 have h := (EquivariantlyHomotopic.refl d.toMap).comp 47 (e.right_inv.comp (EquivariantlyHomotopic.refl d.invMap)) 48 simp only [EquivariantMap.comp_assoc, EquivariantMap.id_comp] at h 49 exact h.trans d.right_inv 50 51 /-- Taking H-fixed points preserves equivariant homotopy equivalences. -/ 52 def fixedPoints (e : EquivariantHomotopyEquiv Γ X Y) (H : Subgroup Γ) : 53 ContinuousMap.HomotopyEquiv (FixedPointSpace H X) (FixedPointSpace H Y) where 54 toFun := e.toMap.fixedPointsMap H 55 invFun := e.invMap.fixedPointsMap H 56 left_inv := by 57 simpa only [EquivariantMap.fixedPointsMap_comp, EquivariantMap.fixedPointsMap_id] 58 using e.left_inv.onFixedPoints H 59 right_inv := by 60 simpa only [EquivariantMap.fixedPointsMap_comp, EquivariantMap.fixedPointsMap_id] 61 using e.right_inv.onFixedPoints H 62 63 @[simp] theorem fixedPoints_toFun_apply (e : EquivariantHomotopyEquiv Γ X Y) (H : Subgroup Γ) 64 (x : FixedPointSpace H X) : ((e.fixedPoints H).toFun x : Y) = e.toMap x := rfl 65 66 @[simp] theorem fixedPoints_invFun_apply (e : EquivariantHomotopyEquiv Γ X Y) (H : Subgroup Γ) 67 (y : FixedPointSpace H Y) : ((e.fixedPoints H).invFun y : X) = e.invMap y := rfl 68 69 end EquivariantHomotopyEquiv 70 end BC4lean.ProperActions
源码 SHA-256:89b1af04865bdc9ef351dba80008ef0c7eb4109eddab8e4e44bbb1ed886ed905
1 import BC4lean.EquivariantMaps 2 import Mathlib.Topology.Algebra.Group.Quotient 3 4 /-! # Maps from homogeneous orbits 5 6 Evaluation at the identity coset identifies continuous equivariant maps out of 7 `Γ ⧸ H` with `H`-fixed points. No normality or finiteness hypothesis on `H` is used. 8 -/ 9 namespace BC4lean.ProperActions 10 11 variable {Γ X Y : Type*} [Group Γ] [TopologicalSpace Γ] [DiscreteTopology Γ] 12 variable [TopologicalSpace X] [MulAction Γ X] 13 variable [TopologicalSpace Y] [MulAction Γ Y] 14 15 omit [TopologicalSpace Γ] [DiscreteTopology Γ] in 16 /-- The identity coset is fixed by the subgroup defining the orbit. -/ 17 theorem subgroup_fixes_identity_coset (H : Subgroup Γ) (h : H) : 18 (h : Γ) • (QuotientGroup.mk 1 : Γ ⧸ H) = QuotientGroup.mk 1 := by 19 change QuotientGroup.mk ((h : Γ) * 1) = (QuotientGroup.mk 1 : Γ ⧸ H) 20 rw [mul_one, QuotientGroup.eq] 21 simpa only [mul_one] using H.inv_mem h.property 22 23 /-- Descend `g ↦ g • x` to the orbit when `x` is `H`-fixed. -/ 24 def orbitMap (H : Subgroup Γ) (x : FixedPointSpace H X) : EquivariantMap Γ (Γ ⧸ H) X where 25 toFun := Quotient.lift (fun g : Γ => g • (x : X)) (by 26 intro a b hab 27 have hab' : a⁻¹ * b ∈ H := QuotientGroup.leftRel_apply.mp hab 28 have hx := x.property ⟨a⁻¹ * b, hab'⟩ 29 change (a⁻¹ * b) • (x : X) = x at hx 30 have := congrArg (fun z : X => a • z) hx 31 simpa [mul_smul] using this.symm) 32 continuous_toFun := by 33 let : DiscreteTopology (Γ ⧸ H) := QuotientGroup.discreteTopology (isOpen_discrete _) 34 exact continuous_of_discreteTopology 35 map_smul' g q := by 36 induction q using QuotientGroup.induction_on with 37 | H a => exact mul_smul g a (x : X) 38 39 @[simp] theorem orbitMap_mk (H : Subgroup Γ) (x : FixedPointSpace H X) (g : Γ) : 40 orbitMap H x (QuotientGroup.mk g) = g • (x : X) := rfl 41 42 /-- Evaluation at the identity coset has values in the fixed-point subspace. -/ 43 def orbitEvaluation (H : Subgroup Γ) (f : EquivariantMap Γ (Γ ⧸ H) X) : 44 FixedPointSpace H X := 45 ⟨f (QuotientGroup.mk 1), fun h => by 46 change (h : Γ) • f (QuotientGroup.mk 1) = f (QuotientGroup.mk 1) 47 rw [← f.map_smul, subgroup_fixes_identity_coset]⟩ 48 49 omit [DiscreteTopology Γ] in 50 @[simp] theorem orbitEvaluation_val (H : Subgroup Γ) (f : EquivariantMap Γ (Γ ⧸ H) X) : 51 (orbitEvaluation H f : X) = f (QuotientGroup.mk 1) := rfl 52 53 /-- The orbit/fixed-point correspondence for continuous equivariant maps. -/ 54 def orbitFixedPointEquiv (H : Subgroup Γ) : 55 EquivariantMap Γ (Γ ⧸ H) X ≃ FixedPointSpace H X where 56 toFun := orbitEvaluation H 57 invFun := orbitMap H 58 left_inv f := by 59 ext q 60 induction q using QuotientGroup.induction_on with 61 | H g => 62 change g • f (QuotientGroup.mk 1) = f (QuotientGroup.mk g) 63 rw [← f.map_smul] 64 congr 1 65 change QuotientGroup.mk (g * 1) = (QuotientGroup.mk g : Γ ⧸ H) 66 rw [mul_one] 67 right_inv x := by 68 apply Subtype.ext 69 exact one_smul Γ (x : X) 70 71 /-- The correspondence commutes with postcomposition. -/ 72 theorem orbitFixedPointEquiv_natural (H : Subgroup Γ) 73 (f : EquivariantMap Γ (Γ ⧸ H) X) (g : EquivariantMap Γ X Y) : 74 orbitFixedPointEquiv H (g.comp f) = g.fixedPointsMap H (orbitFixedPointEquiv H f) := rfl 75 76 end BC4lean.ProperActions
源码 SHA-256:829ce4e3bd4da88a2f66af0f06a97a46f7fce18601157fd56a03a146b41407b1
1 import BC4lean.OrbitFixedPoints 2 import Mathlib.Topology.AlexandrovDiscrete 3 4 /-! # Proper homogeneous orbits and orbit cells -/ 5 namespace BC4lean.ProperActions 6 open scoped Pointwise 7 8 variable {Γ X Y : Type*} [Group Γ] [TopologicalSpace Γ] [DiscreteTopology Γ] 9 10 /-- For a finite subgroup of a discrete group, the coset projection is proper. -/ 11 theorem proper_cosetProjection (H : Subgroup Γ) [Finite H] : 12 IsProperMap (QuotientGroup.mk : Γ → Γ ⧸ H) := by 13 let : DiscreteTopology (Γ ⧸ H) := QuotientGroup.discreteTopology (isOpen_discrete _) 14 apply isProperMap_iff_isClosedMap_and_compact_fibers.mpr 15 refine ⟨continuous_of_discreteTopology, fun _ _ => isClosed_discrete _, ?_⟩ 16 intro q 17 induction q using QuotientGroup.induction_on with | H g => 18 apply Set.Finite.isCompact 19 apply (Set.finite_range (fun h : H => g * (h : Γ))).subset 20 intro a ha 21 have hga : g⁻¹ * a ∈ H := QuotientGroup.eq.mp (Set.mem_singleton_iff.mp ha).symm 22 exact ⟨⟨g⁻¹ * a, hga⟩, mul_inv_cancel_left g a⟩ 23 24 /-- A homogeneous orbit with finite stabilizer is a proper discrete-group space. -/ 25 theorem proper_orbit (H : Subgroup Γ) [Finite H] : ProperSMul Γ (Γ ⧸ H) := by 26 apply MulAction.properSMul_of_proper_orbitMap (x := (QuotientGroup.mk 1 : Γ ⧸ H)) 27 simpa only [MulAction.Quotient.smul_mk, smul_eq_mul, mul_one] using proper_cosetProjection H 28 29 /-- Properness of the homogeneous orbit is equivalent to finiteness of its stabilizer. -/ 30 theorem proper_orbit_iff (H : Subgroup Γ) : ProperSMul Γ (Γ ⧸ H) ↔ Finite H := by 31 constructor 32 · intro h 33 let := h 34 exact (finite_subgroup_of_fixedPoint (H := H) 35 (x := (QuotientGroup.mk 1 : Γ ⧸ H)) (subgroup_fixes_identity_coset H)).to_subtype 36 · intro h 37 let := h 38 exact proper_orbit H 39 40 variable [TopologicalSpace X] [MulAction Γ X] [ContinuousSMul Γ X] 41 variable [LocallyCompactSpace X] [T2Space X] 42 variable [TopologicalSpace Y] [MulAction Γ Y] [ProperSMul Γ Y] 43 44 /-- An equivariant map to a proper space forces properness of an LCH source. -/ 45 theorem proper_of_equivariantMap (f : EquivariantMap Γ X Y) : ProperSMul Γ X := by 46 apply proper_iff_finite_transporters.mpr 47 intro K L hK hL 48 apply (finite_transporter (Γ := Γ) (hK.image f.continuous) (hL.image f.continuous)).subset 49 intro g hg 50 obtain ⟨y, hy, hyL⟩ := hg 51 obtain ⟨x, hx, hxy⟩ := hy 52 refine ⟨f y, ?_, ⟨y, hyL, rfl⟩⟩ 53 refine ⟨f x, ⟨x, hx, rfl⟩, ?_⟩ 54 change g • f x = f y 55 exact (f.map_smul g x).symm.trans (congrArg f hxy) 56 57 /-- An orbit cell, with the group acting only on its homogeneous-orbit factor. 58 Taking `D` to be a disk gives the cells used in equivariant CW constructions. -/ 59 def OrbitCell (H : Subgroup Γ) (D : Type*) := (Γ ⧸ H) × D 60 61 namespace OrbitCell 62 variable (H : Subgroup Γ) (D : Type*) [TopologicalSpace D] 63 64 instance instTopologicalSpace : TopologicalSpace (OrbitCell H D) := 65 inferInstanceAs (TopologicalSpace ((Γ ⧸ H) × D)) 66 67 instance instMulAction : MulAction Γ (OrbitCell H D) where 68 smul g p := (g • p.1, p.2) 69 one_smul p := Prod.ext (one_smul Γ p.1) rfl 70 mul_smul g h p := Prod.ext (mul_smul g h p.1) rfl 71 72 instance instContinuousSMul : ContinuousSMul Γ (OrbitCell H D) where 73 continuous_smul := 74 (continuous_fst.smul continuous_snd.fst).prodMk continuous_snd.snd 75 76 instance instLocallyCompactSpace [LocallyCompactSpace D] : 77 LocallyCompactSpace (OrbitCell H D) := by 78 let : DiscreteTopology (Γ ⧸ H) := QuotientGroup.discreteTopology (isOpen_discrete _) 79 exact inferInstanceAs (LocallyCompactSpace ((Γ ⧸ H) × D)) 80 81 instance instT2Space [T2Space D] : T2Space (OrbitCell H D) := by 82 let : DiscreteTopology (Γ ⧸ H) := QuotientGroup.discreteTopology (isOpen_discrete _) 83 exact inferInstanceAs (T2Space ((Γ ⧸ H) × D)) 84 85 /-- Projection onto the homogeneous-orbit factor. -/ 86 def projection : EquivariantMap Γ (OrbitCell H D) (Γ ⧸ H) where 87 toFun p := p.1 88 continuous_toFun := continuous_fst 89 map_smul' _ _ := rfl 90 91 /-- Orbit cells with finite stabilizer and LCH parameter are proper. -/ 92 theorem proper [Finite H] [LocallyCompactSpace D] [T2Space D] : 93 ProperSMul Γ (OrbitCell H D) := by 94 let := proper_orbit H 95 exact proper_of_equivariantMap (projection H D) 96 97 end OrbitCell 98 end BC4lean.ProperActions
源码 SHA-256:051f80906db2d1159c31d709be2ca798bd3f15d88a3336e46216a46743f3386b
1 import BC4lean.EquivariantHomotopyEquiv 2 3 /-! # Uniqueness from a homotopy-universal mapping property 4 5 These lemmas isolate the uniqueness argument. They do not assert that a space 6 with this mapping property exists, or derive it from fixed-point contractibility. 7 -/ 8 namespace BC4lean.ProperActions 9 10 variable {Γ X Y Z : Type*} [Group Γ] 11 variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z] 12 variable [MulAction Γ X] [MulAction Γ Y] [MulAction Γ Z] 13 14 /-- Maps from a specified source exist and are unique up to equivariant homotopy. -/ 15 def HomotopyTerminalFor (Γ X Y : Type*) [Group Γ] 16 [TopologicalSpace X] [TopologicalSpace Y] [MulAction Γ X] [MulAction Γ Y] : Prop := 17 Nonempty (EquivariantMap Γ X Y) ∧ 18 ∀ f g : EquivariantMap Γ X Y, EquivariantlyHomotopic f g 19 20 /-- The universal-property uniqueness argument, with its four premises explicit. -/ 21 theorem homotopyTerminal_unique 22 (hXY : HomotopyTerminalFor Γ X Y) (hYX : HomotopyTerminalFor Γ Y X) 23 (hXX : HomotopyTerminalFor Γ X X) (hYY : HomotopyTerminalFor Γ Y Y) : 24 Nonempty (EquivariantHomotopyEquiv Γ X Y) := by 25 obtain ⟨f⟩ := hXY.1 26 obtain ⟨g⟩ := hYX.1 27 exact ⟨⟨f, g, hXX.2 _ _, hYY.2 _ _⟩⟩ 28 29 /-- Homotopy-terminal targets can be replaced by equivariantly homotopy-equivalent targets. -/ 30 theorem HomotopyTerminalFor.of_equiv (h : HomotopyTerminalFor Γ X Y) 31 (e : EquivariantHomotopyEquiv Γ Y Z) : HomotopyTerminalFor Γ X Z := by 32 constructor 33 · obtain ⟨f⟩ := h.1 34 exact ⟨e.toMap.comp f⟩ 35 · intro f g 36 have hf : EquivariantlyHomotopic (e.toMap.comp (e.invMap.comp f)) f := by 37 simpa only [← EquivariantMap.comp_assoc, EquivariantMap.id_comp] 38 using e.right_inv.comp (EquivariantlyHomotopic.refl f) 39 have hg : EquivariantlyHomotopic (e.toMap.comp (e.invMap.comp g)) g := by 40 simpa only [← EquivariantMap.comp_assoc, EquivariantMap.id_comp] 41 using e.right_inv.comp (EquivariantlyHomotopic.refl g) 42 exact hf.symm.trans (((EquivariantlyHomotopic.refl e.toMap).comp 43 (h.2 (e.invMap.comp f) (e.invMap.comp g))).trans hg) 44 45 /-- Uniqueness also identifies all subgroup fixed-point homotopy types. -/ 46 theorem homotopyTerminal_fixedPoints_unique 47 (hXY : HomotopyTerminalFor Γ X Y) (hYX : HomotopyTerminalFor Γ Y X) 48 (hXX : HomotopyTerminalFor Γ X X) (hYY : HomotopyTerminalFor Γ Y Y) 49 (H : Subgroup Γ) : 50 Nonempty (ContinuousMap.HomotopyEquiv (FixedPointSpace H X) (FixedPointSpace H Y)) := by 51 obtain ⟨e⟩ := homotopyTerminal_unique hXY hYX hXX hYY 52 exact ⟨e.fixedPoints H⟩ 53 54 end BC4lean.ProperActions
源码 SHA-256:42ed97a4a4e236029d4ae40ab5b9d74ddb5cd35e6d7000971085773701577843
1 import BC4lean.HomotopyTerminal 2 import Mathlib.Topology.Homotopy.Contractible 3 4 /-! # The fixed-point criterion and the finite-group point model 5 6 This predicate records the fixed-point condition on a prospective model. It is 7 not a definition of an equivariant CW complex, nor a proof of the general model 8 existence or of the cellular universal mapping theorem. 9 -/ 10 namespace BC4lean.ProperActions 11 12 /-- The fixed-point condition expected of a universal proper model. -/ 13 def FixedPointCriterion (Γ X : Type*) [Group Γ] [TopologicalSpace X] [MulAction Γ X] : Prop := 14 (∀ H : Subgroup Γ, Finite H → ContractibleSpace (FixedPointSpace H X)) ∧ 15 (∀ H : Subgroup Γ, Infinite H → IsEmpty (FixedPointSpace H X)) 16 17 variable {Γ X Y : Type*} [Group Γ] [TopologicalSpace X] [TopologicalSpace Y] 18 variable [MulAction Γ X] [MulAction Γ Y] 19 20 /-- The fixed-point criterion is invariant under equivariant homotopy equivalence. -/ 21 theorem FixedPointCriterion.of_equiv (h : FixedPointCriterion Γ X) 22 (e : EquivariantHomotopyEquiv Γ X Y) : FixedPointCriterion Γ Y := by 23 constructor 24 · intro H hH 25 exact (e.fixedPoints H).contractibleSpace_iff.mp (h.1 H hH) 26 · intro H hH 27 let := h.2 H hH 28 exact ⟨fun y => isEmptyElim (e.invMap.fixedPointsMap H y)⟩ 29 30 /-- A one-point space carrying the trivial action. -/ 31 def Point := Unit 32 33 namespace Point 34 instance instUnique : Unique Point := inferInstanceAs (Unique Unit) 35 instance instTopologicalSpace : TopologicalSpace Point := ⊥ 36 instance instDiscreteTopology : DiscreteTopology Point := ⟨rfl⟩ 37 instance instMulAction : MulAction Γ Point where 38 smul _ x := x 39 one_smul _ := rfl 40 mul_smul _ _ _ := rfl 41 42 /-- Every fixed-point space of the trivial one-point action is contractible. -/ 43 theorem fixedPoints_contractible (H : Subgroup Γ) : 44 ContractibleSpace (FixedPointSpace H Point) := by 45 let : Nonempty (FixedPointSpace H Point) := ⟨⟨default, fun _ => rfl⟩⟩ 46 infer_instance 47 48 /-- For finite groups the point satisfies the full fixed-point criterion. -/ 49 theorem fixedPointCriterion [Finite Γ] : FixedPointCriterion Γ Point := by 50 refine ⟨fun H _ => fixedPoints_contractible H, ?_⟩ 51 intro H hH 52 let := hH 53 exact False.elim (not_finite H) 54 55 /-- The point has the required mapping property for every source. -/ 56 theorem homotopyTerminal (Γ X : Type*) [Group Γ] [TopologicalSpace X] [MulAction Γ X] : 57 HomotopyTerminalFor Γ X Point := by 58 constructor 59 · exact ⟨{ toFun := fun _ => default, continuous_toFun := continuous_const, 60 map_smul' := fun _ _ => rfl }⟩ 61 · intro f g 62 have : f = g := EquivariantMap.ext (fun _ => Subsingleton.elim _ _) 63 subst g 64 exact EquivariantlyHomotopic.refl f 65 66 /-- The one-point action of a finite discrete group is proper. -/ 67 theorem proper [TopologicalSpace Γ] [DiscreteTopology Γ] [Finite Γ] : 68 ProperSMul Γ Point := by 69 let : ContinuousSMul Γ Point := ⟨continuous_of_discreteTopology⟩ 70 exact proper_of_finite 71 72 end Point 73 end BC4lean.ProperActions
源码 SHA-256:abd7fa7802d96e2e4dcdfd85cb4ed2d2d4ccd0d0ba26058b403173277aed32c9
1 import BC4lean.EquivariantMaps 2 import Mathlib.Topology.Maps.OpenQuotient 3 4 /-! # Closed invariant cocompact pieces of a given proper space 5 6 The indexing construction below is conditional on the ambient space. It does 7 not construct a universal proper space or select a locally compact model. 8 -/ 9 namespace BC4lean.ProperActions 10 open Topology 11 12 variable {Γ X : Type*} [Group Γ] [TopologicalSpace X] [MulAction Γ X] 13 14 /-- An invariant subset with the induced topology and action. -/ 15 structure InvariantSubset (Γ X : Type*) [Group Γ] [MulAction Γ X] where 16 carrier : Set X 17 smul_mem : ∀ (g : Γ) {x : X}, x ∈ carrier → g • x ∈ carrier 18 19 namespace InvariantSubset 20 instance instSetLike : SetLike (InvariantSubset Γ X) X where 21 coe := carrier 22 coe_injective := by rintro ⟨s, hs⟩ ⟨t, ht⟩ rfl; rfl 23 24 instance instPartialOrder : PartialOrder (InvariantSubset Γ X) := .ofSetLike _ _ 25 26 instance instMulAction (s : InvariantSubset Γ X) : MulAction Γ s where 27 smul g x := ⟨g • x.val, s.smul_mem g x.property⟩ 28 one_smul x := Subtype.ext (one_smul Γ x.val) 29 mul_smul g h x := Subtype.ext (mul_smul g h x.val) 30 31 omit [TopologicalSpace X] in 32 @[simp] theorem coe_smul (s : InvariantSubset Γ X) (g : Γ) (x : s) : 33 ((g • x : s) : X) = g • (x : X) := rfl 34 35 instance instContinuousConstSMul (s : InvariantSubset Γ X) [ContinuousConstSMul Γ X] : 36 ContinuousConstSMul Γ s where 37 continuous_const_smul g := (continuous_const_smul g).subtype_map (fun _ hx => s.smul_mem g hx) 38 39 /-- Inclusion of an invariant subset is equivariant. -/ 40 def inclusion (s : InvariantSubset Γ X) : EquivariantMap Γ s X where 41 toFun := Subtype.val 42 continuous_toFun := continuous_subtype_val 43 map_smul' _ _ := rfl 44 45 /-- The map from the intrinsic orbit space to the ambient orbit space. -/ 46 def orbitInclusion (s : InvariantSubset Γ X) : 47 Quotient (MulAction.orbitRel Γ s) → Quotient (MulAction.orbitRel Γ X) := 48 Quotient.map Subtype.val (by 49 intro a b h 50 obtain ⟨g, hg⟩ := h 51 exact ⟨g, congrArg Subtype.val hg⟩) 52 53 omit [TopologicalSpace X] in 54 theorem orbitInclusion_injective (s : InvariantSubset Γ X) : 55 Function.Injective s.orbitInclusion := by 56 intro a b 57 induction a using Quotient.inductionOn with | _ a => 58 induction b using Quotient.inductionOn with | _ b => 59 intro h 60 apply Quotient.sound 61 obtain ⟨g, hg⟩ := Quotient.exact h 62 exact ⟨g, Subtype.ext hg⟩ 63 64 /-- An invariant subspace's intrinsic orbit topology is its ambient subspace topology. -/ 65 theorem orbitInclusion_isEmbedding (s : InvariantSubset Γ X) 66 [ContinuousConstSMul Γ X] : IsEmbedding s.orbitInclusion := by 67 apply isEmbedding_of_isOpenQuotientMap_of_isInducing 68 (Subtype.val : s → X) s.orbitInclusion 69 (Quotient.mk (MulAction.orbitRel Γ s)) (Quotient.mk (MulAction.orbitRel Γ X)) 70 rfl IsInducing.subtypeVal isQuotientMap_quot_mk 71 MulAction.isOpenQuotientMap_quotientMk s.orbitInclusion_injective 72 rintro x ⟨_, ⟨y, rfl⟩, h⟩ 73 obtain ⟨g, hg⟩ := Quotient.exact h.symm 74 exact ⟨⟨x, hg ▸ s.smul_mem g y.property⟩, rfl⟩ 75 76 omit [TopologicalSpace X] in 77 theorem range_orbitInclusion (s : InvariantSubset Γ X) : 78 Set.range s.orbitInclusion = Quotient.mk (MulAction.orbitRel Γ X) '' (s : Set X) := by 79 ext q 80 constructor 81 · rintro ⟨a, rfl⟩ 82 induction a using Quotient.inductionOn with | _ a => exact ⟨a, a.property, rfl⟩ 83 · rintro ⟨x, hx, rfl⟩ 84 exact ⟨Quotient.mk _ ⟨x, hx⟩, rfl⟩ 85 86 /-- Compactness in the ambient quotient is equivalent to compactness of the intrinsic quotient. -/ 87 theorem compactSpace_orbit_iff (s : InvariantSubset Γ X) [ContinuousConstSMul Γ X] : 88 CompactSpace (Quotient (MulAction.orbitRel Γ s)) ↔ 89 IsCompact (Quotient.mk (MulAction.orbitRel Γ X) '' (s : Set X)) := by 90 rw [← s.range_orbitInclusion, ← Set.image_univ, 91 ← s.orbitInclusion_isEmbedding.isCompact_iff, isCompact_univ_iff] 92 93 end InvariantSubset 94 95 /-- Closed invariant subsets with compact quotient, encoded through the ambient orbit space. -/ 96 structure CocompactPiece (Γ X : Type*) [Group Γ] [TopologicalSpace X] [MulAction Γ X] 97 extends InvariantSubset Γ X where 98 isClosed_carrier : IsClosed carrier 99 isCompact_image : IsCompact (Quotient.mk (MulAction.orbitRel Γ X) '' carrier) 100 101 namespace CocompactPiece 102 instance instSetLike : SetLike (CocompactPiece Γ X) X where 103 coe s := s.carrier 104 coe_injective := by rintro ⟨⟨s, hs⟩, hc, hk⟩ ⟨⟨t, ht⟩, hd, hl⟩ rfl; rfl 105 instance instPartialOrder : PartialOrder (CocompactPiece Γ X) := .ofSetLike _ _ 106 107 /-- The empty piece ensures that the indexing type is nonempty. -/ 108 def empty : CocompactPiece Γ X where 109 carrier := ∅ 110 smul_mem _ _ hx := False.elim hx 111 isClosed_carrier := isClosed_empty 112 isCompact_image := by simp 113 114 /-- Finite unions provide upper bounds in the cocompact indexing system. -/ 115 def union (s t : CocompactPiece Γ X) : CocompactPiece Γ X where 116 carrier := s.carrier ∪ t.carrier 117 smul_mem g _ hx := hx.elim (fun h => Or.inl (s.smul_mem g h)) 118 (fun h => Or.inr (t.smul_mem g h)) 119 isClosed_carrier := s.isClosed_carrier.union t.isClosed_carrier 120 isCompact_image := by 121 rw [Set.image_union] 122 exact s.isCompact_image.union t.isCompact_image 123 124 theorem le_union_left (s t : CocompactPiece Γ X) : s ≤ s.union t := Set.subset_union_left 125 theorem le_union_right (s t : CocompactPiece Γ X) : t ≤ s.union t := Set.subset_union_right 126 127 theorem directed : Directed (· ≤ · : CocompactPiece Γ X → CocompactPiece Γ X → Prop) 128 (fun s => s) := fun s t => ⟨s.union t, le_union_left s t, le_union_right s t⟩ 129 130 /-- Every piece has compact intrinsic orbit space. -/ 131 theorem compactSpace_orbit (s : CocompactPiece Γ X) [ContinuousConstSMul Γ X] : 132 CompactSpace (Quotient (MulAction.orbitRel Γ s.toInvariantSubset)) := 133 s.toInvariantSubset.compactSpace_orbit_iff.mpr s.isCompact_image 134 135 /-- Closed pieces of a locally compact ambient space are locally compact. -/ 136 theorem locallyCompact (s : CocompactPiece Γ X) [LocallyCompactSpace X] : 137 LocallyCompactSpace s.toInvariantSubset := s.isClosed_carrier.locallyCompactSpace 138 139 /-- Compact subsets generate closed cocompact invariant pieces in a proper space. -/ 140 def ofCompact [TopologicalSpace Γ] [ProperSMul Γ X] 141 (K : Set X) (hK : IsCompact K) : CocompactPiece Γ X where 142 carrier := Quotient.mk (MulAction.orbitRel Γ X) ⁻¹' 143 (Quotient.mk (MulAction.orbitRel Γ X) '' K) 144 smul_mem g x hx := by 145 change Quotient.mk (MulAction.orbitRel Γ X) (g • x) ∈ 146 Quotient.mk (MulAction.orbitRel Γ X) '' K 147 have he (x : X) : Quotient.mk (MulAction.orbitRel Γ X) (g • x) = 148 Quotient.mk (MulAction.orbitRel Γ X) x := Quotient.sound ⟨g, rfl⟩ 149 rw [he] 150 exact hx 151 isClosed_carrier := (hK.image (show Continuous (Quotient.mk (MulAction.orbitRel Γ X)) from continuous_quot_mk)).isClosed.preimage continuous_quot_mk 152 isCompact_image := by 153 rw [Set.image_preimage_eq _ Quotient.mk_surjective] 154 exact hK.image continuous_quot_mk 155 156 theorem subset_ofCompact [TopologicalSpace Γ] [ProperSMul Γ X] 157 (K : Set X) (hK : IsCompact K) : K ⊆ (ofCompact (Γ := Γ) K hK : Set X) := 158 fun x hx => ⟨x, hx, rfl⟩ 159 160 /-- Every point belongs to a closed cocompact invariant piece. -/ 161 theorem covers [TopologicalSpace Γ] [ProperSMul Γ X] (x : X) : 162 ∃ s : CocompactPiece Γ X, x ∈ s := 163 ⟨ofCompact {x} isCompact_singleton, 164 subset_ofCompact (Γ := Γ) {x} isCompact_singleton (Set.mem_singleton x)⟩ 165 166 end CocompactPiece 167 end BC4lean.ProperActions
源码 SHA-256:7a4d7fae773d6945ad76a48fab4d31571cec6692b319b41ad9c8199ed5001405
1 import BC4lean.ProperOrbitCells 2 import Mathlib.CategoryTheory.Functor.OfSequence 3 import Mathlib.Topology.CWComplex.Abstract.Basic 4 import Mathlib.CategoryTheory.Action.Limits 5 import Mathlib.CategoryTheory.Types.Monomorphisms 6 import Mathlib.Topology.TietzeExtension 7 import Mathlib.Topology.Category.TopCat.Limits.Products 8 import Mathlib.CategoryTheory.SmallObject.TransfiniteCompositionLifting 9 10 /-! # Equivariant cell attachments 11 12 This module realizes the orbit boundary inclusions in `Action TopCat Γ` 13 and specializes Mathlib's relative cell complex structure to them. The cells 14 have finite isotropy. Properness of arbitrary cellular colimits and the 15 universal proper-space existence and mapping theorems are separate results; 16 they are not fields or axioms of the definitions below. 17 -/ 18 19 open CategoryTheory CategoryTheory.Limits 20 21 namespace BC4lean.ProperActions 22 23 universe u v 24 25 /-- Bundle an action with continuous translations as an action in `TopCat`. -/ 26 def topologicalAction (Γ : Type u) (X : Type v) [Group Γ] [TopologicalSpace X] 27 [MulAction Γ X] [ContinuousConstSMul Γ X] : Action TopCat.{v} Γ where 28 V := TopCat.of X 29 ρ := 30 { toFun := fun g => TopCat.ofHom ⟨fun x => g • x, continuous_const_smul g⟩ 31 map_one' := by 32 apply TopCat.hom_ext 33 apply ContinuousMap.ext 34 intro x 35 exact one_smul Γ x 36 map_mul' := by 37 intro g h 38 apply TopCat.hom_ext 39 apply ContinuousMap.ext 40 intro x 41 exact mul_smul g h x } 42 43 namespace EquivariantMap 44 45 variable {Γ : Type u} {X Y Z : Type v} [Group Γ] 46 variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z] 47 variable [MulAction Γ X] [MulAction Γ Y] [MulAction Γ Z] 48 variable [ContinuousConstSMul Γ X] [ContinuousConstSMul Γ Y] [ContinuousConstSMul Γ Z] 49 50 /-- A bundled continuous equivariant map gives a morphism of topological actions. -/ 51 def toActionHom (f : EquivariantMap Γ X Y) : 52 topologicalAction Γ X ⟶ topologicalAction Γ Y where 53 hom := TopCat.ofHom f.toContinuousMap 54 comm g := by ext x; exact f.map_smul g x 55 56 @[simp] theorem toActionHom_apply (f : EquivariantMap Γ X Y) (x : X) : 57 f.toActionHom.hom x = f x := rfl 58 59 @[simp] theorem toActionHom_id : 60 (id (Γ := Γ) (X := X)).toActionHom = 𝟙 (topologicalAction Γ X) := rfl 61 62 @[simp] theorem toActionHom_comp (g : EquivariantMap Γ Y Z) (f : EquivariantMap Γ X Y) : 63 (g.comp f).toActionHom = f.toActionHom ≫ g.toActionHom := rfl 64 65 /-- Recover the pointwise equivariant-map API from a categorical morphism. -/ 66 def ofActionHom (f : topologicalAction Γ X ⟶ topologicalAction Γ Y) : 67 EquivariantMap Γ X Y where 68 toContinuousMap := f.hom.hom 69 map_smul' g x := congrArg (fun k : TopCat.of X ⟶ TopCat.of Y => k x) (f.comm g) 70 71 /-- The categorical and pointwise descriptions have exactly the same morphisms. -/ 72 def actionHomEquiv : 73 EquivariantMap Γ X Y ≃ (topologicalAction Γ X ⟶ topologicalAction Γ Y) where 74 toFun := toActionHom 75 invFun := ofActionHom 76 left_inv f := by ext x; rfl 77 right_inv f := by apply Action.Hom.ext; rfl 78 79 end EquivariantMap 80 81 variable {Γ : Type u} [Group Γ] [TopologicalSpace Γ] [DiscreteTopology Γ] 82 83 namespace OrbitCell 84 85 /-- Map the parameter of an orbit cell, leaving its coset coordinate unchanged. -/ 86 def map {D E : Type v} [TopologicalSpace D] [TopologicalSpace E] 87 (H : Subgroup Γ) (f : C(D, E)) : EquivariantMap Γ (OrbitCell H D) (OrbitCell H E) where 88 toFun p := (p.1, f p.2) 89 continuous_toFun := continuous_fst.prodMk (f.continuous.comp continuous_snd) 90 map_smul' _ _ := rfl 91 92 omit [DiscreteTopology Γ] in 93 @[simp] theorem map_apply {D E : Type v} [TopologicalSpace D] [TopologicalSpace E] 94 (H : Subgroup Γ) (f : C(D, E)) (p : OrbitCell H D) : 95 map H f p = (p.1, f p.2) := rfl 96 97 /-- The orbit boundary inclusion Γ/H × ∂Dⁿ → Γ/H × Dⁿ. -/ 98 noncomputable def boundaryInclusion (H : Subgroup Γ) (n : ℕ) : 99 EquivariantMap Γ (OrbitCell H (TopCat.diskBoundary.{u} n)) 100 (OrbitCell H (TopCat.disk.{u} n)) := 101 map H (TopCat.diskBoundaryInclusion n).hom 102 103 omit [DiscreteTopology Γ] in 104 /-- Orbit boundary inclusions are injective, including in dimension zero. -/ 105 theorem boundaryInclusion_injective (H : Subgroup Γ) (n : ℕ) : 106 Function.Injective (boundaryInclusion H n) := by 107 intro x y h 108 change (x.1, (TopCat.diskBoundaryInclusion n) x.2) = 109 (y.1, (TopCat.diskBoundaryInclusion n) y.2) at h 110 apply Prod.ext 111 · exact congrArg (fun p : (Γ ⧸ H) × TopCat.disk.{u} n => p.1) h 112 · exact (TopCat.mono_iff_injective (TopCat.diskBoundaryInclusion n)).mp 113 inferInstance (congrArg Prod.snd h) 114 115 /-- The disk orbit cell with finite isotropy is topologically proper. -/ 116 theorem disk_proper (H : Subgroup Γ) [Finite H] (n : ℕ) : 117 ProperSMul Γ (OrbitCell H (TopCat.disk.{u} n)) := by 118 let : T2Space (TopCat.disk.{u} n) := by 119 change T2Space (ULift (Metric.closedBall (0 : EuclideanSpace ℝ (Fin n)) 1)) 120 exact Homeomorph.ulift.{u, 0}.symm.t2Space 121 exact proper H _ 122 123 /-- The boundary orbit cell with finite isotropy is topologically proper. -/ 124 theorem boundary_proper (H : Subgroup Γ) [Finite H] (n : ℕ) : 125 ProperSMul Γ (OrbitCell H (TopCat.diskBoundary.{u} n)) := by 126 let : T2Space (TopCat.diskBoundary.{u} n) := by 127 change T2Space (ULift (Metric.sphere (0 : EuclideanSpace ℝ (Fin n)) 1)) 128 exact Homeomorph.ulift.{u, 0}.symm.t2Space 129 exact proper H _ 130 131 end OrbitCell 132 133 /-- Finite isotropy subgroups indexing the allowed orbit cells. -/ 134 def FiniteIsotropy (Γ : Type u) [Group Γ] := {H : Subgroup Γ // Finite H} 135 136 /-- Generating boundary maps, with dimension indexed by the skeletal stage. -/ 137 noncomputable def equivariantBasicCell (n : ℕ) (H : FiniteIsotropy Γ) : 138 topologicalAction Γ (OrbitCell H.val (TopCat.diskBoundary.{u} n)) ⟶ 139 topologicalAction Γ (OrbitCell H.val (TopCat.disk.{u} n)) := 140 (OrbitCell.boundaryInclusion H.val n).toActionHom 141 142 /-- Relative equivariant CW data, attaching n-dimensional finite-isotropy orbit 143 cells at stage n. This definition includes actual pushout and colimit witnesses. -/ 144 abbrev RelativeEquivariantCWComplex {X Y : Action TopCat.{u} Γ} (f : X ⟶ Y) := 145 HomotopicalAlgebra.RelativeCellComplex.{u} (equivariantBasicCell (Γ := Γ)) f 146 147 /-- An equivariant CW structure starting from the empty action. Finite isotropy 148 is imposed on the cell family, not assumed as a properness conclusion. -/ 149 abbrev EquivariantCWComplex (X : Action TopCat.{u} Γ) := 150 RelativeEquivariantCWComplex (initial.to X) 151 152 /-- Relative equivariant CW structures include an attachment at every finite stage. -/ 153 def RelativeEquivariantCWComplex.attachment {X Y : Action TopCat.{u} Γ} {f : X ⟶ Y} 154 (c : RelativeEquivariantCWComplex f) (n : ℕ) := 155 c.attachCells n (not_isMax n) 156 157 /-- Maps out of a cellular object are determined on the initial subspace and cells. -/ 158 theorem RelativeEquivariantCWComplex.hom_ext 159 {X Y Z : Action TopCat.{u} Γ} {f : X ⟶ Y} 160 (c : RelativeEquivariantCWComplex f) {φ ψ : Y ⟶ Z} 161 (h₀ : f ≫ φ = f ≫ ψ) 162 (h : ∀ γ : HomotopicalAlgebra.RelativeCellComplex.Cells c, γ.ι ≫ φ = γ.ι ≫ ψ) : 163 φ = ψ := 164 HomotopicalAlgebra.RelativeCellComplex.hom_ext c h₀ h 165 166 167 /-- Forget both topology and action, retaining the underlying set. -/ 168 abbrev underlyingAction : Action TopCat.{u} Γ ⥤ Type u := 169 Action.forget TopCat Γ ⋙ forget TopCat 170 171 private instance : PreservesWellOrderContinuousOfShape ℕ (underlyingAction (Γ := Γ)) where 172 173 private noncomputable def underlyingAttachment 174 {α : Type u} {A B : α → Action TopCat.{u} Γ} 175 {g : ∀ a, A a ⟶ B a} {X Y : Action TopCat.{u} Γ} {f : X ⟶ Y} 176 (c : HomotopicalAlgebra.AttachCells.{u} g f) : 177 HomotopicalAlgebra.AttachCells.{u} 178 (fun a => (underlyingAction (Γ := Γ)).map (g a)) 179 ((underlyingAction (Γ := Γ)).map f) where 180 ι := c.ι 181 π := c.π 182 cofan₁ := Cofan.mk _ (fun i => (underlyingAction (Γ := Γ)).map (c.cofan₁.inj i)) 183 cofan₂ := Cofan.mk _ (fun i => (underlyingAction (Γ := Γ)).map (c.cofan₂.inj i)) 184 isColimit₁ := isColimitCofanMkObjOfIsColimit _ _ _ c.isColimit₁ 185 isColimit₂ := isColimitCofanMkObjOfIsColimit _ _ _ c.isColimit₂ 186 m := (underlyingAction (Γ := Γ)).map c.m 187 hm i := by simpa only [Functor.map_comp, cofan_mk_inj] using congrArg ((underlyingAction (Γ := Γ)).map) (c.hm i) 188 g₁ := (underlyingAction (Γ := Γ)).map c.g₁ 189 g₂ := (underlyingAction (Γ := Γ)).map c.g₂ 190 isPushout := c.isPushout.map _ 191 192 /-- A finite-isotropy orbit-cell attachment never identifies pre-existing points. -/ 193 theorem orbitCellAttachment_injective 194 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} {n : ℕ} 195 (c : HomotopicalAlgebra.AttachCells.{u} (equivariantBasicCell (Γ := Γ) n) i) : 196 Function.Injective i.hom := by 197 let a := underlyingAttachment c 198 have hc : (MorphismProperty.monomorphisms (Type u)).coproducts.pushouts 199 ((underlyingAction (Γ := Γ)).map i) := by 200 apply MorphismProperty.pushouts_monotone 201 (MorphismProperty.coproducts_monotone (b := MorphismProperty.monomorphisms (Type u)) ?_) 202 _ a.pushouts_coproducts 203 intro X Y f hf 204 cases hf with 205 | mk H => 206 exact (CategoryTheory.mono_iff_injective _).mpr 207 (OrbitCell.boundaryInclusion_injective H.val n) 208 have hp : (MorphismProperty.monomorphisms (Type u)).coproducts.pushouts ≤ 209 (MorphismProperty.monomorphisms (Type u)).pushouts := 210 MorphismProperty.pushouts_monotone (MorphismProperty.monomorphisms (Type u)).coproducts_le 211 exact (CategoryTheory.mono_iff_injective _).mp 212 (MorphismProperty.pushouts_le _ (hp _ hc)) 213 214 private noncomputable def underlyingCellularSequence 215 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} 216 (c : RelativeEquivariantCWComplex i) : 217 (MorphismProperty.monomorphisms (Type u)).TransfiniteCompositionOfShape ℕ 218 ((underlyingAction (Γ := Γ)).map i) where 219 toTransfiniteCompositionOfShape := c.toTransfiniteCompositionOfShape.map underlyingAction 220 map_mem n _ := (CategoryTheory.mono_iff_injective _).mpr 221 (orbitCellAttachment_injective (c.attachment n)) 222 223 /-- The inclusion underlying any relative equivariant CW structure is injective. -/ 224 theorem RelativeEquivariantCWComplex.injective 225 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} 226 (c : RelativeEquivariantCWComplex i) : Function.Injective i.hom := by 227 exact (CategoryTheory.mono_iff_injective _).mp 228 ((MorphismProperty.monomorphisms (Type u)).transfiniteCompositionsOfShape_le ℕ _ 229 (underlyingCellularSequence c).mem) 230 231 /-- Every skeletal transition is injective, including non-adjacent stages. -/ 232 theorem RelativeEquivariantCWComplex.skeletonMap_injective 233 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} 234 (c : RelativeEquivariantCWComplex i) {m n : ℕ} (h : m ≤ n) : 235 Function.Injective (c.F.map (homOfLE h)).hom := by 236 exact (CategoryTheory.mono_iff_injective _).mp 237 ((underlyingCellularSequence c).mem_map (homOfLE h)) 238 239 /-- No points in a skeleton become identified in the final CW colimit. -/ 240 theorem RelativeEquivariantCWComplex.skeletonInclusion_injective 241 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} 242 (c : RelativeEquivariantCWComplex i) (n : ℕ) : 243 Function.Injective (c.incl.app n).hom := by 244 exact (CategoryTheory.mono_iff_injective _).mp 245 ((underlyingCellularSequence c).mem_incl_app n) 246 247 omit [DiscreteTopology Γ] in 248 /-- Orbit-cell boundaries are closed subspaces of the disks, even for infinite Γ/H. -/ 249 theorem OrbitCell.boundaryInclusion_isClosedEmbedding (H : Subgroup Γ) (n : ℕ) : 250 Topology.IsClosedEmbedding (boundaryInclusion H n) := by 251 let : T2Space (TopCat.disk.{u} n) := by 252 change T2Space (ULift (Metric.closedBall (0 : EuclideanSpace ℝ (Fin n)) 1)) 253 exact Homeomorph.ulift.{u, 0}.symm.t2Space 254 have hd : Topology.IsClosedEmbedding (TopCat.diskBoundaryInclusion.{u} n) := 255 (TopCat.diskBoundaryInclusion n).hom.continuous.isClosedEmbedding 256 ((TopCat.mono_iff_injective _).mp inferInstance) 257 exact Topology.IsClosedEmbedding.id.prodMap hd 258 259 /-- Every point of a relative CW colimit comes from a finite skeletal stage. -/ 260 theorem RelativeEquivariantCWComplex.exists_skeleton_preimage 261 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} 262 (c : RelativeEquivariantCWComplex i) (x : B.V) : 263 ∃ (n : ℕ) (y : (c.F.obj n).V), (c.incl.app n).hom y = x := by 264 exact Types.jointly_surjective_of_isColimit 265 (isColimitOfPreserves (underlyingAction (Γ := Γ)) c.isColimit) x 266 267 /-- The CW colimit topology detects open sets on all finite skeleta. -/ 268 theorem RelativeEquivariantCWComplex.isOpen_iff 269 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} 270 (c : RelativeEquivariantCWComplex i) (s : Set B.V) : 271 IsOpen s ↔ ∀ n : ℕ, IsOpen ((c.incl.app n).hom ⁻¹' s) := by 272 exact TopCat.isOpen_iff_of_isColimit _ 273 (isColimitOfPreserves (Action.forget TopCat Γ) c.isColimit) s 274 275 /-- The CW colimit topology detects closed sets on all finite skeleta. -/ 276 theorem RelativeEquivariantCWComplex.isClosed_iff 277 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} 278 (c : RelativeEquivariantCWComplex i) (s : Set B.V) : 279 IsClosed s ↔ ∀ n : ℕ, IsClosed ((c.incl.app n).hom ⁻¹' s) := by 280 exact TopCat.isClosed_iff_of_isColimit _ 281 (isColimitOfPreserves (Action.forget TopCat Γ) c.isColimit) s 282 283 /-- Continuity out of a relative CW colimit is tested on its finite skeleta. -/ 284 theorem RelativeEquivariantCWComplex.continuous_iff 285 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} 286 (c : RelativeEquivariantCWComplex i) {Z : Type v} [TopologicalSpace Z] (f : B.V → Z) : 287 Continuous f ↔ ∀ n : ℕ, Continuous (f ∘ (c.incl.app n).hom) := by 288 exact TopCat.continuous_iff_of_isColimit _ 289 (isColimitOfPreserves (Action.forget TopCat Γ) c.isColimit) f 290 291 end BC4lean.ProperActions 292 293 universe u 294 295 namespace BC4lean.ProperActions 296 297 /-- Closed embeddings are preserved by topological pushout. -/ 298 theorem pushout_isClosedEmbedding 299 {A B X Y : TopCat.{u}} {a : A ⟶ X} {m : A ⟶ B} {f : X ⟶ Y} {g : B ⟶ Y} 300 (sq : IsPushout a m f g) (hm : Topology.IsClosedEmbedding m) : 301 Topology.IsClosedEmbedding f := by 302 have sqt := sq.flip.map (forget TopCat) 303 have hinj : Function.Injective f := by 304 let : Mono ((forget TopCat).map m) := (mono_iff_injective _).mpr hm.injective 305 exact (mono_iff_injective _).mp 306 (Types.pushoutCocone_inr_mono_of_isColimit sqt.isColimit) 307 refine .of_continuous_injective_isClosedMap f.hom.continuous hinj ?_ 308 intro s hs 309 have he : g ⁻¹' (f '' s) = m '' (a ⁻¹' s) := by 310 ext b 311 constructor 312 · rintro ⟨x, hx, hxb⟩ 313 obtain ⟨z, hzb, hzx⟩ := 314 (Types.pushoutCocone_inl_eq_inr_iff_of_isColimit sqt.isColimit hm.injective b x).mp hxb.symm 315 change a z = x at hzx 316 exact ⟨z, by change a z ∈ s; rw [hzx]; exact hx, hzb⟩ 317 · rintro ⟨z, hz, rfl⟩ 318 exact ⟨a z, hz, ConcreteCategory.congr_hom sq.w z⟩ 319 apply (TopCat.isClosed_iff_of_isColimit _ sq.isColimit (f '' s)).mpr 320 intro j 321 rcases j with _ | (_ | _) 322 · change IsClosed ((a ≫ f) ⁻¹' (f '' s)) 323 simpa only [TopCat.coe_comp, Set.preimage_comp, hinj.preimage_image] using 324 hs.preimage a.hom.continuous 325 · change IsClosed (f ⁻¹' (f '' s)) 326 simpa only [hinj.preimage_image] using hs 327 · change IsClosed (g ⁻¹' (f '' s)) 328 rw [he] 329 exact hm.isClosedMap _ (hs.preimage a.hom.continuous) 330 331 end BC4lean.ProperActions 332 333 namespace BC4lean.ProperActions 334 335 /-- A coproduct of closed embeddings is a closed embedding. -/ 336 theorem coproduct_isClosedEmbedding 337 {ι : Type u} {A B : ι → TopCat.{u}} {c₁ : Cofan A} {c₂ : Cofan B} 338 (hc₁ : IsColimit c₁) (hc₂ : IsColimit c₂) 339 (f : ∀ j, A j ⟶ B j) (hf : ∀ j, Topology.IsClosedEmbedding (f j)) 340 (m : c₁.pt ⟶ c₂.pt) (hm : ∀ j, c₁.inj j ≫ m = f j ≫ c₂.inj j) : 341 Topology.IsClosedEmbedding m := by 342 let d₁ : Cofan (fun j => (forget TopCat).obj (A j)) := 343 Cofan.mk _ (fun j => (forget TopCat).map (c₁.inj j)) 344 let d₂ : Cofan (fun j => (forget TopCat).obj (B j)) := 345 Cofan.mk _ (fun j => (forget TopCat).map (c₂.inj j)) 346 have hd₁ : IsColimit d₁ := isColimitCofanMkObjOfIsColimit _ _ _ hc₁ 347 have hd₂ : IsColimit d₂ := isColimitCofanMkObjOfIsColimit _ _ _ hc₂ 348 have hm' (j : ι) (x : A j) : m (c₁.inj j x) = c₂.inj j (f j x) := 349 ConcreteCategory.congr_hom (hm j) x 350 have hinj : Function.Injective m := by 351 intro x y hxy 352 obtain ⟨j, z, rfl⟩ := Cofan.inj_jointly_surjective_of_isColimit hd₁ x 353 obtain ⟨k, w, rfl⟩ := Cofan.inj_jointly_surjective_of_isColimit hd₁ y 354 change m (c₁.inj j z) = m (c₁.inj k w) at hxy 355 rw [hm', hm'] at hxy 356 obtain rfl := Cofan.eq_of_inj_apply_eq_of_isColimit hd₂ _ _ hxy 357 have h := Cofan.inj_injective_of_isColimit hd₂ j hxy 358 exact congrArg (c₁.inj j) ((hf j).injective h) 359 refine .of_continuous_injective_isClosedMap m.hom.continuous hinj ?_ 360 intro s hs 361 apply (TopCat.isClosed_iff_of_isColimit _ hc₂ (m '' s)).mpr 362 rintro ⟨j⟩ 363 have he : c₂.inj j ⁻¹' (m '' s) = f j '' (c₁.inj j ⁻¹' s) := by 364 ext y 365 constructor 366 · rintro ⟨x, hx, hxy⟩ 367 obtain ⟨k, z, rfl⟩ := Cofan.inj_jointly_surjective_of_isColimit hd₁ x 368 change m (c₁.inj k z) = c₂.inj j y at hxy 369 rw [hm'] at hxy 370 obtain rfl := Cofan.eq_of_inj_apply_eq_of_isColimit hd₂ _ _ hxy 371 exact ⟨z, hx, Cofan.inj_injective_of_isColimit hd₂ k hxy⟩ 372 · rintro ⟨x, hx, rfl⟩ 373 exact ⟨c₁.inj j x, hx, hm' j x⟩ 374 change IsClosed (c₂.inj j ⁻¹' (m '' s)) 375 rw [he] 376 exact (hf j).isClosedMap _ (hs.preimage (c₁.inj j).hom.continuous) 377 378 end BC4lean.ProperActions 379 380 namespace BC4lean.ProperActions 381 variable {Γ : Type u} [Group Γ] [TopologicalSpace Γ] [DiscreteTopology Γ] 382 383 /-- An orbit-cell attachment includes the previous stage as a closed subspace. -/ 384 theorem orbitCellAttachment_isClosedEmbedding 385 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} {n : ℕ} 386 (c : HomotopicalAlgebra.AttachCells.{u} (equivariantBasicCell (Γ := Γ) n) i) : 387 Topology.IsClosedEmbedding i.hom := by 388 apply pushout_isClosedEmbedding (c.isPushout.map (Action.forget TopCat Γ)) 389 let d₁ : Cofan (fun j => (topologicalAction Γ 390 (OrbitCell (c.π j).val (TopCat.diskBoundary.{u} n))).V) := 391 Cofan.mk c.cofan₁.pt.V (fun j => (c.cofan₁.inj j).hom) 392 let d₂ : Cofan (fun j => (topologicalAction Γ 393 (OrbitCell (c.π j).val (TopCat.disk.{u} n))).V) := 394 Cofan.mk c.cofan₂.pt.V (fun j => (c.cofan₂.inj j).hom) 395 have hd₁ : IsColimit d₁ := isColimitCofanMkObjOfIsColimit (Action.forget TopCat Γ) _ _ c.isColimit₁ 396 have hd₂ : IsColimit d₂ := isColimitCofanMkObjOfIsColimit (Action.forget TopCat Γ) _ _ c.isColimit₂ 397 apply coproduct_isClosedEmbedding hd₁ hd₂ 398 (fun j => (equivariantBasicCell n (c.π j)).hom) 399 (fun j => OrbitCell.boundaryInclusion_isClosedEmbedding (c.π j).val n) c.m.hom 400 intro j 401 simpa only [d₁, d₂, cofan_mk_inj, Action.comp_hom] using congrArg Action.Hom.hom (c.hm j) 402 403 set_option backward.isDefEq.respectTransparency false in 404 /-- All finite skeletal transitions are closed embeddings. -/ 405 theorem RelativeEquivariantCWComplex.skeletonMap_isClosedEmbedding 406 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} 407 (c : RelativeEquivariantCWComplex i) {m n : ℕ} (h : m ≤ n) : 408 Topology.IsClosedEmbedding (c.F.map (homOfLE h)).hom := by 409 induction n, h using Nat.le_induction with 410 | base => simpa using (Topology.IsClosedEmbedding.id (X := (c.F.obj m).V)) 411 | succ n h ih => 412 have hn : Topology.IsClosedEmbedding (c.F.map (homOfLE (Nat.le_succ n))).hom := by 413 exact orbitCellAttachment_isClosedEmbedding (c.attachment n) 414 have he := hn.comp ih 415 have heq : (c.F.map (homOfLE (Nat.le_succ n))).hom ∘ 416 (c.F.map (homOfLE h)).hom = 417 (c.F.map (homOfLE (Nat.le.step h))).hom := by 418 funext x 419 exact (ConcreteCategory.congr_hom 420 (congrArg Action.Hom.hom (c.F.map_comp (homOfLE h) (homOfLE (Nat.le_succ n)))) x).symm 421 rw [heq] at he 422 exact he 423 424 /-- Each finite skeleton embeds as a closed subspace of the final CW colimit. -/ 425 theorem RelativeEquivariantCWComplex.skeletonInclusion_isClosedEmbedding 426 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} 427 (c : RelativeEquivariantCWComplex i) (n : ℕ) : 428 Topology.IsClosedEmbedding (c.incl.app n).hom := by 429 have hn := c.skeletonInclusion_injective n 430 refine .of_continuous_injective_isClosedMap (c.incl.app n).hom.hom.continuous hn ?_ 431 intro s hs 432 apply (c.isClosed_iff _).mpr 433 intro m 434 have hnat {j k : ℕ} (h : j ≤ k) (x : (c.F.obj j).V) : 435 (c.incl.app k).hom ((c.F.map (homOfLE h)).hom x) = (c.incl.app j).hom x := by 436 exact ConcreteCategory.congr_hom (congrArg Action.Hom.hom (c.incl.naturality (homOfLE h))) x 437 rcases le_total m n with h | h 438 · have he : (c.incl.app m).hom ⁻¹' ((c.incl.app n).hom '' s) = 439 (c.F.map (homOfLE h)).hom ⁻¹' s := by 440 ext x 441 constructor 442 · rintro ⟨y, hy, hxy⟩ 443 have heq := hn (hxy.trans (hnat h x).symm) 444 change (c.F.map (homOfLE h)).hom x ∈ s 445 rw [← heq] 446 exact hy 447 · intro hx 448 exact ⟨_, hx, hnat h x⟩ 449 rw [he] 450 exact hs.preimage (c.F.map (homOfLE h)).hom.hom.continuous 451 · have he : (c.incl.app m).hom ⁻¹' ((c.incl.app n).hom '' s) = 452 (c.F.map (homOfLE h)).hom '' s := by 453 ext x 454 constructor 455 · rintro ⟨y, hy, hxy⟩ 456 exact ⟨y, hy, (c.skeletonInclusion_injective m) ((hnat h y).trans hxy)⟩ 457 · rintro ⟨y, hy, rfl⟩ 458 exact ⟨y, hy, (hnat h y).symm⟩ 459 rw [he] 460 exact (c.skeletonMap_isClosedEmbedding h).isClosedMap s hs 461 462 463 /-- The initial subspace of a relative equivariant CW complex is closed embedded. -/ 464 theorem RelativeEquivariantCWComplex.isClosedEmbedding 465 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} 466 (c : RelativeEquivariantCWComplex i) : Topology.IsClosedEmbedding i.hom := by 467 have h := (c.skeletonInclusion_isClosedEmbedding 0).comp 468 (TopCat.homeoOfIso ((Action.forget TopCat Γ).mapIso c.isoBot.symm)).isClosedEmbedding 469 change Topology.IsClosedEmbedding ((c.incl.app 0).hom ∘ c.isoBot.inv.hom) at h 470 have hf := congrArg Action.Hom.hom c.fac 471 change c.isoBot.inv.hom ≫ (c.incl.app 0).hom = i.hom at hf 472 change Topology.IsClosedEmbedding (c.isoBot.inv.hom ≫ (c.incl.app 0).hom) at h 473 rwa [hf] at h 474 475 end BC4lean.ProperActions 476 477 open CategoryTheory CategoryTheory.Limits 478 open scoped Topology 479 universe v 480 namespace BC4lean.ProperActions 481 482 /-- Continuous real functions separate distinct points. -/ 483 def RealSeparatesPoints (X : Type*) [TopologicalSpace X] : Prop := 484 ∀ x y : X, x ≠ y → ∃ f : C(X, ℝ), f x ≠ f y 485 486 theorem RealSeparatesPoints.t2Space {X : Type*} [TopologicalSpace X] 487 (h : RealSeparatesPoints X) : T2Space X := by 488 constructor 489 intro x y hxy 490 obtain ⟨f, hf⟩ := h x y hxy 491 exact separated_by_continuous f.continuous hf 492 493 /-- Normality of a disjoint union follows componentwise. -/ 494 theorem normalSpace_sigma {ι : Type*} {X : ι → Type*} 495 [∀ i, TopologicalSpace (X i)] [∀ i, NormalSpace (X i)] : NormalSpace (Σ i, X i) := by 496 classical 497 constructor 498 intro s t hs ht hd 499 have hi (i : ι) := normal_separation 500 (hs.preimage (continuous_sigmaMk (i := i))) 501 (ht.preimage (continuous_sigmaMk (i := i))) (hd.preimage (Sigma.mk i)) 502 choose U V hU hV hsU htV hUV using hi 503 refine ⟨{x | x.2 ∈ U x.1}, {x | x.2 ∈ V x.1}, ?_, ?_, ?_, ?_, ?_⟩ 504 · exact isOpen_sigma_iff.mpr hU 505 · exact isOpen_sigma_iff.mpr hV 506 · rintro ⟨i,x⟩ hx; exact hsU i hx 507 · rintro ⟨i,x⟩ hx; exact htV i hx 508 · exact Set.disjoint_left.mpr (fun ⟨i,x⟩ hx hy => Set.disjoint_left.mp (hUV i) hx hy) 509 510 set_option backward.isDefEq.respectTransparency false in 511 /-- A discrete family of copies of a normal space is normal. -/ 512 theorem normalSpace_discrete_prod {D X : Type*} [TopologicalSpace D] [DiscreteTopology D] 513 [TopologicalSpace X] [NormalSpace X] : NormalSpace (D × X) := by 514 let e : (Σ _ : D, X) ≃ₜ D × X := 515 { toFun := fun p => (p.1,p.2) 516 invFun := fun p => ⟨p.1,p.2⟩ 517 left_inv := fun _ => rfl 518 right_inv := fun _ => rfl 519 continuous_toFun := continuous_sigma (fun _ => continuous_const.prodMk continuous_id) 520 continuous_invFun := by 521 apply continuous_prod_of_discrete_left.mpr 522 intro d 523 change Continuous (fun x : X => (⟨d,x⟩ : Σ _ : D, X)) 524 exact @continuous_sigmaMk D (fun _ : D => X) (fun _ => inferInstance) d } 525 let := normalSpace_sigma (X := fun _ : D => X) 526 exact e.normalSpace 527 528 /-- Glue real-valued functions across a topological pushout. -/ 529 theorem pushout_glue_real 530 {A B X Y : TopCat.{u}} {a : A ⟶ X} {m : A ⟶ B} {f : X ⟶ Y} {g : B ⟶ Y} 531 (sq : IsPushout a m f g) (p : C(X, ℝ)) (q : C(B, ℝ)) 532 (h : ∀ z, p (a z) = q (m z)) : 533 ∃ F : C(Y, ℝ), (∀ x, F (f x) = p x) ∧ ∀ b, F (g b) = q b := by 534 let P : X ⟶ TopCat.of (ULift.{u} ℝ) := TopCat.ofHom ⟨fun x => ⟨p x⟩, continuous_uliftUp.comp p.continuous⟩ 535 let Q : B ⟶ TopCat.of (ULift.{u} ℝ) := TopCat.ofHom ⟨fun x => ⟨q x⟩, continuous_uliftUp.comp q.continuous⟩ 536 have hh : a ≫ P = m ≫ Q := by ext x; exact h x 537 let F := sq.desc P Q hh 538 refine ⟨⟨fun y => (F y).down, continuous_uliftDown.comp F.hom.continuous⟩, ?_, ?_⟩ 539 · intro x 540 exact congrArg ULift.down (ConcreteCategory.congr_hom (sq.inl_desc P Q hh) x) 541 · intro x 542 exact congrArg ULift.down (ConcreteCategory.congr_hom (sq.inr_desc P Q hh) x) 543 544 /-- A real-valued function extends across attachment along a closed embedding into a normal space. -/ 545 theorem pushout_extend_real 546 {A B X Y : TopCat.{u}} [NormalSpace B] 547 {a : A ⟶ X} {m : A ⟶ B} {f : X ⟶ Y} {g : B ⟶ Y} 548 (sq : IsPushout a m f g) (hm : Topology.IsClosedEmbedding m) (p : C(X, ℝ)) : 549 ∃ F : C(Y, ℝ), ∀ x, F (f x) = p x := by 550 obtain ⟨q, hq⟩ := (p.comp a.hom).exists_extension' hm 551 obtain ⟨F, hF, _⟩ := pushout_glue_real sq p q (fun z => (congrFun hq z).symm) 552 exact ⟨F, hF⟩ 553 554 /-- Normal attached spaces preserve separation by real-valued functions. -/ 555 theorem pushout_realSeparatesPoints 556 {A B X Y : TopCat.{u}} [NormalSpace B] [T1Space B] 557 {a : A ⟶ X} {m : A ⟶ B} {f : X ⟶ Y} {g : B ⟶ Y} 558 (sq : IsPushout a m f g) (hm : Topology.IsClosedEmbedding m) 559 (hX : RealSeparatesPoints X) : RealSeparatesPoints Y := by 560 intro x y hxy 561 have repr : ∀ z : Y, (∃ w : X, f w = z) ∨ ∃ b : B, g b = z ∧ b ∉ Set.range m := 562 Types.eq_or_eq_of_isPushout' (sq.map (forget TopCat)) 563 have new_sep (b : B) (hb : b ∉ Set.range m) (z : Y) (hbz : g b ≠ z) : 564 ∃ F : C(Y, ℝ), F (g b) ≠ F z := by 565 obtain ⟨w, rfl⟩ | ⟨b', rfl, _⟩ := repr z 566 · obtain ⟨q, hq0, hq1, _⟩ := exists_continuous_zero_one_of_isClosed 567 hm.isClosed_range (isClosed_singleton (x := b)) (Set.disjoint_singleton_right.mpr hb) 568 obtain ⟨F, hF, hG⟩ := pushout_glue_real sq (ContinuousMap.const _ 0) q 569 (fun t => (hq0 ⟨t, rfl⟩).symm) 570 refine ⟨F, ?_⟩ 571 rw [hG, hF, hq1 (Set.mem_singleton b)] 572 norm_num 573 · have hbb : b ≠ b' := fun h => hbz (congrArg g h) 574 have hd : Disjoint (Set.range m ∪ {b'}) {b} := by 575 apply Set.disjoint_singleton_right.mpr 576 simpa only [Set.mem_union, Set.mem_singleton_iff, not_or] using And.intro hb hbb 577 obtain ⟨q, hq0, hq1, _⟩ := exists_continuous_zero_one_of_isClosed 578 (hm.isClosed_range.union isClosed_singleton) isClosed_singleton hd 579 obtain ⟨F, _, hG⟩ := pushout_glue_real sq (ContinuousMap.const _ 0) q 580 (fun t => (hq0 (Or.inl ⟨t, rfl⟩)).symm) 581 refine ⟨F, ?_⟩ 582 rw [hG, hG, hq1 (Set.mem_singleton b), hq0 (Or.inr (Set.mem_singleton b'))] 583 norm_num 584 obtain ⟨x', rfl⟩ | ⟨b, rfl, hb⟩ := repr x 585 · obtain ⟨y', rfl⟩ | ⟨b, rfl, hb⟩ := repr y 586 · obtain ⟨p, hp⟩ := hX x' y' (fun h => hxy (congrArg f h)) 587 obtain ⟨F, hF⟩ := pushout_extend_real sq hm p 588 exact ⟨F, by simpa only [hF] using hp⟩ 589 · obtain ⟨F, hF⟩ := new_sep b hb _ (Ne.symm hxy) 590 exact ⟨F, Ne.symm hF⟩ 591 · exact new_sep b hb y hxy 592 593 end BC4lean.ProperActions 594 595 namespace BC4lean.ProperActions 596 597 private theorem cofan_normal {ι : Type u} {A : ι → TopCat.{u}} 598 (c : Cofan A) (hc : IsColimit c) [∀ j, NormalSpace (A j)] : NormalSpace c.pt := by 599 let : NormalSpace (TopCat.sigmaCofan A).pt := by 600 change NormalSpace (Σ j, A j) 601 exact normalSpace_sigma 602 exact (TopCat.homeoOfIso (hc.coconePointUniqueUpToIso (TopCat.sigmaCofanIsColimit A))).symm.normalSpace 603 604 private theorem cofan_t2 {ι : Type u} {A : ι → TopCat.{u}} 605 (c : Cofan A) (hc : IsColimit c) [∀ j, T2Space (A j)] : T2Space c.pt := by 606 let : T2Space (TopCat.sigmaCofan A).pt := by 607 change T2Space (Σ j, A j) 608 infer_instance 609 exact (TopCat.homeoOfIso (hc.coconePointUniqueUpToIso (TopCat.sigmaCofanIsColimit A))).symm.t2Space 610 611 variable {Γ : Type u} [Group Γ] [TopologicalSpace Γ] [DiscreteTopology Γ] 612 613 private theorem orbitAttachment_topology 614 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} {n : ℕ} 615 (c : HomotopicalAlgebra.AttachCells.{u} (equivariantBasicCell (Γ := Γ) n) i) : 616 Topology.IsClosedEmbedding c.m.hom ∧ NormalSpace c.cofan₂.pt.V ∧ T2Space c.cofan₂.pt.V := by 617 let d₁ : Cofan (fun j => (topologicalAction Γ 618 (OrbitCell (c.π j).val (TopCat.diskBoundary.{u} n))).V) := 619 Cofan.mk c.cofan₁.pt.V (fun j => (c.cofan₁.inj j).hom) 620 let d₂ : Cofan (fun j => (topologicalAction Γ 621 (OrbitCell (c.π j).val (TopCat.disk.{u} n))).V) := 622 Cofan.mk c.cofan₂.pt.V (fun j => (c.cofan₂.inj j).hom) 623 have hd₁ : IsColimit d₁ := isColimitCofanMkObjOfIsColimit (Action.forget TopCat Γ) _ _ c.isColimit₁ 624 have hd₂ : IsColimit d₂ := isColimitCofanMkObjOfIsColimit (Action.forget TopCat Γ) _ _ c.isColimit₂ 625 have hm : Topology.IsClosedEmbedding c.m.hom := by 626 apply coproduct_isClosedEmbedding hd₁ hd₂ 627 (fun j => (equivariantBasicCell n (c.π j)).hom) 628 (fun j => OrbitCell.boundaryInclusion_isClosedEmbedding (c.π j).val n) c.m.hom 629 intro j 630 simpa only [d₁, d₂, cofan_mk_inj, Action.comp_hom] using congrArg Action.Hom.hom (c.hm j) 631 let : T2Space (TopCat.disk.{u} n) := by 632 change T2Space (ULift (Metric.closedBall (0 : EuclideanSpace ℝ (Fin n)) 1)) 633 exact Homeomorph.ulift.{u,0}.symm.t2Space 634 let : NormalSpace (TopCat.disk.{u} n) := inferInstance 635 let hnormal (j : c.ι) : NormalSpace ((topologicalAction Γ (OrbitCell (c.π j).val (TopCat.disk.{u} n))).V) := by 636 let : DiscreteTopology (Γ ⧸ (c.π j).val) := QuotientGroup.discreteTopology (isOpen_discrete _) 637 exact normalSpace_discrete_prod 638 let ht2 (j : c.ι) : T2Space ((topologicalAction Γ (OrbitCell (c.π j).val (TopCat.disk.{u} n))).V) := 639 inferInstanceAs (T2Space (OrbitCell (c.π j).val (TopCat.disk.{u} n))) 640 exact ⟨hm, cofan_normal d₂ hd₂, cofan_t2 d₂ hd₂⟩ 641 642 /-- Continuous real-valued functions extend over any orbit-cell attachment. -/ 643 theorem orbitCellAttachment_extend_real 644 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} {n : ℕ} 645 (c : HomotopicalAlgebra.AttachCells.{u} (equivariantBasicCell (Γ := Γ) n) i) 646 (p : C(A.V, ℝ)) : ∃ F : C(B.V, ℝ), ∀ x, F (i.hom x) = p x := by 647 obtain ⟨hm, hnormal, _⟩ := orbitAttachment_topology c 648 let : NormalSpace ((Action.forget TopCat Γ).obj c.cofan₂.pt) := hnormal 649 exact pushout_extend_real (c.isPushout.map (Action.forget TopCat Γ)) hm p 650 651 /-- Separation by real-valued functions survives an orbit-cell attachment. -/ 652 theorem orbitCellAttachment_realSeparatesPoints 653 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} {n : ℕ} 654 (c : HomotopicalAlgebra.AttachCells.{u} (equivariantBasicCell (Γ := Γ) n) i) 655 (h : RealSeparatesPoints A.V) : RealSeparatesPoints B.V := by 656 obtain ⟨hm, hnormal, ht2⟩ := orbitAttachment_topology c 657 let : NormalSpace ((Action.forget TopCat Γ).obj c.cofan₂.pt) := hnormal 658 let : T2Space ((Action.forget TopCat Γ).obj c.cofan₂.pt) := ht2 659 exact pushout_realSeparatesPoints (c.isPushout.map (Action.forget TopCat Γ)) hm h 660 661 private theorem realTerminal_lifting {A B : TopCat.{u}} {i : A ⟶ B} 662 (h : ∀ p : C(A, ℝ), ∃ F : C(B, ℝ), ∀ x, F (i x) = p x) : 663 HasLiftingProperty i (terminal.from (TopCat.of (ULift.{u} ℝ))) := by 664 constructor 665 intro a b _ 666 let p : C(A, ℝ) := ⟨fun x => (a x).down, continuous_uliftDown.comp a.hom.continuous⟩ 667 obtain ⟨F, hF⟩ := h p 668 let L : B ⟶ TopCat.of (ULift.{u} ℝ) := 669 TopCat.ofHom ⟨fun x => ⟨F x⟩, continuous_uliftUp.comp F.continuous⟩ 670 refine ⟨⟨{ l := L, fac_left := ?_, fac_right := terminalIsTerminal.hom_ext _ _ }⟩⟩ 671 ext x 672 exact hF x 673 674 private instance : PreservesWellOrderContinuousOfShape ℕ (Action.forget TopCat.{u} Γ) where 675 676 private noncomputable def realExtensionSequence 677 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} (c : RelativeEquivariantCWComplex i) : 678 (MorphismProperty.ofHoms (fun _ : Unit => terminal.from (TopCat.of (ULift.{u} ℝ)))).llp.TransfiniteCompositionOfShape 679 ℕ i.hom where 680 toTransfiniteCompositionOfShape := c.toTransfiniteCompositionOfShape.map (Action.forget TopCat Γ) 681 map_mem n _ := by 682 intro X Y q hq 683 cases hq with 684 | mk z => exact realTerminal_lifting (orbitCellAttachment_extend_real (c.attachment n)) 685 686 /-- A continuous real function on any skeleton extends to the entire relative CW complex. -/ 687 theorem RelativeEquivariantCWComplex.skeleton_extend_real 688 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} (c : RelativeEquivariantCWComplex i) 689 (n : ℕ) (p : C((c.F.obj n).V, ℝ)) : 690 ∃ F : C(B.V, ℝ), ∀ x, F ((c.incl.app n).hom x) = p x := by 691 have hl := (realExtensionSequence c).mem_incl_app n 692 have : HasLiftingProperty (c.incl.app n).hom (terminal.from (TopCat.of (ULift.{u} ℝ))) := 693 hl _ (MorphismProperty.ofHoms.mk ()) 694 let P : (c.F.obj n).V ⟶ TopCat.of (ULift.{u} ℝ) := 695 TopCat.ofHom ⟨fun x => ⟨p x⟩, continuous_uliftUp.comp p.continuous⟩ 696 let sq : CommSq P (c.incl.app n).hom (terminal.from _) (terminal.from B.V) := 697 ⟨terminalIsTerminal.hom_ext _ _⟩ 698 refine ⟨⟨fun x => (sq.lift x).down, continuous_uliftDown.comp sq.lift.hom.continuous⟩, ?_⟩ 699 intro x 700 exact congrArg ULift.down (ConcreteCategory.congr_hom sq.fac_left x) 701 702 end BC4lean.ProperActions 703 704 namespace BC4lean.ProperActions 705 706 /-- An injective continuous map pulls back point-separating real functions. -/ 707 theorem RealSeparatesPoints.of_injective_continuous 708 {X Y : Type*} [TopologicalSpace X] [TopologicalSpace Y] 709 (h : RealSeparatesPoints Y) {f : X → Y} (hi : Function.Injective f) (hc : Continuous f) : 710 RealSeparatesPoints X := by 711 intro x y hxy 712 obtain ⟨p, hp⟩ := h (f x) (f y) (hi.ne hxy) 713 exact ⟨p.comp ⟨f, hc⟩, hp⟩ 714 715 variable {Γ : Type u} [Group Γ] [TopologicalSpace Γ] [DiscreteTopology Γ] 716 717 set_option backward.isDefEq.respectTransparency false in 718 /-- Each skeleton inherits point separation from the initial subspace. -/ 719 theorem RelativeEquivariantCWComplex.skeleton_realSeparatesPoints 720 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} (c : RelativeEquivariantCWComplex i) 721 (hA : RealSeparatesPoints A.V) (n : ℕ) : RealSeparatesPoints (c.F.obj n).V := by 722 induction n with 723 | zero => 724 let e := TopCat.homeoOfIso ((Action.forget TopCat Γ).mapIso c.isoBot) 725 exact hA.of_injective_continuous e.injective e.continuous 726 | succ n hn => exact orbitCellAttachment_realSeparatesPoints (c.attachment n) hn 727 728 /-- Point-separating real functions on the skeleta extend to the final relative CW space. -/ 729 theorem RelativeEquivariantCWComplex.realSeparatesPoints 730 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} (c : RelativeEquivariantCWComplex i) 731 (hA : RealSeparatesPoints A.V) : RealSeparatesPoints B.V := by 732 intro x y hxy 733 obtain ⟨m, xm, hxm⟩ := c.exists_skeleton_preimage x 734 obtain ⟨n, yn, hyn⟩ := c.exists_skeleton_preimage y 735 let k := max m n 736 let xk := (c.F.map (homOfLE (le_max_left m n))).hom xm 737 let yk := (c.F.map (homOfLE (le_max_right m n))).hom yn 738 have hx : (c.incl.app k).hom xk = x := by 739 have h := ConcreteCategory.congr_hom 740 (congrArg Action.Hom.hom (c.incl.naturality (homOfLE (le_max_left m n)))) xm 741 exact h.trans hxm 742 have hy : (c.incl.app k).hom yk = y := by 743 have h := ConcreteCategory.congr_hom 744 (congrArg Action.Hom.hom (c.incl.naturality (homOfLE (le_max_right m n)))) yn 745 exact h.trans hyn 746 have hne : xk ≠ yk := fun h => hxy (hx.symm.trans ((congrArg (c.incl.app k).hom h).trans hy)) 747 obtain ⟨p, hp⟩ := c.skeleton_realSeparatesPoints hA k xk yk hne 748 obtain ⟨F, hF⟩ := c.skeleton_extend_real k p 749 refine ⟨F, ?_⟩ 750 rw [← hx, ← hy, hF, hF] 751 exact hp 752 753 /-- Absolute equivariant CW spaces have enough continuous real functions to separate points. -/ 754 theorem EquivariantCWComplex.realSeparatesPoints 755 {A : Action TopCat.{u} Γ} (c : EquivariantCWComplex A) : RealSeparatesPoints A.V := by 756 apply RelativeEquivariantCWComplex.realSeparatesPoints c 757 have hinit := initialIsInitial.isInitialObj (underlyingAction (Γ := Γ)) 758 let : IsEmpty ((⊥_ (Action TopCat.{u} Γ)).V) := 759 (Types.initial_iff_empty _).mp ⟨hinit⟩ 760 intro x 761 exact isEmptyElim x 762 763 /-- Hausdorffness follows from the categorical equivariant CW data, without an extra premise. -/ 764 theorem EquivariantCWComplex.t2Space 765 {A : Action TopCat.{u} Γ} (c : EquivariantCWComplex A) : T2Space A.V := 766 c.realSeparatesPoints.t2Space 767 768 end BC4lean.ProperActions 769 770 noncomputable section 771 set_option backward.isDefEq.respectTransparency false 772 open CategoryTheory CategoryTheory.Limits 773 774 namespace BC4lean.ProperActions 775 variable {Γ : Type u} [Group Γ] [TopologicalSpace Γ] [DiscreteTopology Γ] 776 777 private def emptyCofan {C : Type*} [Category C] [HasInitial C] (F : PEmpty.{u+1} → C) : 778 Cofan F := Cofan.mk (⊥_ C) (fun j => j.elim) 779 780 private def emptyCofanColimit {C : Type*} [Category C] [HasInitial C] (F : PEmpty.{u+1} → C) : 781 IsColimit (emptyCofan F) := 782 Cofan.IsColimit.mk _ (fun s => initial.to s.pt) (fun _ j => j.elim) 783 (fun _ _ _ => initialIsInitial.hom_ext _ _) 784 785 /-- Attaching no cells realizes the identity, in any dimension. -/ 786 def identityCellAttachment (X : Action TopCat.{u} Γ) (n : ℕ) : 787 HomotopicalAlgebra.AttachCells.{u} (equivariantBasicCell (Γ := Γ) n) (𝟙 X) where 788 ι := PEmpty 789 π := PEmpty.elim 790 cofan₁ := emptyCofan _ 791 cofan₂ := emptyCofan _ 792 isColimit₁ := emptyCofanColimit _ 793 isColimit₂ := emptyCofanColimit _ 794 m := 𝟙 _ 795 hm j := j.elim 796 g₁ := initial.to X 797 g₂ := initial.to X 798 isPushout := IsPushout.of_id_snd 799 800 private abbrev zeroSkeletonObj (X : Action TopCat.{u} Γ) : ℕ → Action TopCat.{u} Γ 801 | 0 => ⊥_ _ 802 | _ + 1 => X 803 804 private abbrev zeroSkeletonMap (X : Action TopCat.{u} Γ) : 805 (n : ℕ) → zeroSkeletonObj X n ⟶ zeroSkeletonObj X (n+1) 806 | 0 => initial.to X 807 | _ + 1 => 𝟙 X 808 809 private abbrev zeroSkeletonSequence (X : Action TopCat.{u} Γ) : ℕ ⥤ Action TopCat.{u} Γ := 810 Functor.ofSequence (zeroSkeletonMap X) 811 812 private def zeroSkeletonInclusion (X : Action TopCat.{u} Γ) : 813 zeroSkeletonSequence X ⟶ (Functor.const ℕ).obj X := 814 NatTrans.ofSequence (fun n => match n with | 0 => initial.to X | _+1 => 𝟙 X) 815 (fun n => by 816 cases n with 817 | zero => change initial.to X ≫ 𝟙 X = initial.to X ≫ 𝟙 X; rfl 818 | succ n => 819 simp only [zeroSkeletonSequence, Functor.ofSequence_map_homOfLE_succ] 820 rfl) 821 822 private def zeroSkeletonColimit (X : Action TopCat.{u} Γ) : 823 IsColimit (Cocone.mk X (zeroSkeletonInclusion X)) where 824 desc s := s.ι.app 1 825 fac s n := by 826 cases n with 827 | zero => exact initialIsInitial.hom_ext _ _ 828 | succ n => 829 change 𝟙 X ≫ s.ι.app 1 = s.ι.app (n+1) 830 simp only [Category.id_comp] 831 induction n with 832 | zero => rfl 833 | succ n hn => 834 have h := s.w (homOfLE (Nat.le_succ (n+1))) 835 simp only [zeroSkeletonSequence, Functor.ofSequence_map_homOfLE_succ, 836 zeroSkeletonMap] at h 837 exact hn.trans h.symm 838 uniq s m h := by 839 have hh := h 1 840 change 𝟙 X ≫ m = s.ι.app 1 at hh 841 exact (Category.id_comp m).symm.trans hh 842 843 /-- A zero-cell attachment from the empty action extends to a genuine CW structure 844 by taking a constant tail and attaching no higher-dimensional cells. -/ 845 def EquivariantCWComplex.ofZeroAttachment {X : Action TopCat.{u} Γ} 846 (c : HomotopicalAlgebra.AttachCells.{u} (equivariantBasicCell (Γ := Γ) 0) 847 (initial.to X)) : EquivariantCWComplex X where 848 F := zeroSkeletonSequence X 849 isoBot := Iso.refl _ 850 incl := zeroSkeletonInclusion X 851 isColimit := zeroSkeletonColimit X 852 fac := initialIsInitial.hom_ext _ _ 853 attachCells n _ := by 854 cases n with 855 | zero => simpa only [zeroSkeletonSequence, Functor.ofSequence_map_homOfLE_succ, 856 zeroSkeletonMap] using c 857 | succ n => simpa only [zeroSkeletonSequence, Functor.ofSequence_map_homOfLE_succ, 858 zeroSkeletonMap] using identityCellAttachment X (n+1) 859 860 end BC4lean.ProperActions 861 862 namespace BC4lean.ProperActions 863 variable {Γ : Type u} [Group Γ] [TopologicalSpace Γ] [DiscreteTopology Γ] 864 865 private instance diskZeroSubsingleton : Subsingleton (TopCat.disk.{u} 0) := by 866 change Subsingleton (ULift (Metric.closedBall (0 : EuclideanSpace ℝ (Fin 0)) 1)) 867 infer_instance 868 869 private instance diskZeroDiscrete : DiscreteTopology (TopCat.disk.{u} 0) := inferInstance 870 871 private instance boundaryZeroEmpty : IsEmpty (TopCat.diskBoundary.{u} 0) := by 872 constructor 873 intro x 874 have h := x.down.property 875 have hx : x.down.val = 0 := Subsingleton.elim _ _ 876 simp [hx] at h 877 878 /-- A disjoint union of zero-dimensional orbit cells. -/ 879 def OrbitZeroSkeleton {ι : Type u} (p : ι → FiniteIsotropy Γ) := 880 Σ i, OrbitCell (p i).val (TopCat.disk.{u} 0) 881 882 namespace OrbitZeroSkeleton 883 variable {ι : Type u} (p : ι → FiniteIsotropy Γ) 884 instance : TopologicalSpace (OrbitZeroSkeleton p) := 885 inferInstanceAs (TopologicalSpace (Σ i, OrbitCell (p i).val (TopCat.disk.{u} 0))) 886 instance : DiscreteTopology (OrbitZeroSkeleton p) := by 887 change DiscreteTopology (Σ i, OrbitCell (p i).val (TopCat.disk.{u} 0)) 888 let (i : ι) : DiscreteTopology (Γ ⧸ (p i).val) := QuotientGroup.discreteTopology (isOpen_discrete _) 889 let (i : ι) : DiscreteTopology (OrbitCell (p i).val (TopCat.disk.{u} 0)) := 890 inferInstanceAs (DiscreteTopology ((Γ ⧸ (p i).val) × TopCat.disk.{u} 0)) 891 infer_instance 892 instance : MulAction Γ (OrbitZeroSkeleton p) where 893 smul g x := ⟨x.1, g • x.2⟩ 894 one_smul x := congrArg (Sigma.mk x.1) (one_smul Γ x.2) 895 mul_smul g h x := congrArg (Sigma.mk x.1) (mul_smul g h x.2) 896 instance : ContinuousConstSMul Γ (OrbitZeroSkeleton p) := ⟨fun _ => continuous_of_discreteTopology⟩ 897 898 /-- The inclusion of one orbit zero-cell. -/ 899 def inclusion (i : ι) : EquivariantMap Γ (OrbitCell (p i).val (TopCat.disk.{u} 0)) 900 (OrbitZeroSkeleton p) where 901 toFun x := ⟨i,x⟩ 902 continuous_toFun := by 903 exact @continuous_sigmaMk ι (fun j => OrbitCell (p j).val (TopCat.disk.{u} 0)) 904 (fun j => inferInstance) i 905 map_smul' _ _ := rfl 906 907 private def cellCofan : Cofan (fun i => topologicalAction Γ 908 (OrbitCell (p i).val (TopCat.disk.{u} 0))) := 909 Cofan.mk (topologicalAction Γ (OrbitZeroSkeleton p)) (fun i => (inclusion p i).toActionHom) 910 911 private def cellCofanColimit : IsColimit (cellCofan p) := by 912 refine Cofan.IsColimit.mk (cellCofan p) (fun s => ?_) ?_ ?_ 913 · change topologicalAction Γ (OrbitZeroSkeleton p) ⟶ s.pt 914 exact { 915 hom := TopCat.ofHom ⟨fun x => (s.inj x.1).hom x.2, 916 continuous_sigma (fun i => (s.inj i).hom.hom.continuous)⟩ 917 comm := fun g => by 918 apply TopCat.hom_ext 919 apply ContinuousMap.ext 920 intro x 921 exact ConcreteCategory.congr_hom (s.inj x.1 |>.comm g) x.2 } 922 · intro s i 923 rfl 924 · intro s m hm 925 apply Action.Hom.ext 926 apply TopCat.hom_ext 927 apply ContinuousMap.ext 928 intro ⟨i,x⟩ 929 exact ConcreteCategory.congr_hom (congrArg Action.Hom.hom (hm i)) x 930 931 private def boundaryInitial (i : ι) : IsInitial (topologicalAction Γ 932 (OrbitCell (p i).val (TopCat.diskBoundary.{u} 0))) := by 933 let h (Y : Action TopCat.{u} Γ) : Unique 934 (topologicalAction Γ (OrbitCell (p i).val (TopCat.diskBoundary.{u} 0)) ⟶ Y) := 935 { default := 936 { hom := TopCat.ofHom ⟨fun x => isEmptyElim x.2, by fun_prop⟩ 937 comm := fun _ => by ext x; exact isEmptyElim x.2 } 938 uniq := fun f => by ext x; exact isEmptyElim x.2 } 939 exact IsInitial.ofUnique _ 940 941 private def boundaryCofan : Cofan (fun i => topologicalAction Γ 942 (OrbitCell (p i).val (TopCat.diskBoundary.{u} 0))) := 943 Cofan.mk (⊥_ _) (fun i => (boundaryInitial p i).to _) 944 945 private def boundaryCofanColimit : IsColimit (boundaryCofan p) := 946 Cofan.IsColimit.mk _ (fun s => initial.to s.pt) 947 (fun _ i => (boundaryInitial p i).hom_ext _ _) 948 (fun _ _ _ => initialIsInitial.hom_ext _ _) 949 950 /-- Construct the zero-cell attachment with explicit coproduct and pushout witnesses. -/ 951 def attachment : HomotopicalAlgebra.AttachCells.{u} (equivariantBasicCell (Γ := Γ) 0) 952 (initial.to (topologicalAction Γ (OrbitZeroSkeleton p))) where 953 ι := ι 954 π := p 955 cofan₁ := boundaryCofan p 956 cofan₂ := cellCofan p 957 isColimit₁ := boundaryCofanColimit p 958 isColimit₂ := cellCofanColimit p 959 m := initial.to _ 960 hm i := (boundaryInitial p i).hom_ext _ _ 961 g₁ := 𝟙 _ 962 g₂ := 𝟙 _ 963 isPushout := IsPushout.of_id_fst 964 965 /-- A disjoint union of finite-isotropy orbit zero-cells has a genuine equivariant CW structure. -/ 966 def cwComplex : EquivariantCWComplex (topologicalAction Γ (OrbitZeroSkeleton p)) := 967 .ofZeroAttachment (attachment p) 968 969 end OrbitZeroSkeleton 970 end BC4lean.ProperActions 971 972 namespace BC4lean.ProperActions 973 variable {Γ : Type u} [Group Γ] [TopologicalSpace Γ] [DiscreteTopology Γ] 974 975 omit [TopologicalSpace Γ] [DiscreteTopology Γ] in 976 /-- A countable group has only countably many finite subgroups. -/ 977 theorem finiteIsotropy_countable [Countable Γ] : Countable (FiniteIsotropy Γ) := by 978 classical 979 have hf (H : FiniteIsotropy Γ) : (H.val : Set Γ).Finite := by 980 let := H.property 981 exact Set.toFinite _ 982 let f : FiniteIsotropy Γ → Finset Γ := fun H => (hf H).toFinset 983 have hi : Function.Injective f := by 984 intro H K h 985 apply Subtype.ext 986 apply SetLike.coe_injective 987 have hh := congrArg (fun s : Finset Γ => (s : Set Γ)) h 988 simpa only [f, Set.Finite.coe_toFinset] using hh 989 exact hi.countable 990 991 namespace OrbitZeroSkeleton 992 variable {ι : Type u} (p : ι → FiniteIsotropy Γ) 993 994 omit [TopologicalSpace Γ] [DiscreteTopology Γ] in 995 /-- Countably many zero-cell orbits for a countable group give a countable space. -/ 996 theorem countable [Countable Γ] [Countable ι] : Countable (OrbitZeroSkeleton p) := by 997 change Countable (Σ i, OrbitCell (p i).val (TopCat.disk.{u} 0)) 998 let (i : ι) : Countable (Γ ⧸ (p i).val) := 999 (QuotientGroup.mk_surjective (s := (p i).val)).countable 1000 let : Countable (TopCat.disk.{u} 0) := inferInstance 1001 let (i : ι) : Countable (OrbitCell (p i).val (TopCat.disk.{u} 0)) := 1002 inferInstanceAs (Countable ((Γ ⧸ (p i).val) × TopCat.disk.{u} 0)) 1003 infer_instance 1004 1005 /-- The constructed zero-skeleton is locally compact. -/ 1006 theorem locallyCompact : LocallyCompactSpace (OrbitZeroSkeleton p) := inferInstance 1007 1008 /-- Under countability assumptions the constructed zero-skeleton is second countable. -/ 1009 theorem secondCountable [Countable Γ] [Countable ι] : 1010 SecondCountableTopology (OrbitZeroSkeleton p) := by 1011 let := countable p 1012 infer_instance 1013 end OrbitZeroSkeleton 1014 1015 /-- The zero-skeleton containing one orbit Γ/H for every finite subgroup H. -/ 1016 abbrev UniversalZeroSkeleton (Γ : Type u) [Group Γ] [TopologicalSpace Γ] := 1017 OrbitZeroSkeleton (fun H : FiniteIsotropy Γ => H) 1018 1019 namespace UniversalZeroSkeleton 1020 /-- An explicit finite-subgroup-fixed vertex in the universal zero-skeleton. -/ 1021 def fixedVertex (H : Subgroup Γ) [Finite H] : FixedPointSpace H (UniversalZeroSkeleton Γ) := by 1022 let z : TopCat.disk.{u} 0 := ⟨⟨0, by simp⟩⟩ 1023 refine ⟨⟨⟨H,inferInstance⟩, (QuotientGroup.mk 1, z)⟩, ?_⟩ 1024 intro h 1025 change (⟨⟨H,inferInstance⟩, ((h : Γ) • (QuotientGroup.mk 1 : Γ ⧸ H), z)⟩ : 1026 UniversalZeroSkeleton Γ) = _ 1027 rw [subgroup_fixes_identity_coset] 1028 1029 /-- The universal zero-skeleton has a verified equivariant CW structure. -/ 1030 def cwComplex : EquivariantCWComplex (topologicalAction Γ (UniversalZeroSkeleton Γ)) := 1031 OrbitZeroSkeleton.cwComplex _ 1032 1033 omit [DiscreteTopology Γ] in 1034 /-- It is a countable space for a countable group. -/ 1035 theorem countable [Countable Γ] : Countable (UniversalZeroSkeleton Γ) := by 1036 let := finiteIsotropy_countable (Γ := Γ) 1037 exact OrbitZeroSkeleton.countable _ 1038 1039 /-- The universal zero-skeleton is locally compact and second countable. -/ 1040 theorem locallyCompact_secondCountable [Countable Γ] : 1041 LocallyCompactSpace (UniversalZeroSkeleton Γ) ∧ SecondCountableTopology (UniversalZeroSkeleton Γ) := by 1042 let := finiteIsotropy_countable (Γ := Γ) 1043 exact ⟨OrbitZeroSkeleton.locallyCompact _, OrbitZeroSkeleton.secondCountable _⟩ 1044 end UniversalZeroSkeleton 1045 end BC4lean.ProperActions 1046 1047 end
源码 SHA-256:4cb73c5c98de04a4e67abc1b32d8fbd511f8e27e615373a165014cdc4324f58d
1 import BC4lean.EquivariantCW 2 3 /-! # Maps from orbit cells and fixed-point extension problems 4 5 Continuous equivariant maps Γ/H × D → X are continuous maps D → X^H. 6 Consequently extension across a parameter map is exactly an ordinary extension 7 problem in the fixed-point space. This does not assume or prove that those 8 ordinary extensions exist for contractible targets. 9 -/ 10 namespace BC4lean.ProperActions 11 12 universe u v w 13 14 variable {Γ : Type u} {D E : Type v} {X : Type w} [Group Γ] [TopologicalSpace Γ] [DiscreteTopology Γ] 15 variable [TopologicalSpace D] [TopologicalSpace E] [TopologicalSpace X] 16 variable [MulAction Γ X] [ContinuousConstSMul Γ X] 17 18 /-- Evaluate an equivariant map on the identity-coset slice. -/ 19 def cellEvaluation (H : Subgroup Γ) (f : EquivariantMap Γ (OrbitCell H D) X) : 20 C(D, FixedPointSpace H X) where 21 toFun d := ⟨f (QuotientGroup.mk 1, d), fun h => by 22 change (h : Γ) • f (QuotientGroup.mk 1, d) = f (QuotientGroup.mk 1, d) 23 exact (f.map_smul (h : Γ) (QuotientGroup.mk 1, d)).symm.trans 24 (congrArg f (Prod.ext (subgroup_fixes_identity_coset H h) rfl))⟩ 25 continuous_toFun := 26 (f.continuous.comp (continuous_const.prodMk continuous_id)).subtype_mk _ 27 28 /-- Extend a continuous family of fixed points equivariantly over the orbit factor. -/ 29 def cellFromFixed (H : Subgroup Γ) (u : C(D, FixedPointSpace H X)) : 30 EquivariantMap Γ (OrbitCell H D) X where 31 toFun p := orbitMap H (u p.2) p.1 32 continuous_toFun := by 33 let : DiscreteTopology (Γ ⧸ H) := QuotientGroup.discreteTopology (isOpen_discrete _) 34 change Continuous (fun p : (Γ ⧸ H) × D => orbitMap H (u p.2) p.1) 35 apply continuous_prod_of_discrete_left.mpr 36 intro q 37 induction q using QuotientGroup.induction_on with 38 | H g => 39 change Continuous (fun d => g • (u d : X)) 40 exact (continuous_const_smul g).comp (continuous_subtype_val.comp u.continuous) 41 map_smul' g p := (orbitMap H (u p.2)).map_smul g p.1 42 43 /-- The orbit/fixed-point correspondence with a topological parameter. -/ 44 def orbitCellMapEquiv (H : Subgroup Γ) : 45 EquivariantMap Γ (OrbitCell H D) X ≃ C(D, FixedPointSpace H X) where 46 toFun := cellEvaluation H 47 invFun := cellFromFixed H 48 left_inv f := by 49 ext p 50 rcases p with ⟨q, d⟩ 51 induction q using QuotientGroup.induction_on with 52 | H g => 53 change g • f (QuotientGroup.mk 1, d) = f (QuotientGroup.mk g, d) 54 apply (f.map_smul g (QuotientGroup.mk 1, d)).symm.trans 55 apply congrArg f 56 change (g • (QuotientGroup.mk 1 : Γ ⧸ H), d) = (QuotientGroup.mk g, d) 57 simp only [MulAction.Quotient.smul_mk, smul_eq_mul, mul_one] 58 right_inv u := by 59 ext d 60 exact one_smul Γ (u d : X) 61 62 omit [ContinuousConstSMul Γ X] [DiscreteTopology Γ] in 63 /-- Evaluation commutes with restriction along any continuous parameter map. -/ 64 theorem cellEvaluation_comp (H : Subgroup Γ) (i : C(D, E)) 65 (f : EquivariantMap Γ (OrbitCell H E) X) : 66 cellEvaluation H (f.comp (OrbitCell.map H i)) = (cellEvaluation H f).comp i := by 67 ext d 68 rfl 69 70 /-- An equivariant cell extension exists exactly when its fixed-point slice extends. -/ 71 theorem orbitCell_extension_iff (H : Subgroup Γ) (i : C(D, E)) 72 (f : EquivariantMap Γ (OrbitCell H D) X) : 73 (∃ F : EquivariantMap Γ (OrbitCell H E) X, F.comp (OrbitCell.map H i) = f) ↔ 74 ∃ u : C(E, FixedPointSpace H X), u.comp i = cellEvaluation H f := by 75 constructor 76 · rintro ⟨F, hF⟩ 77 exact ⟨cellEvaluation H F, (cellEvaluation_comp H i F).symm.trans (congrArg (cellEvaluation H) hF)⟩ 78 · rintro ⟨u, hu⟩ 79 refine ⟨cellFromFixed H u, ?_⟩ 80 apply (orbitCellMapEquiv H).injective 81 change cellEvaluation H ((cellFromFixed H u).comp (OrbitCell.map H i)) = cellEvaluation H f 82 rw [cellEvaluation_comp] 83 have he : cellEvaluation H (cellFromFixed H u) = u := (orbitCellMapEquiv H).apply_symm_apply u 84 rw [he, hu] 85 86 end BC4lean.ProperActions
源码 SHA-256:57fde0d5e6c94ac4e1e1cc48174e410fd808f9332008ef5b682f8e58fa95efe3
1 import Mathlib.Topology.Homotopy.Contractible 2 import Mathlib.Topology.Category.TopCat.Sphere 3 4 /-! 5 # Extension from the boundary of a disk 6 7 A null-homotopic map from a unit sphere extends over the closed unit ball. 8 The proof descends the null-homotopy through the radial quotient map. 9 -/ 10 11 noncomputable section 12 13 open Metric 14 open scoped unitInterval 15 16 namespace BC4lean.ProperActions 17 18 universe u 19 20 variable {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] 21 22 /-- Inclusion of the unit sphere into the closed unit ball. -/ 23 def sphereInclusion : C(sphere (0 : E) 1, closedBall (0 : E) 1) := 24 ⟨fun x => ⟨x.1, le_of_eq x.2⟩, continuous_subtype_val.subtype_mk _⟩ 25 26 /-- The radial map from the cylinder on the unit sphere to the unit ball. -/ 27 def radialMap : C(I × sphere (0 : E) 1, closedBall (0 : E) 1) := by 28 refine ⟨fun p => ⟨(p.1 : ℝ) • p.2.1, ?_⟩, ?_⟩ 29 · rw [mem_closedBall, dist_zero_right, norm_smul, Real.norm_eq_abs, 30 abs_of_nonneg p.1.2.1, norm_eq_of_mem_sphere, mul_one] 31 exact p.1.2.2 32 · exact ((continuous_subtype_val.comp continuous_fst).smul 33 (continuous_subtype_val.comp continuous_snd)).subtype_mk _ 34 35 /-- The radial coordinate is recovered by taking the norm. -/ 36 theorem radialMap_norm (p : I × sphere (0 : E) 1) : 37 ‖(radialMap p : E)‖ = (p.1 : ℝ) := by 38 have hs : ‖p.2.1‖ = 1 := by simpa only [mem_sphere, dist_zero_right] using p.2.2 39 simp [radialMap, norm_smul, Real.norm_eq_abs, abs_of_nonneg p.1.2.1, hs] 40 41 /-- If the sphere is nonempty, every point of the ball has radial coordinates. -/ 42 theorem radialMap_surjective [Nonempty (sphere (0 : E) 1)] : 43 Function.Surjective (radialMap (E := E)) := by 44 intro x 45 by_cases hx : x.1 = 0 46 · obtain ⟨s⟩ := ‹Nonempty (sphere (0 : E) 1)› 47 exact ⟨(0, s), Subtype.ext (by simp [radialMap, hx])⟩ 48 · have hn : ‖x.1‖ ≠ 0 := norm_ne_zero_iff.mpr hx 49 let s : sphere (0 : E) 1 := ⟨‖x.1‖⁻¹ • x.1, by 50 simp [norm_smul, hn]⟩ 51 refine ⟨(⟨‖x.1‖, norm_nonneg _, by simpa only [mem_closedBall, dist_zero_right] using x.2⟩, s), ?_⟩ 52 apply Subtype.ext 53 change ‖x.1‖ • (‖x.1‖⁻¹ • x.1) = x.1 54 simp [smul_smul, hn] 55 56 /-- The radial cylinder is a quotient presentation of the ball. -/ 57 theorem radialMap_isQuotientMap [ProperSpace E] [Nonempty (sphere (0 : E) 1)] : 58 Topology.IsQuotientMap (radialMap (E := E)) := 59 .of_surjective_continuous radialMap_surjective radialMap.continuous 60 61 variable {Y : Type*} [TopologicalSpace Y] 62 63 /-- A homotopy starting at a constant is constant on the radial fibers. -/ 64 theorem homotopy_factorsThrough_radialMap {y : Y} {f : C(sphere (0 : E) 1, Y)} 65 (H : (ContinuousMap.const _ y).Homotopy f) : 66 Function.FactorsThrough H (radialMap (E := E)) := by 67 intro p q hpq 68 have ht : p.1 = q.1 := Subtype.ext (by 69 simpa only [radialMap_norm] using congrArg (fun x : closedBall (0 : E) 1 => ‖x.1‖) hpq) 70 by_cases hzero : p.1 = 0 71 · have hzq : q.1 = 0 := ht.symm.trans hzero 72 change H (p.1, p.2) = H (q.1, q.2) 73 rw [hzero, hzq, H.apply_zero, H.apply_zero] 74 rfl 75 · have hn : (p.1 : ℝ) ≠ 0 := fun h => hzero (Subtype.ext h) 76 have hs : p.2 = q.2 := by 77 apply Subtype.ext 78 have h := congrArg (fun x : closedBall (0 : E) 1 => x.1) hpq 79 change (p.1 : ℝ) • p.2.1 = (q.1 : ℝ) • q.2.1 at h 80 rw [← ht] at h 81 exact (smul_right_injective E hn) h 82 exact congrArg H (Prod.ext ht hs) 83 84 /-- A null-homotopic sphere map extends over the closed ball. -/ 85 theorem nullhomotopic_extends_ball [ProperSpace E] 86 (f : C(sphere (0 : E) 1, Y)) (hf : f.Nullhomotopic) : 87 ∃ F : C(closedBall (0 : E) 1, Y), F.comp sphereInclusion = f := by 88 classical 89 obtain ⟨y, ⟨H⟩⟩ := hf 90 cases isEmpty_or_nonempty (sphere (0 : E) 1) with 91 | inl h => 92 exact ⟨ContinuousMap.const _ y, ContinuousMap.ext (fun x => isEmptyElim x)⟩ 93 | inr h => 94 let q := radialMap_isQuotientMap (E := E) 95 let F := q.lift H.symm.toContinuousMap (homotopy_factorsThrough_radialMap H.symm) 96 refine ⟨F, ContinuousMap.ext fun s => ?_⟩ 97 have h := ContinuousMap.congr_fun (q.lift_comp H.symm.toContinuousMap 98 (homotopy_factorsThrough_radialMap H.symm)) (1, s) 99 change F (radialMap (1, s)) = H.symm (1, s) at h 100 rw [H.symm.apply_one] at h 101 have he : radialMap (1, s) = sphereInclusion s := Subtype.ext (one_smul ℝ s.1) 102 rw [he] at h 103 exact h 104 105 /-- Every sphere map into a contractible space extends over the ball. -/ 106 theorem contractible_extends_ball [ProperSpace E] [ContractibleSpace Y] 107 (f : C(sphere (0 : E) 1, Y)) : 108 ∃ F : C(closedBall (0 : E) 1, Y), F.comp sphereInclusion = f := by 109 apply nullhomotopic_extends_ball f 110 simpa using (id_nullhomotopic Y).comp_left f 111 112 /-- Every map from the boundary of a Euclidean disk into a contractible space extends. -/ 113 theorem contractible_extends_disk {Y : Type*} [TopologicalSpace Y] [ContractibleSpace Y] 114 (n : ℕ) (f : C(TopCat.diskBoundary.{u} n, Y)) : 115 ∃ F : C(TopCat.disk.{u} n, Y), F.comp (TopCat.diskBoundaryInclusion n).hom = f := by 116 let s : TopCat.diskBoundary.{u} n ≃ₜ sphere (0 : EuclideanSpace ℝ (Fin n)) 1 := 117 Homeomorph.ulift 118 let d : TopCat.disk.{u} n ≃ₜ closedBall (0 : EuclideanSpace ℝ (Fin n)) 1 := 119 Homeomorph.ulift 120 obtain ⟨F, hF⟩ := contractible_extends_ball (f.comp ⟨s.symm, s.symm.continuous⟩) 121 refine ⟨F.comp ⟨d, d.continuous⟩, ContinuousMap.ext fun x => ?_⟩ 122 exact ContinuousMap.congr_fun hF x.down 123 124 end BC4lean.ProperActions
源码 SHA-256:d96b38c4b837e7ccddd84d23d4cbb602f44629a8ff472e8cc86f1db10306d2ea
1 import BC4lean.DiskExtension 2 import BC4lean.OrbitCellMaps 3 import BC4lean.FixedPointCriterion 4 5 /-! 6 # Extension over equivariant disk cells 7 8 Contractibility of the H-fixed points gives extension over a Γ/H-cell. 9 This is the single-cell extension step, not yet the full cellular mapping theorem. 10 -/ 11 12 namespace BC4lean.ProperActions 13 14 universe u v 15 16 variable {Γ : Type u} {X : Type v} [Group Γ] [TopologicalSpace Γ] [DiscreteTopology Γ] 17 variable [TopologicalSpace X] [MulAction Γ X] [ContinuousConstSMul Γ X] 18 19 /-- A map on the boundary of an orbit cell extends when the fixed-point target is contractible. -/ 20 theorem orbitCell_extends_of_contractible (H : Subgroup Γ) 21 [ContractibleSpace (FixedPointSpace H X)] (n : ℕ) 22 (f : EquivariantMap Γ (OrbitCell H (TopCat.diskBoundary.{u} n)) X) : 23 ∃ F : EquivariantMap Γ (OrbitCell H (TopCat.disk.{u} n)) X, 24 F.comp (OrbitCell.boundaryInclusion H n) = f := by 25 apply (orbitCell_extension_iff H (TopCat.diskBoundaryInclusion n).hom f).mpr 26 exact contractible_extends_disk n (cellEvaluation H f) 27 28 /-- The fixed-point criterion supplies extension for each finite-isotropy orbit cell. -/ 29 theorem FixedPointCriterion.orbitCell_extends (h : FixedPointCriterion Γ X) 30 (H : Subgroup Γ) [Finite H] (n : ℕ) 31 (f : EquivariantMap Γ (OrbitCell H (TopCat.diskBoundary.{u} n)) X) : 32 ∃ F : EquivariantMap Γ (OrbitCell H (TopCat.disk.{u} n)) X, 33 F.comp (OrbitCell.boundaryInclusion H n) = f := by 34 let := h.1 H inferInstance 35 exact orbitCell_extends_of_contractible H n f 36 37 end BC4lean.ProperActions
源码 SHA-256:6b3b2f58b2bdebef65374362441418dfcc95116f4c5159d53b124bc49dd87a0e
1 import BC4lean.OrbitCellExtension 2 import Mathlib.CategoryTheory.SmallObject.TransfiniteCompositionLifting 3 4 /-! 5 # Extension over equivariant CW complexes 6 7 The single-cell extension property is preserved by coproducts, pushouts and 8 sequential colimits. Thus maps into a target with contractible finite-subgroup 9 fixed points extend over a relative equivariant CW complex. 10 -/ 11 12 namespace BC4lean.ProperActions 13 14 open CategoryTheory CategoryTheory.Limits 15 16 universe u 17 18 variable {Γ : Type u} [Group Γ] [TopologicalSpace Γ] [DiscreteTopology Γ] 19 variable {X : Type u} [TopologicalSpace X] [MulAction Γ X] [ContinuousConstSMul Γ X] 20 21 /-- Each generating orbit cell lifts against the map from the target to a point. -/ 22 theorem basicCell_hasLiftingProperty (h : FixedPointCriterion Γ X) 23 (n : ℕ) (H : FiniteIsotropy Γ) : 24 HasLiftingProperty (equivariantBasicCell n H) (terminal.from (topologicalAction Γ X)) := by 25 constructor 26 intro a b sq 27 let : Finite H.val := H.property 28 obtain ⟨F, hF⟩ := h.orbitCell_extends H.val n (EquivariantMap.ofActionHom a) 29 refine ⟨⟨{ l := F.toActionHom, fac_left := ?_, fac_right := ?_ }⟩⟩ 30 · have hf := congrArg EquivariantMap.toActionHom hF 31 exact hf.trans (EquivariantMap.actionHomEquiv.apply_symm_apply a) 32 · exact terminalIsTerminal.hom_ext _ _ 33 34 /-- The cellwise lifting property persists across the full relative CW structure. -/ 35 theorem RelativeEquivariantCWComplex.hasLiftingProperty 36 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} 37 (c : RelativeEquivariantCWComplex i) (h : FixedPointCriterion Γ X) : 38 HasLiftingProperty i (terminal.from (topologicalAction Γ X)) := by 39 let W := MorphismProperty.ofHoms (fun p : ℕ × FiniteIsotropy Γ => 40 equivariantBasicCell p.1 p.2) 41 have hc : ∀ s : c.Cells, W (equivariantBasicCell s.j s.i) := 42 fun s => MorphismProperty.ofHoms.mk (s.j, s.i) 43 have hr : W.rlp (terminal.from (topologicalAction Γ X)) := by 44 intro A B f hf 45 cases hf with 46 | mk p => exact basicCell_hasLiftingProperty h p.1 p.2 47 exact W.transfiniteCompositionsOfShape_pushouts_coproducts_le_llp_rlp ℕ i 48 ⟨c.transfiniteCompositionOfShape' hc⟩ _ hr 49 50 /-- Maps into a target satisfying the fixed-point criterion extend over relative CW complexes. -/ 51 theorem RelativeEquivariantCWComplex.extend 52 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} 53 (c : RelativeEquivariantCWComplex i) (h : FixedPointCriterion Γ X) 54 (f : A ⟶ topologicalAction Γ X) : 55 ∃ F : B ⟶ topologicalAction Γ X, i ≫ F = f := by 56 let := c.hasLiftingProperty h 57 let sq : CommSq f i (terminal.from (topologicalAction Γ X)) (terminal.from B) := 58 ⟨terminalIsTerminal.hom_ext _ _⟩ 59 exact ⟨sq.lift, sq.fac_left⟩ 60 61 /-- Every equivariant CW complex admits a map into a target satisfying the fixed-point criterion. -/ 62 theorem EquivariantCWComplex.nonempty_map 63 {A : Action TopCat.{u} Γ} (c : EquivariantCWComplex A) (h : FixedPointCriterion Γ X) : 64 Nonempty (A ⟶ topologicalAction Γ X) := by 65 obtain ⟨F, _⟩ := c.extend h (initial.to _) 66 exact ⟨F⟩ 67 68 end BC4lean.ProperActions
源码 SHA-256:2dec4351a723bee828d46047c77d07e282e2e40794f61f481d7a44a6dc8e13e0
1 import BC4lean.DiskExtension 2 3 /-! # A quotient presentation of the boundary of a disk cylinder 4 5 The product norm on ℝ × E is the max norm. Its unit sphere consists of the 6 two disk faces and the cylinder on the unit sphere of E. 7 -/ 8 9 noncomputable section 10 open Metric 11 open scoped unitInterval 12 13 namespace BC4lean.ProperActions 14 15 variable {E : Type*} [NormedAddCommGroup E] 16 17 /-- Affine coordinate identifying the unit interval with [-1,1]. -/ 18 def signedTime (t : I) : ℝ := 2 * (t : ℝ) - 1 19 20 @[simp] theorem signedTime_zero : signedTime 0 = -1 := by norm_num [signedTime] 21 @[simp] theorem signedTime_one : signedTime 1 = 1 := by norm_num [signedTime] 22 23 theorem abs_signedTime_le (t : I) : |signedTime t| ≤ 1 := by 24 rw [abs_le] 25 have h := t.2 26 dsimp [signedTime] 27 constructor <;> linarith [h.1, h.2] 28 29 theorem signedTime_injective : Function.Injective signedTime := by 30 intro t u h 31 apply Subtype.ext 32 dsimp [signedTime] at h 33 linarith 34 35 /-- The cylinder parametrized as the max-norm ball. -/ 36 def cylinderBall : C(I × closedBall (0 : E) 1, closedBall (0 : ℝ × E) 1) := by 37 refine ⟨fun p => ⟨(signedTime p.1, p.2.1), ?_⟩, ?_⟩ 38 · rw [mem_closedBall, dist_zero_right, Prod.norm_mk, Real.norm_eq_abs, max_le_iff] 39 exact ⟨abs_signedTime_le _, by simpa only [mem_closedBall, dist_zero_right] using p.2.2⟩ 40 · exact (((continuous_subtype_val.comp continuous_fst).const_mul 2 |>.sub continuous_const).prodMk 41 (continuous_subtype_val.comp continuous_snd)).subtype_mk _ 42 43 /-- The lower disk face of the cylinder boundary. -/ 44 def cylinderFaceZero : C(closedBall (0 : E) 1, sphere (0 : ℝ × E) 1) := by 45 refine ⟨fun x => ⟨(-1, x.1), ?_⟩, ?_⟩ 46 · have hx : ‖x.1‖ ≤ 1 := by simpa only [mem_closedBall, dist_zero_right] using x.2 47 simp only [mem_sphere, dist_zero_right, Prod.norm_mk, norm_neg, norm_one, max_eq_left hx] 48 · exact (continuous_const.prodMk continuous_subtype_val).subtype_mk _ 49 50 /-- The upper disk face of the cylinder boundary. -/ 51 def cylinderFaceOne : C(closedBall (0 : E) 1, sphere (0 : ℝ × E) 1) := by 52 refine ⟨fun x => ⟨(1, x.1), ?_⟩, ?_⟩ 53 · have hx : ‖x.1‖ ≤ 1 := by simpa only [mem_closedBall, dist_zero_right] using x.2 54 simp only [mem_sphere, dist_zero_right, Prod.norm_mk, norm_one, max_eq_left hx] 55 · exact (continuous_const.prodMk continuous_subtype_val).subtype_mk _ 56 57 /-- The cylindrical side of the boundary. -/ 58 def cylinderSide : C(I × sphere (0 : E) 1, sphere (0 : ℝ × E) 1) := by 59 refine ⟨fun p => ⟨(signedTime p.1, p.2.1), ?_⟩, ?_⟩ 60 · simp only [mem_sphere, dist_zero_right, Prod.norm_mk, Real.norm_eq_abs, 61 norm_eq_of_mem_sphere, max_eq_right (abs_signedTime_le p.1)] 62 · exact (((continuous_subtype_val.comp continuous_fst).const_mul 2 |>.sub continuous_const).prodMk 63 (continuous_subtype_val.comp continuous_snd)).subtype_mk _ 64 65 /-- Disjoint union of the two faces and the cylindrical side. -/ 66 abbrev CylinderBoundaryPieces (E : Type*) [NormedAddCommGroup E] := 67 closedBall (0 : E) 1 ⊕ (closedBall (0 : E) 1 ⊕ (I × sphere (0 : E) 1)) 68 69 /-- Glue the three boundary pieces into the max-norm unit sphere. -/ 70 def cylinderBoundaryQuotient : C(CylinderBoundaryPieces E, sphere (0 : ℝ × E) 1) := 71 ⟨Sum.elim cylinderFaceZero (Sum.elim cylinderFaceOne cylinderSide), 72 continuous_sum_dom.mpr ⟨cylinderFaceZero.continuous, 73 continuous_sum_dom.mpr ⟨cylinderFaceOne.continuous, cylinderSide.continuous⟩⟩⟩ 74 75 /-- The three pieces cover the sphere, including in dimension zero. -/ 76 theorem cylinderBoundaryQuotient_surjective : 77 Function.Surjective (cylinderBoundaryQuotient (E := E)) := by 78 intro x 79 have hx : max |x.1.1| ‖x.1.2‖ = 1 := by 80 simpa only [mem_sphere, dist_zero_right, Prod.norm_def, Real.norm_eq_abs] using x.2 81 have hb : ‖x.1.2‖ ≤ 1 := (le_max_right _ _).trans (le_of_eq hx) 82 let b : closedBall (0 : E) 1 := ⟨x.1.2, by simpa only [mem_closedBall, dist_zero_right] using hb⟩ 83 by_cases h0 : x.1.1 = -1 84 · exact ⟨Sum.inl b, Subtype.ext (Prod.ext h0.symm rfl)⟩ 85 by_cases h1 : x.1.1 = 1 86 · exact ⟨Sum.inr (Sum.inl b), Subtype.ext (Prod.ext h1.symm rfl)⟩ 87 have hr : |x.1.1| ≤ 1 := (le_max_left _ _).trans (le_of_eq hx) 88 have hn : ‖x.1.2‖ = 1 := by 89 rcases max_eq_iff.mp hx with h | h 90 · rcases (abs_eq (by norm_num : (0 : ℝ) ≤ 1)).mp h.1 with h | h 91 · exact False.elim (h1 h) 92 · exact False.elim (h0 h) 93 · exact h.1 94 let t : I := ⟨(x.1.1 + 1) / 2, by constructor <;> linarith [abs_le.mp hr]⟩ 95 let s : sphere (0 : E) 1 := ⟨x.1.2, by simpa only [mem_sphere, dist_zero_right] using hn⟩ 96 refine ⟨Sum.inr (Sum.inr (t,s)), Subtype.ext (Prod.ext ?_ rfl)⟩ 97 change 2 * ((x.1.1 + 1) / 2) - 1 = x.1.1 98 ring 99 100 /-- Compactness of the pieces makes the boundary presentation a quotient map. -/ 101 theorem cylinderBoundaryQuotient_isQuotientMap [ProperSpace E] : 102 Topology.IsQuotientMap (cylinderBoundaryQuotient (E := E)) := 103 .of_surjective_continuous cylinderBoundaryQuotient_surjective cylinderBoundaryQuotient.continuous 104 105 end BC4lean.ProperActions
源码 SHA-256:916cd5746a16fcdfc63cbe7543180bc15dad91ac2377d45578e12866f74f4bec
1 import BC4lean.CylinderBoundary 2 3 /-! # Extending prescribed disk endpoint maps and a boundary homotopy -/ 4 5 noncomputable section 6 open Metric 7 open scoped unitInterval 8 9 namespace BC4lean.ProperActions 10 11 variable {E Y : Type*} [NormedAddCommGroup E] [TopologicalSpace Y] 12 variable (f₀ f₁ : C(closedBall (0 : E) 1, Y)) 13 variable (H : (f₀.comp sphereInclusion).Homotopy (f₁.comp sphereInclusion)) 14 15 /-- Values prescribed on the two disk faces and their common cylindrical side. -/ 16 def cylinderBoundaryData : C(CylinderBoundaryPieces E, Y) := 17 ⟨Sum.elim f₀ (Sum.elim f₁ H), 18 continuous_sum_dom.mpr ⟨f₀.continuous, 19 continuous_sum_dom.mpr ⟨f₁.continuous, H.continuous⟩⟩⟩ 20 21 private theorem faceZero_side_agree (x : closedBall (0 : E) 1) (p : I × sphere (0 : E) 1) 22 (h : cylinderFaceZero x = cylinderSide p) : f₀ x = H p := by 23 have ht : (0 : I) = p.1 := signedTime_injective (by 24 rw [signedTime_zero] 25 exact congrArg (fun z : sphere (0 : ℝ × E) 1 => z.1.1) h) 26 have hx : x = sphereInclusion p.2 := 27 Subtype.ext (congrArg (fun z : sphere (0 : ℝ × E) 1 => z.1.2) h) 28 change f₀ x = H (p.1, p.2) 29 rw [← ht, H.apply_zero] 30 exact congrArg f₀ hx 31 32 private theorem faceOne_side_agree (x : closedBall (0 : E) 1) (p : I × sphere (0 : E) 1) 33 (h : cylinderFaceOne x = cylinderSide p) : f₁ x = H p := by 34 have ht : (1 : I) = p.1 := signedTime_injective (by 35 rw [signedTime_one] 36 exact congrArg (fun z : sphere (0 : ℝ × E) 1 => z.1.1) h) 37 have hx : x = sphereInclusion p.2 := 38 Subtype.ext (congrArg (fun z : sphere (0 : ℝ × E) 1 => z.1.2) h) 39 change f₁ x = H (p.1, p.2) 40 rw [← ht, H.apply_one] 41 exact congrArg f₁ hx 42 43 /-- The endpoint identities are exactly the compatibility conditions for boundary gluing. -/ 44 theorem cylinderBoundaryData_factorsThrough : 45 Function.FactorsThrough (cylinderBoundaryData f₀ f₁ H) cylinderBoundaryQuotient := by 46 intro p q h 47 rcases p with x | x 48 · rcases q with y | y 49 · exact congrArg f₀ (Subtype.ext (congrArg (fun z : sphere (0 : ℝ × E) 1 => z.1.2) h)) 50 · rcases y with y | y 51 · have ht := congrArg (fun z : sphere (0 : ℝ × E) 1 => z.1.1) h 52 change (-1 : ℝ) = 1 at ht 53 norm_num at ht 54 · exact faceZero_side_agree f₀ f₁ H x y h 55 · rcases x with x | x 56 · rcases q with y | y 57 · have ht := congrArg (fun z : sphere (0 : ℝ × E) 1 => z.1.1) h 58 change (1 : ℝ) = -1 at ht 59 norm_num at ht 60 · rcases y with y | y 61 · exact congrArg f₁ (Subtype.ext (congrArg (fun z : sphere (0 : ℝ × E) 1 => z.1.2) h)) 62 · exact faceOne_side_agree f₀ f₁ H x y h 63 · rcases q with y | y 64 · exact (faceZero_side_agree f₀ f₁ H y x h.symm).symm 65 · rcases y with y | y 66 · exact (faceOne_side_agree f₀ f₁ H y x h.symm).symm 67 · apply congrArg H 68 exact Prod.ext 69 (signedTime_injective (congrArg (fun z : sphere (0 : ℝ × E) 1 => z.1.1) h)) 70 (Subtype.ext (congrArg (fun z : sphere (0 : ℝ × E) 1 => z.1.2) h)) 71 72 /-- Glue endpoint maps and a boundary homotopy into a map on the cylinder boundary. -/ 73 def gluedCylinderBoundary [ProperSpace E] : C(sphere (0 : ℝ × E) 1, Y) := 74 cylinderBoundaryQuotient_isQuotientMap.lift (cylinderBoundaryData f₀ f₁ H) 75 (cylinderBoundaryData_factorsThrough f₀ f₁ H) 76 77 @[simp] theorem gluedCylinderBoundary_on_piece [ProperSpace E] (p : CylinderBoundaryPieces E) : 78 gluedCylinderBoundary f₀ f₁ H (cylinderBoundaryQuotient p) = 79 cylinderBoundaryData f₀ f₁ H p := 80 ContinuousMap.congr_fun (cylinderBoundaryQuotient_isQuotientMap.lift_comp 81 (cylinderBoundaryData f₀ f₁ H) (cylinderBoundaryData_factorsThrough f₀ f₁ H)) p 82 83 variable [NormedSpace ℝ E] 84 85 /-- Into a contractible target, a sphere homotopy extends over the ball with both endpoints fixed. -/ 86 theorem contractible_extends_ball_homotopy [ProperSpace E] [ContractibleSpace Y] : 87 ∃ F : f₀.Homotopy f₁, ∀ t s, F (t, sphereInclusion s) = H (t, s) := by 88 obtain ⟨F, hF⟩ := contractible_extends_ball (gluedCylinderBoundary f₀ f₁ H) 89 have he (p : CylinderBoundaryPieces E) : 90 F (sphereInclusion (cylinderBoundaryQuotient p)) = cylinderBoundaryData f₀ f₁ H p := 91 (ContinuousMap.congr_fun hF (cylinderBoundaryQuotient p)).trans 92 (gluedCylinderBoundary_on_piece f₀ f₁ H p) 93 refine ⟨{ toContinuousMap := F.comp cylinderBall, 94 map_zero_left := ?_, map_one_left := ?_ }, ?_⟩ 95 · intro x 96 change F (cylinderBall (0,x)) = f₀ x 97 calc 98 F (cylinderBall (0,x)) = F (sphereInclusion (cylinderBoundaryQuotient (Sum.inl x))) := by 99 apply congrArg F 100 apply Subtype.ext 101 exact Prod.ext signedTime_zero rfl 102 _ = _ := he (Sum.inl x) 103 · intro x 104 change F (cylinderBall (1,x)) = f₁ x 105 calc 106 F (cylinderBall (1,x)) = F (sphereInclusion (cylinderBoundaryQuotient (Sum.inr (Sum.inl x)))) := by 107 apply congrArg F 108 apply Subtype.ext 109 exact Prod.ext signedTime_one rfl 110 _ = _ := he (Sum.inr (Sum.inl x)) 111 · intro t s 112 exact he (Sum.inr (Sum.inr (t,s))) 113 114 end BC4lean.ProperActions
源码 SHA-256:0a5c896ef02126bf9d042a7d57ec875b38df6315fbd1b9a4534e5af67dbbfd6a
1 import BC4lean.DiskHomotopyExtension 2 3 /-! # Path lifting across the standard disk boundary inclusion -/ 4 5 noncomputable section 6 open scoped unitInterval 7 8 namespace BC4lean.ProperActions 9 10 universe u 11 12 /-- A prescribed boundary homotopy extends over a standard disk, with endpoints unchanged. -/ 13 theorem contractible_extends_disk_homotopy {Y : Type*} [TopologicalSpace Y] 14 [ContractibleSpace Y] (n : ℕ) (f₀ f₁ : C(TopCat.disk.{u} n, Y)) 15 (H : (f₀.comp (TopCat.diskBoundaryInclusion n).hom).Homotopy 16 (f₁.comp (TopCat.diskBoundaryInclusion n).hom)) : 17 ∃ F : f₀.Homotopy f₁, ∀ t s, F (t, (TopCat.diskBoundaryInclusion n) s) = H (t,s) := by 18 let b : C(Metric.closedBall (0 : EuclideanSpace ℝ (Fin n)) 1, TopCat.disk.{u} n) := 19 ⟨ULift.up, continuous_uliftUp⟩ 20 let s : C(Metric.sphere (0 : EuclideanSpace ℝ (Fin n)) 1, TopCat.diskBoundary.{u} n) := 21 ⟨ULift.up, continuous_uliftUp⟩ 22 let h : ((f₀.comp b).comp sphereInclusion).Homotopy ((f₁.comp b).comp sphereInclusion) := 23 H.compContinuousMap s 24 obtain ⟨F, hF⟩ := contractible_extends_ball_homotopy (f₀.comp b) (f₁.comp b) h 25 let d : C(TopCat.disk.{u} n, Metric.closedBall (0 : EuclideanSpace ℝ (Fin n)) 1) := 26 ⟨ULift.down, continuous_uliftDown⟩ 27 exact ⟨F.compContinuousMap d, fun t x => hF t x.down⟩ 28 29 /-- Endpoint-preserving extension of a continuous family of boundary paths. -/ 30 theorem contractible_disk_path_lifting {Y : Type*} [TopologicalSpace Y] 31 [ContractibleSpace Y] (n : ℕ) 32 (a : C(TopCat.diskBoundary.{u} n, C(I,Y))) (f₀ f₁ : C(TopCat.disk.{u} n, Y)) 33 (h₀ : ∀ s, a s 0 = f₀ ((TopCat.diskBoundaryInclusion n) s)) 34 (h₁ : ∀ s, a s 1 = f₁ ((TopCat.diskBoundaryInclusion n) s)) : 35 ∃ F : C(TopCat.disk.{u} n, C(I,Y)), 36 (∀ s, F ((TopCat.diskBoundaryInclusion n) s) = a s) ∧ 37 (∀ x, F x 0 = f₀ x) ∧ (∀ x, F x 1 = f₁ x) := by 38 let H : (f₀.comp (TopCat.diskBoundaryInclusion n).hom).Homotopy 39 (f₁.comp (TopCat.diskBoundaryInclusion n).hom) := 40 { toContinuousMap := a.uncurry.comp ContinuousMap.prodSwap, 41 map_zero_left := h₀, map_one_left := h₁ } 42 obtain ⟨G, hG⟩ := contractible_extends_disk_homotopy n f₀ f₁ H 43 refine ⟨(G.toContinuousMap.comp ContinuousMap.prodSwap).curry, ?_, ?_, ?_⟩ 44 · intro s 45 exact ContinuousMap.ext (fun t => hG t s) 46 · exact G.apply_zero 47 · exact G.apply_one 48 49 end BC4lean.ProperActions
源码 SHA-256:b554da811b2a95fb6ba3aeff73ecc81428400d2112c2fbed62d3c3e05bd62464
1 import BC4lean.DiskPathLifting 2 import BC4lean.CellularExtension 3 import Mathlib.Topology.ContinuousMap.Algebra 4 5 /-! # Equivariant path evaluation and lifting across orbit cells -/ 6 7 noncomputable section 8 open scoped unitInterval 9 10 namespace BC4lean.ProperActions 11 12 universe u v 13 14 variable {Γ : Type u} {X : Type v} [Group Γ] [TopologicalSpace X] 15 variable [MulAction Γ X] [ContinuousConstSMul Γ X] 16 17 /-- Evaluation of an equivariant path at a fixed time. -/ 18 def pathEvaluation (t : I) : EquivariantMap Γ C(I,X) X where 19 toFun p := p t 20 continuous_toFun := continuous_eval_const t 21 map_smul' _ _ := rfl 22 23 /-- A path fixed by H is a continuous path in the H-fixed-point space. -/ 24 def fixedPathMap (H : Subgroup Γ) : 25 C(FixedPointSpace H C(I,X), C(I,FixedPointSpace H X)) where 26 toFun p := 27 ⟨fun t => ⟨p.1 t, fun h => congrArg (fun q : C(I,X) => q t) (p.2 h)⟩, 28 p.1.continuous.subtype_mk _⟩ 29 continuous_toFun := ContinuousMap.continuous_of_continuous_uncurry _ 30 (((continuous_subtype_val.comp continuous_fst).eval continuous_snd).subtype_mk _) 31 32 /-- A path in the fixed-point space gives an H-fixed path. -/ 33 def pathFixedMap (H : Subgroup Γ) : 34 C(C(I,FixedPointSpace H X), FixedPointSpace H C(I,X)) where 35 toFun p := ⟨⟨fun t => (p t).1, continuous_subtype_val.comp p.continuous⟩, 36 fun h => ContinuousMap.ext (fun t => (p t).2 h)⟩ 37 continuous_toFun := 38 (ContinuousMap.continuous_postcomp ⟨Subtype.val, continuous_subtype_val⟩).subtype_mk _ 39 40 @[simp] theorem pathFixedMap_fixedPathMap (H : Subgroup Γ) (p : FixedPointSpace H C(I,X)) : 41 pathFixedMap H (fixedPathMap H p) = p := by 42 apply Subtype.ext 43 exact ContinuousMap.ext (fun _ => rfl) 44 45 @[simp] theorem fixedPathMap_pathFixedMap (H : Subgroup Γ) (p : C(I,FixedPointSpace H X)) : 46 fixedPathMap H (pathFixedMap H p) = p := by 47 exact ContinuousMap.ext (fun _ => rfl) 48 49 variable [TopologicalSpace Γ] [DiscreteTopology Γ] 50 51 /-- Lift a family of boundary paths with prescribed disk endpoints across an orbit cell. -/ 52 theorem orbitCell_path_lifting (H : Subgroup Γ) [ContractibleSpace (FixedPointSpace H X)] 53 (n : ℕ) (a : EquivariantMap Γ (OrbitCell H (TopCat.diskBoundary.{u} n)) C(I,X)) 54 (f₀ f₁ : EquivariantMap Γ (OrbitCell H (TopCat.disk.{u} n)) X) 55 (h₀ : (pathEvaluation 0).comp a = f₀.comp (OrbitCell.boundaryInclusion H n)) 56 (h₁ : (pathEvaluation 1).comp a = f₁.comp (OrbitCell.boundaryInclusion H n)) : 57 ∃ F : EquivariantMap Γ (OrbitCell H (TopCat.disk.{u} n)) C(I,X), 58 F.comp (OrbitCell.boundaryInclusion H n) = a ∧ 59 (pathEvaluation 0).comp F = f₀ ∧ (pathEvaluation 1).comp F = f₁ := by 60 let a' := (fixedPathMap H).comp (cellEvaluation H a) 61 obtain ⟨v, hv, hzero, hone⟩ := contractible_disk_path_lifting n a' 62 (cellEvaluation H f₀) (cellEvaluation H f₁) 63 (fun s => Subtype.ext (congrArg (fun f => f (QuotientGroup.mk 1,s)) h₀)) 64 (fun s => Subtype.ext (congrArg (fun f => f (QuotientGroup.mk 1,s)) h₁)) 65 let F := cellFromFixed H ((pathFixedMap H).comp v) 66 have he : cellEvaluation H F = (pathFixedMap H).comp v := 67 (orbitCellMapEquiv H).apply_symm_apply _ 68 refine ⟨F, ?_, ?_, ?_⟩ 69 · apply (orbitCellMapEquiv H).injective 70 change cellEvaluation H (F.comp (OrbitCell.map H (TopCat.diskBoundaryInclusion n).hom)) = 71 cellEvaluation H a 72 rw [cellEvaluation_comp, he] 73 apply ContinuousMap.ext 74 intro s 75 change pathFixedMap H (v ((TopCat.diskBoundaryInclusion n) s)) = cellEvaluation H a s 76 rw [hv] 77 exact pathFixedMap_fixedPathMap H _ 78 · apply (orbitCellMapEquiv H).injective 79 apply ContinuousMap.ext 80 intro x 81 apply Subtype.ext 82 have hx := congrArg (fun p : FixedPointSpace H C(I,X) => p.1 0) 83 (ContinuousMap.congr_fun he x) 84 exact hx.trans (congrArg Subtype.val (hzero x)) 85 · apply (orbitCellMapEquiv H).injective 86 apply ContinuousMap.ext 87 intro x 88 apply Subtype.ext 89 have hx := congrArg (fun p : FixedPointSpace H C(I,X) => p.1 1) 90 (ContinuousMap.congr_fun he x) 91 exact hx.trans (congrArg Subtype.val (hone x)) 92 93 end BC4lean.ProperActions
源码 SHA-256:7eb1481cc8ab584e5d14c252e546f89239fedc95a31aef133fc0d3013026ec4f
1 import BC4lean.EquivariantPathLifting 2 3 /-! # Homotopy uniqueness for maps from equivariant CW complexes -/ 4 5 noncomputable section 6 open CategoryTheory CategoryTheory.Limits 7 open scoped unitInterval 8 9 namespace BC4lean.ProperActions 10 11 universe u 12 13 variable {Γ : Type u} [Group Γ] [TopologicalSpace Γ] [DiscreteTopology Γ] 14 variable {X : Type u} [TopologicalSpace X] [MulAction Γ X] [ContinuousConstSMul Γ X] 15 16 /-- The equivariant map recording both endpoints of a path. -/ 17 def pathEndpointPair : EquivariantMap Γ C(I,X) (X × X) where 18 toFun p := (p 0, p 1) 19 continuous_toFun := (continuous_eval_const 0).prodMk (continuous_eval_const 1) 20 map_smul' _ _ := rfl 21 22 /-- Contractible fixed-point targets lift orbit cells against path endpoint evaluation. -/ 23 theorem basicCell_path_hasLiftingProperty (h : FixedPointCriterion Γ X) 24 (n : ℕ) (H : FiniteIsotropy Γ) : 25 HasLiftingProperty (equivariantBasicCell n H) (pathEndpointPair (Γ := Γ) (X := X)).toActionHom := by 26 constructor 27 intro a b sq 28 let : ContractibleSpace (FixedPointSpace H.val X) := h.1 H.val H.property 29 let a' := EquivariantMap.ofActionHom a 30 let b' := EquivariantMap.ofActionHom b 31 let f₀ : EquivariantMap Γ (OrbitCell H.val (TopCat.disk.{u} n)) X := 32 { toFun := fun x => (b' x).1, 33 continuous_toFun := continuous_fst.comp b'.continuous, 34 map_smul' := fun g x => congrArg Prod.fst (b'.map_smul g x) } 35 let f₁ : EquivariantMap Γ (OrbitCell H.val (TopCat.disk.{u} n)) X := 36 { toFun := fun x => (b' x).2, 37 continuous_toFun := continuous_snd.comp b'.continuous, 38 map_smul' := fun g x => congrArg Prod.snd (b'.map_smul g x) } 39 obtain ⟨F, hi, h₀, h₁⟩ := orbitCell_path_lifting H.val n a' f₀ f₁ 40 (EquivariantMap.ext fun x => congrArg (fun k => (k.hom x).1) sq.w) 41 (EquivariantMap.ext fun x => congrArg (fun k => (k.hom x).2) sq.w) 42 refine ⟨⟨{ l := F.toActionHom, fac_left := ?_, fac_right := ?_ }⟩⟩ 43 · exact (congrArg EquivariantMap.toActionHom hi).trans 44 (EquivariantMap.actionHomEquiv.apply_symm_apply a) 45 · apply Action.Hom.ext 46 apply TopCat.hom_ext 47 apply ContinuousMap.ext 48 intro x 49 exact Prod.ext (congrArg (fun f => f x) h₀) (congrArg (fun f => f x) h₁) 50 51 /-- Path endpoint lifting extends from cells to every relative equivariant CW structure. -/ 52 theorem RelativeEquivariantCWComplex.path_hasLiftingProperty 53 {A B : Action TopCat.{u} Γ} {i : A ⟶ B} 54 (c : RelativeEquivariantCWComplex i) (h : FixedPointCriterion Γ X) : 55 HasLiftingProperty i (pathEndpointPair (Γ := Γ) (X := X)).toActionHom := by 56 let W := MorphismProperty.ofHoms (fun p : ℕ × FiniteIsotropy Γ => equivariantBasicCell p.1 p.2) 57 have hc : ∀ s : c.Cells, W (equivariantBasicCell s.j s.i) := 58 fun s => MorphismProperty.ofHoms.mk (s.j, s.i) 59 have hr : W.rlp (pathEndpointPair (Γ := Γ) (X := X)).toActionHom := by 60 intro A B f hf 61 cases hf with 62 | mk p => exact basicCell_path_hasLiftingProperty h p.1 p.2 63 exact W.transfiniteCompositionsOfShape_pushouts_coproducts_le_llp_rlp ℕ i 64 ⟨c.transfiniteCompositionOfShape' hc⟩ _ hr 65 66 variable {A : Type u} [TopologicalSpace A] [MulAction Γ A] [ContinuousConstSMul Γ A] 67 68 /-- Any two maps from an equivariant CW complex into a fixed-point-criterion target are homotopic. -/ 69 theorem EquivariantCWComplex.homotopic (c : EquivariantCWComplex (topologicalAction Γ A)) 70 (h : FixedPointCriterion Γ X) (f g : EquivariantMap Γ A X) : EquivariantlyHomotopic f g := by 71 let b : EquivariantMap Γ A (X × X) := 72 { toFun := fun x => (f x, g x), continuous_toFun := f.continuous.prodMk g.continuous, 73 map_smul' := fun a x => Prod.ext (f.map_smul a x) (g.map_smul a x) } 74 let := c.path_hasLiftingProperty h 75 let sq : CommSq (initial.to (topologicalAction Γ C(I,X))) 76 (initial.to (topologicalAction Γ A)) (pathEndpointPair (Γ := Γ) (X := X)).toActionHom 77 b.toActionHom := ⟨initialIsInitial.hom_ext _ _⟩ 78 let F := EquivariantMap.ofActionHom sq.lift 79 have he (x : A) : (F x 0, F x 1) = (f x, g x) := 80 congrArg (fun k => k.hom x) sq.fac_right 81 refine ⟨{ toHomotopy := 82 { toFun := fun p => F p.2 p.1, 83 continuous_toFun := (F.continuous.comp continuous_snd).eval continuous_fst, 84 map_zero_left := fun x => congrArg Prod.fst (he x), 85 map_one_left := fun x => congrArg Prod.snd (he x) }, prop' := ?_ }⟩ 86 intro t a x 87 exact congrArg (fun p : C(I,X) => p t) (F.map_smul a x) 88 89 /-- The fixed-point criterion implies the homotopy-terminal mapping property for CW sources. -/ 90 theorem EquivariantCWComplex.homotopyTerminal (c : EquivariantCWComplex (topologicalAction Γ A)) 91 (h : FixedPointCriterion Γ X) : HomotopyTerminalFor Γ A X := by 92 obtain ⟨f⟩ := c.nonempty_map h 93 exact ⟨⟨EquivariantMap.ofActionHom f⟩, c.homotopic h⟩ 94 95 /-- Two equivariant CW spaces satisfying the fixed-point criterion are equivariantly homotopy equivalent. -/ 96 theorem EquivariantCWComplex.fixedPointCriterion_unique 97 (cA : EquivariantCWComplex (topologicalAction Γ A)) 98 (cX : EquivariantCWComplex (topologicalAction Γ X)) 99 (hA : FixedPointCriterion Γ A) (hX : FixedPointCriterion Γ X) : 100 Nonempty (EquivariantHomotopyEquiv Γ A X) := 101 homotopyTerminal_unique (cA.homotopyTerminal hX) (cX.homotopyTerminal hA) 102 (cA.homotopyTerminal hA) (cX.homotopyTerminal hX) 103 104 end BC4lean.ProperActions
源码 SHA-256:050c4dc32e1cc75adb91acd74294bb08dec1c2f7355c27b63be87acb006be675
1 import BC4lean.FixedPointCriterion 2 import Mathlib.Analysis.Convex.Contractible 3 import Mathlib.Topology.Algebra.InfiniteSum.Real 4 import Mathlib.Topology.Sequences 5 6 /-! # The probability simplex with pointwise convergence 7 8 This constructs a concrete Γ-space. No equivariant CW structure or local 9 compactness is assumed in this definition. 10 -/ 11 12 noncomputable section 13 open scoped BigOperators 14 15 namespace BC4lean.ProperActions 16 17 /-- Real nonnegative summable functions with total mass one. -/ 18 def probabilitySet (Γ : Type*) : Set (Γ → ℝ) := 19 {f | (∀ g, 0 ≤ f g) ∧ Summable f ∧ ∑' g, f g = 1} 20 21 /-- The probability simplex, with the subspace topology from pointwise convergence. -/ 22 abbrev ProbabilitySimplex (Γ : Type*) := probabilitySet Γ 23 24 /-- The probability simplex is convex in the real function space. -/ 25 theorem probabilitySet_convex (Γ : Type*) : Convex ℝ (probabilitySet Γ) := by 26 intro f hf g hg a b ha hb hab 27 refine ⟨fun x => add_nonneg (mul_nonneg ha (hf.1 x)) (mul_nonneg hb (hg.1 x)), 28 (hf.2.1.mul_left a).add (hg.2.1.mul_left b), ?_⟩ 29 change (∑' x, (a * f x + b * g x)) = 1 30 rw [Summable.tsum_add (hf.2.1.mul_left a) (hg.2.1.mul_left b), 31 tsum_mul_left, tsum_mul_left, hf.2.2, hg.2.2, mul_one, mul_one] 32 exact hab 33 34 namespace ProbabilitySimplex 35 variable {Γ : Type*} 36 37 /-- The unit mass at one index. -/ 38 def delta (g : Γ) : ProbabilitySimplex Γ := by 39 classical 40 refine ⟨Pi.single g 1, ?_, (by 41 convert (hasSum_ite_eq g (1 : ℝ)).summable using 1 42 funext x 43 simp [Pi.single_apply]), ?_⟩ 44 · intro x 45 by_cases h : x = g <;> simp [h] 46 · simp 47 48 /-- A finite set carries at most the total mass. -/ 49 theorem sum_le_one (p : ProbabilitySimplex Γ) (s : Finset Γ) : 50 ∑ g ∈ s, p.1 g ≤ 1 := by 51 rw [← p.2.2.2] 52 exact p.2.2.1.sum_le_tsum s (fun g _ => p.2.1 g) 53 54 /-- Every probability function has more than half its mass on some finite set. -/ 55 theorem exists_half_mass (p : ProbabilitySimplex Γ) : 56 ∃ s : Finset Γ, (1 / 2 : ℝ) < ∑ g ∈ s, p.1 g := by 57 by_contra! h 58 have hh := p.2.2.1.tsum_le_of_sum_le h 59 rw [p.2.2.2] at hh 60 norm_num at hh 61 62 variable [Group Γ] 63 64 /-- Left translation of a probability function. -/ 65 def translate (g : Γ) (p : ProbabilitySimplex Γ) : ProbabilitySimplex Γ := 66 ⟨fun x => p.1 (g⁻¹ * x), fun x => p.2.1 (g⁻¹ * x), 67 (Equiv.mulLeft g⁻¹).summable_iff.mpr p.2.2.1, 68 ((Equiv.mulLeft g⁻¹).tsum_eq p.1).trans p.2.2.2⟩ 69 70 instance instMulAction : MulAction Γ (ProbabilitySimplex Γ) where 71 smul := translate 72 one_smul p := by 73 apply Subtype.ext 74 funext x 75 change p.1 (1⁻¹ * x) = p.1 x 76 simp 77 mul_smul g h p := by 78 apply Subtype.ext 79 funext x 80 change p.1 ((g * h)⁻¹ * x) = p.1 (h⁻¹ * (g⁻¹ * x)) 81 simp [mul_assoc] 82 83 @[simp] theorem smul_apply (g : Γ) (p : ProbabilitySimplex Γ) (x : Γ) : 84 (g • p).1 x = p.1 (g⁻¹ * x) := rfl 85 86 instance instContinuousConstSMul : ContinuousConstSMul Γ (ProbabilitySimplex Γ) where 87 continuous_const_smul g := by 88 change Continuous (translate g) 89 apply Continuous.subtype_mk 90 exact continuous_pi fun x => (continuous_apply (g⁻¹ * x)).comp continuous_subtype_val 91 92 /-- The whole simplex is contractible; the fixed-subspace statement is proved separately. -/ 93 theorem contractible : ContractibleSpace (ProbabilitySimplex Γ) := 94 (probabilitySet_convex Γ).contractibleSpace ⟨(delta (1 : Γ)).1, (delta (1 : Γ)).2⟩ 95 96 end ProbabilitySimplex 97 end BC4lean.ProperActions
源码 SHA-256:b1ace22238429d73788cd7fb723631ac885c2ef44b0ca8b5ab6072ccf7802c05
1 import BC4lean.ProbabilitySimplex 2 3 /-! # Fixed points of the probability simplex -/ 4 5 noncomputable section 6 open scoped BigOperators 7 namespace BC4lean.ProperActions 8 9 variable {Γ : Type*} [Group Γ] 10 11 /-- The invariant probability functions for a subgroup, as a convex subset of function space. -/ 12 def invariantProbabilitySet (H : Subgroup Γ) : Set (Γ → ℝ) := 13 {f | f ∈ probabilitySet Γ ∧ ∀ h : H, ∀ x, f ((h : Γ)⁻¹ * x) = f x} 14 15 /-- Invariance and normalization are preserved under convex combinations. -/ 16 theorem invariantProbabilitySet_convex (H : Subgroup Γ) : 17 Convex ℝ (invariantProbabilitySet H) := by 18 intro f hf g hg a b ha hb hab 19 refine ⟨probabilitySet_convex Γ hf.1 hg.1 ha hb hab, ?_⟩ 20 intro h x 21 change a * f ((h : Γ)⁻¹ * x) + b * g ((h : Γ)⁻¹ * x) = a * f x + b * g x 22 rw [hf.2 h x, hg.2 h x] 23 24 /-- Fixed points are homeomorphic to the invariant convex subset. -/ 25 def probabilityFixedPointsHomeomorph (H : Subgroup Γ) : 26 FixedPointSpace H (ProbabilitySimplex Γ) ≃ₜ invariantProbabilitySet H where 27 toFun p := ⟨p.1.1, p.1.2, fun h x => congrArg (fun q : ProbabilitySimplex Γ => q.1 x) (p.2 h)⟩ 28 invFun f := ⟨⟨f.1, f.2.1⟩, fun h => Subtype.ext (funext (f.2.2 h))⟩ 29 left_inv _ := rfl 30 right_inv _ := rfl 31 continuous_toFun := (continuous_subtype_val.comp continuous_subtype_val).subtype_mk _ 32 continuous_invFun := (continuous_subtype_val.subtype_mk _).subtype_mk _ 33 34 /-- A finite subgroup has an invariant probability function: its uniform distribution. -/ 35 theorem invariantProbabilitySet_nonempty (H : Subgroup Γ) [Finite H] : 36 (invariantProbabilitySet H).Nonempty := by 37 classical 38 let := Fintype.ofFinite H 39 let c : ℝ := (Fintype.card H : ℝ)⁻¹ 40 let f : Γ → ℝ := (H : Set Γ).indicator (fun _ => c) 41 have hc : 0 ≤ c := by dsimp [c]; positivity 42 have hcard : (Fintype.card H : ℝ) ≠ 0 := by exact_mod_cast Fintype.card_ne_zero 43 refine ⟨f, ⟨?_, ?_, ?_⟩, ?_⟩ 44 · intro x 45 exact Set.indicator_nonneg (fun _ _ => hc) x 46 · exact summable_of_hasFiniteSupport ((Set.toFinite (H : Set Γ)).subset Set.support_indicator_subset) 47 · change (∑' x, (H : Set Γ).indicator (fun _ => c) x) = 1 48 rw [← tsum_subtype] 49 simp [tsum_fintype, c, hcard] 50 · intro h x 51 simp only [f, Set.indicator_apply, SetLike.mem_coe] 52 rw [H.mul_mem_cancel_left (H.inv_mem h.2)] 53 54 namespace ProbabilitySimplex 55 56 /-- Finite-subgroup fixed points of the simplex are contractible. -/ 57 theorem fixedPoints_contractible (H : Subgroup Γ) [Finite H] : 58 ContractibleSpace (FixedPointSpace H (ProbabilitySimplex Γ)) := by 59 let := (invariantProbabilitySet_convex H).contractibleSpace (invariantProbabilitySet_nonempty H) 60 exact (probabilityFixedPointsHomeomorph H).contractibleSpace 61 62 /-- Infinite subgroups have no invariant probability functions. -/ 63 theorem fixedPoints_empty (H : Subgroup Γ) [Infinite H] : 64 IsEmpty (FixedPointSpace H (ProbabilitySimplex Γ)) := by 65 classical 66 refine ⟨fun p => ?_⟩ 67 have hex : ∃ x, p.1.1 x ≠ 0 := by 68 by_contra! hz 69 have ht := p.1.2.2.2 70 simp only [hz, tsum_zero] at ht 71 norm_num at ht 72 obtain ⟨x, hx⟩ := hex 73 have hpos : 0 < p.1.1 x := lt_of_le_of_ne (p.1.2.1 x) (Ne.symm hx) 74 have hs : Summable (fun h : H => p.1.1 ((h : Γ) * x)) := 75 p.1.2.2.1.comp_injective (fun _ _ h => Subtype.ext (mul_right_cancel h)) 76 have he (h : H) : p.1.1 ((h : Γ) * x) = p.1.1 x := by 77 have hfix := congrArg (fun q : ProbabilitySimplex Γ => q.1 x) (p.2 h⁻¹) 78 change p.1.1 (((h⁻¹ : H) : Γ)⁻¹ * x) = p.1.1 x at hfix 79 simpa only [Subgroup.coe_inv, inv_inv] using hfix 80 simp only [he] at hs 81 let := Finite.of_summable_const hpos hs 82 exact not_finite H 83 84 /-- The concrete simplex satisfies the full finite/infinite subgroup criterion. -/ 85 theorem fixedPointCriterion : FixedPointCriterion Γ (ProbabilitySimplex Γ) := 86 ⟨fun H _ => fixedPoints_contractible H, fun H _ => fixedPoints_empty H⟩ 87 88 end ProbabilitySimplex 89 end BC4lean.ProperActions
源码 SHA-256:043065dbe31f65afde8c8c9d555252af7a2c2534105de2c2a5820048da71147f
1 import BC4lean.ProbabilitySimplex 2 import BC4lean.ProperActions 3 4 /-! # Properness of the probability-simplex action 5 6 Compact sets of probability functions are uniformly concentrated on a finite 7 set of coordinates. This bounds all compact transporters by a finite set. 8 -/ 9 10 noncomputable section 11 open scoped BigOperators Pointwise Classical 12 13 namespace BC4lean.ProperActions.ProbabilitySimplex 14 15 variable {Γ : Type*} 16 17 /-- On a compact set of probability functions, a single finite set carries more than half the mass. -/ 18 theorem compact_half_mass {K : Set (ProbabilitySimplex Γ)} (hK : IsCompact K) : 19 ∃ s : Finset Γ, ∀ p ∈ K, (1 / 2 : ℝ) < ∑ g ∈ s, p.1 g := by 20 classical 21 let U (s : Finset Γ) : Set (ProbabilitySimplex Γ) := {p | (1 / 2 : ℝ) < ∑ g ∈ s, p.1 g} 22 have ho (s : Finset Γ) : IsOpen (U s) := 23 isOpen_lt continuous_const (continuous_finsetSum s fun g _ => 24 (continuous_apply g).comp continuous_subtype_val) 25 have hc : K ⊆ ⋃ s, U s := by 26 intro p _ 27 obtain ⟨s, hs⟩ := exists_half_mass p 28 exact Set.mem_iUnion.mpr ⟨s, hs⟩ 29 obtain ⟨S, hS⟩ := hK.elim_finite_subcover U ho hc 30 refine ⟨S.biUnion id, fun p hp => ?_⟩ 31 obtain ⟨s, hs, hps⟩ := Set.mem_iUnion₂.mp (hS hp) 32 apply lt_of_lt_of_le hps 33 exact Finset.sum_le_sum_of_subset_of_nonneg 34 (fun g hg => Finset.mem_biUnion.mpr ⟨s, hs, hg⟩) (fun g _ _ => p.2.1 g) 35 36 /-- Two finite sets each carrying more than half the mass must intersect. -/ 37 theorem half_mass_inter (p : ProbabilitySimplex Γ) (s t : Finset Γ) 38 (hs : (1 / 2 : ℝ) < ∑ g ∈ s, p.1 g) (ht : (1 / 2 : ℝ) < ∑ g ∈ t, p.1 g) : 39 (s ∩ t).Nonempty := by 40 classical 41 by_contra h 42 have hd : Disjoint s t := Finset.disjoint_iff_inter_eq_empty.mpr 43 (Finset.not_nonempty_iff_eq_empty.mp h) 44 have hle := sum_le_one p (s ∪ t) 45 rw [Finset.sum_union hd] at hle 46 linarith 47 48 variable [Group Γ] 49 50 /-- Translation preserves the mass assigned to a finite set. -/ 51 theorem sum_translate_image (g : Γ) (p : ProbabilitySimplex Γ) (s : Finset Γ) : 52 ∑ x ∈ s.image (fun y => g * y), (g • p).1 x = ∑ y ∈ s, p.1 y := by 53 classical 54 rw [Finset.sum_image (fun _ _ _ _ h => mul_left_cancel h)] 55 simp 56 57 /-- Compact subsets have finite transporters under left translation. -/ 58 theorem finite_compact_transporter {K L : Set (ProbabilitySimplex Γ)} 59 (hK : IsCompact K) (hL : IsCompact L) : 60 {g : Γ | (g • K ∩ L).Nonempty}.Finite := by 61 classical 62 obtain ⟨s, hs⟩ := compact_half_mass hK 63 obtain ⟨t, ht⟩ := compact_half_mass hL 64 apply ((t.product s).image (fun p => p.1 * p.2⁻¹)).finite_toSet.subset 65 intro g hg 66 obtain ⟨q, hq, hqL⟩ := hg 67 obtain ⟨p, hp, rfl⟩ := hq 68 have himage : (1 / 2 : ℝ) < ∑ x ∈ s.image (fun y => g * y), (g • p).1 x := by 69 rw [sum_translate_image] 70 exact hs p hp 71 obtain ⟨x, hx⟩ := half_mass_inter (g • p) (s.image (fun y => g * y)) t himage (ht _ hqL) 72 obtain ⟨hx, hxt⟩ := Finset.mem_inter.mp hx 73 obtain ⟨y, hys, rfl⟩ := Finset.mem_image.mp hx 74 exact Finset.mem_image.mpr ⟨(g * y,y), Finset.mem_product.mpr ⟨hxt,hys⟩, by simp⟩ 75 76 /-- The simplex action is properly discontinuous. -/ 77 theorem properlyDiscontinuous : ProperlyDiscontinuousSMul Γ (ProbabilitySimplex Γ) := 78 properlyDiscontinuousSMul_iff.mpr (fun hK hL => finite_compact_transporter hK hL) 79 80 /-- For countable discrete groups the probability simplex is a proper Γ-space. -/ 81 theorem proper [Countable Γ] [TopologicalSpace Γ] [DiscreteTopology Γ] : 82 ProperSMul Γ (ProbabilitySimplex Γ) := 83 properlyDiscontinuousSMul_iff_properSMul.mp properlyDiscontinuous 84 85 end BC4lean.ProperActions.ProbabilitySimplex
源码 SHA-256:e83a100f91a099c1964adc4daad97eaafed47887f8fd9f2c6db98ba65df3e82b
1 import BC4lean.EquivariantMaps 2 import BC4lean.ProperActions 3 4 /-! # Properness transferred along an equivariant map -/ 5 6 open Filter Topology 7 8 namespace BC4lean.ProperActions 9 10 variable {Γ A X : Type*} [Group Γ] [TopologicalSpace Γ] 11 variable [TopologicalSpace A] [TopologicalSpace X] [MulAction Γ A] [MulAction Γ X] 12 13 /-- A Hausdorff continuous Γ-space mapping equivariantly to a proper Γ-space is proper. -/ 14 theorem EquivariantMap.properSMul [T2Space A] [ContinuousSMul Γ A] [ProperSMul Γ X] 15 (f : EquivariantMap Γ A X) : ProperSMul Γ A := by 16 apply properSMul_iff_continuousSMul_ultrafilter_tendsto_t2.mpr 17 refine ⟨inferInstance, fun U a b hab => ?_⟩ 18 let m : Γ × A → Γ × X := fun p => (p.1, f p.2) 19 let V := U.map m 20 have hv : Tendsto (fun p : Γ × X => (p.1 • p.2,p.2)) V (𝓝 (f a,f b)) := by 21 rw [show (V : Filter (Γ × X)) = Filter.map m U from Ultrafilter.coe_map m U, 22 tendsto_map'_iff] 23 have ht := ((f.continuous.prodMap f.continuous).tendsto (a,b)).comp hab 24 simpa only [Function.comp_def, Prod.map_apply, m, f.map_smul] using ht 25 obtain ⟨g, _, hg⟩ := 26 (properSMul_iff_continuousSMul_ultrafilter_tendsto.mp (inferInstance : ProperSMul Γ X)).2 27 V (f a) (f b) hv 28 refine ⟨g, ?_⟩ 29 simpa only [V, Ultrafilter.coe_map, tendsto_map'_iff, Function.comp_def, m] using hg 30 31 end BC4lean.ProperActions
源码 SHA-256:6fe85e9dc4184e573dc23ffd9b6828774cc74c2c43cc26ed46d3cc66976e51d0
1 import BC4lean.ProbabilityFixedPoints 2 import BC4lean.ProbabilityProperAction 3 import BC4lean.ProperActionPullback 4 import BC4lean.CellularHomotopy 5 6 /-! # A concrete proper target for the cellular mapping theorem 7 8 This module does not equip the probability simplex with a CW structure and 9 does not assert that it is locally compact. It constructs the target and 10 proves the mapping property for equivariant CW sources. 11 -/ 12 13 namespace BC4lean.ProperActions 14 15 universe u 16 variable {Γ : Type u} [Group Γ] [TopologicalSpace Γ] [DiscreteTopology Γ] 17 variable {A : Type u} [TopologicalSpace A] [MulAction Γ A] [ContinuousConstSMul Γ A] 18 19 /-- Every finite-isotropy equivariant CW complex maps to the explicit probability simplex, 20 uniquely up to equivariant homotopy. -/ 21 theorem EquivariantCWComplex.probability_homotopyTerminal 22 (c : EquivariantCWComplex (topologicalAction Γ A)) : 23 HomotopyTerminalFor Γ A (ProbabilitySimplex Γ) := 24 c.homotopyTerminal ProbabilitySimplex.fixedPointCriterion 25 26 omit [Group Γ] [TopologicalSpace Γ] [DiscreteTopology Γ] in 27 /-- For countable Γ, the explicit target has a countable base. -/ 28 theorem ProbabilitySimplex.secondCountable [Countable Γ] : 29 SecondCountableTopology (ProbabilitySimplex Γ) := inferInstance 30 31 /-- For a countable group, the concrete target is proper and has the full cellular mapping property. -/ 32 theorem probability_proper_universal_target [Countable Γ] 33 (c : EquivariantCWComplex (topologicalAction Γ A)) : 34 ProperSMul Γ (ProbabilitySimplex Γ) ∧ HomotopyTerminalFor Γ A (ProbabilitySimplex Γ) := 35 ⟨ProbabilitySimplex.proper, c.probability_homotopyTerminal⟩ 36 37 /-- A Hausdorff finite-isotropy equivariant CW space has a proper action for countable Γ. 38 The following unconditional result supplies Hausdorffness from the categorical CW data. -/ 39 theorem EquivariantCWComplex.proper_of_t2 [Countable Γ] [T2Space A] 40 (c : EquivariantCWComplex (topologicalAction Γ A)) : ProperSMul Γ A := by 41 let : ProperSMul Γ (ProbabilitySimplex Γ) := ProbabilitySimplex.proper 42 let : ContinuousSMul Γ A := ⟨continuous_prod_of_discrete_left.mpr continuous_const_smul⟩ 43 obtain ⟨f⟩ := c.probability_homotopyTerminal.1 44 exact f.properSMul 45 46 47 /-- A finite-isotropy equivariant CW space has a proper action for every countable discrete group. 48 Hausdorffness is derived from the cellular data, rather than imposed as a separate hypothesis. -/ 49 theorem EquivariantCWComplex.proper [Countable Γ] 50 (c : EquivariantCWComplex (topologicalAction Γ A)) : ProperSMul Γ A := by 51 let : T2Space A := c.t2Space 52 exact c.proper_of_t2 53 54 end BC4lean.ProperActions 55 56 noncomputable section 57 set_option backward.isDefEq.respectTransparency false 58 59 namespace BC4lean.ProperActions 60 universe u 61 variable (Γ : Type u) [Group Γ] [TopologicalSpace Γ] [DiscreteTopology Γ] 62 63 namespace UniversalZeroSkeleton 64 /-- The constructed universal zero-skeleton is a proper Γ-space. -/ 65 theorem proper [Countable Γ] : ProperSMul Γ (UniversalZeroSkeleton Γ) := cwComplex.proper 66 67 /-- Infinite subgroups have no fixed vertices. -/ 68 theorem infinite_fixedPoints_empty [Countable Γ] (H : Subgroup Γ) [Infinite H] : 69 IsEmpty (FixedPointSpace H (UniversalZeroSkeleton Γ)) := by 70 let := proper Γ 71 exact fixedPointSpace_isEmpty H 72 end UniversalZeroSkeleton 73 74 /-- A concrete one-orbit zero-dimensional CW model for a finite group. -/ 75 abbrev FiniteGroupCWModel [Finite Γ] := 76 OrbitZeroSkeleton (fun _ : PUnit.{u+1} => (⟨⊤, inferInstance⟩ : FiniteIsotropy Γ)) 77 78 namespace FiniteGroupCWModel 79 variable [Finite Γ] 80 instance : Subsingleton (FiniteGroupCWModel Γ) := by 81 let : Subsingleton (Γ ⧸ (⊤ : Subgroup Γ)) := QuotientGroup.subsingleton_quotient_top 82 change Subsingleton (Σ _ : PUnit.{u+1}, OrbitCell (⊤ : Subgroup Γ) (TopCat.disk.{u} 0)) 83 let : Subsingleton (OrbitCell (⊤ : Subgroup Γ) (TopCat.disk.{u} 0)) := 84 inferInstanceAs (Subsingleton ((Γ ⧸ (⊤ : Subgroup Γ)) × TopCat.disk.{u} 0)) 85 constructor 86 rintro ⟨⟨⟩, x⟩ ⟨⟨⟩, y⟩ 87 exact congrArg (Sigma.mk PUnit.unit) (Subsingleton.elim x y) 88 instance : Nonempty (FiniteGroupCWModel Γ) := 89 ⟨⟨PUnit.unit, QuotientGroup.mk 1, ⟨⟨0, by simp⟩⟩⟩⟩ 90 91 /-- The finite-group model has an actual CW structure with one zero-cell orbit. -/ 92 def cwComplex : EquivariantCWComplex (topologicalAction Γ (FiniteGroupCWModel Γ)) := 93 OrbitZeroSkeleton.cwComplex _ 94 95 omit [DiscreteTopology Γ] in 96 /-- Every subgroup fixed-point space of this one-point model is contractible. -/ 97 theorem fixedPoints_contractible (H : Subgroup Γ) : 98 ContractibleSpace (FixedPointSpace H (FiniteGroupCWModel Γ)) := by 99 let : Nonempty (FixedPointSpace H (FiniteGroupCWModel Γ)) := 100 ⟨⟨Classical.choice inferInstance, fun _ => Subsingleton.elim _ _⟩⟩ 101 infer_instance 102 103 omit [DiscreteTopology Γ] in 104 /-- For finite groups the explicit CW model satisfies the full fixed-point criterion. -/ 105 theorem fixedPointCriterion : FixedPointCriterion Γ (FiniteGroupCWModel Γ) := by 106 refine ⟨fun H _ => fixedPoints_contractible Γ H, ?_⟩ 107 intro H hH 108 let := hH 109 exact False.elim (not_finite H) 110 111 /-- The finite-group model is proper, locally compact, and second countable. -/ 112 theorem proper_locallyCompact_secondCountable : 113 ProperSMul Γ (FiniteGroupCWModel Γ) ∧ LocallyCompactSpace (FiniteGroupCWModel Γ) ∧ 114 SecondCountableTopology (FiniteGroupCWModel Γ) := 115 ⟨(cwComplex Γ).proper, OrbitZeroSkeleton.locallyCompact _, inferInstance⟩ 116 117 /-- The finite-group CW model has the universal mapping property for every CW source. -/ 118 theorem homotopyTerminal {A : Type u} [TopologicalSpace A] [MulAction Γ A] 119 [ContinuousConstSMul Γ A] (c : EquivariantCWComplex (topologicalAction Γ A)) : 120 HomotopyTerminalFor Γ A (FiniteGroupCWModel Γ) := 121 c.homotopyTerminal (fixedPointCriterion Γ) 122 end FiniteGroupCWModel 123 end BC4lean.ProperActions 124 125 end
源码 SHA-256:fd6d940f19d329bab386f23b090ec1ae4539ca73a4c57d6234045eff5dcf1130
1 import Mathlib.Analysis.CStarAlgebra.Module.Constructions 2 3 /-! # Right Hilbert C⋆-module foundations 4 5 We use `CStarModule Bᵐᵒᵖ E`: the right action `x b` is `MulOpposite.op b • x`, 6 and the usual B-valued inner product is `MulOpposite.unop (inner Bᵐᵒᵖ x y)`. 7 This explicit opposite is necessary because the pinned Mathlib convention has 8 `inner x (a • y) = a * inner x y`. Completeness is an additional 9 `CompleteSpace E` assumption when a Hilbert (rather than pre-Hilbert) module 10 is required. The results below also hold before completion and for nonunital B. 11 -/ 12 13 noncomputable section 14 namespace BC4lean.KKTheory 15 16 open scoped InnerProductSpace 17 open CStarModule 18 19 variable {B E : Type*} [NonUnitalCStarAlgebra B] [PartialOrder B] 20 [NormedAddCommGroup E] [NormedSpace ℂ E] [SMul Bᵐᵒᵖ E] [CStarModule Bᵐᵒᵖ E] 21 22 /-- Nondegeneracy in the first variable. -/ 23 theorem module_inner_ext_left {x y : E} GitHub source 24 (h : ∀ z, ⟪x, z⟫_(Bᵐᵒᵖ) = ⟪y, z⟫_(Bᵐᵒᵖ)) : x = y := by 25 apply sub_eq_zero.mp 26 apply (CStarModule.inner_self (A := Bᵐᵒᵖ)).mp 27 rw [CStarModule.inner_sub_left, h, sub_self] 28 29 /-- Nondegeneracy in the second variable. -/ 30 theorem module_inner_ext_right {x y : E} GitHub source 31 (h : ∀ z, ⟪z, x⟫_(Bᵐᵒᵖ) = ⟪z, y⟫_(Bᵐᵒᵖ)) : x = y := by 32 apply module_inner_ext_left (B := B) 33 intro z 34 simpa only [CStarModule.star_inner] using congrArg star (h z) 35 36 /-- The scalar action distributes over addition in the coefficient algebra. -/ 37 theorem module_add_smul (a b : Bᵐᵒᵖ) (x : E) : (a + b) • x = a • x + b • x := by GitHub source 38 apply module_inner_ext_right (B := B) 39 intro z 40 simp only [inner_op_smul_right, CStarModule.inner_add_right, add_mul] 41 42 /-- The scalar action distributes over addition in the module. -/ 43 theorem module_smul_add (a : Bᵐᵒᵖ) (x y : E) : a • (x + y) = a • x + a • y := by GitHub source 44 apply module_inner_ext_right (B := B) 45 intro z 46 simp only [inner_op_smul_right, CStarModule.inner_add_right, mul_add] 47 48 /-- Associativity of the right action, expressed with opposite coefficients. -/ 49 theorem module_mul_smul (a b : Bᵐᵒᵖ) (x : E) : (a * b) • x = a • (b • x) := by GitHub source 50 apply module_inner_ext_right (B := B) 51 intro z 52 simp only [inner_op_smul_right, mul_assoc] 53 54 /-- Compatibility of complex multiplication with the coefficient action. -/ 55 theorem module_complex_smul (c : ℂ) (a : Bᵐᵒᵖ) (x : E) : GitHub source 56 (c • a) • x = c • (a • x) := by 57 apply module_inner_ext_right (B := B) 58 intro z 59 simp only [inner_op_smul_right, inner_smul_right_complex, smul_mul_assoc] 60 61 /-- The module action is contractive; no bound on it is assumed. -/ 62 theorem module_norm_smul_le (a : Bᵐᵒᵖ) (x : E) : ‖a • x‖ ≤ ‖a‖ * ‖x‖ := by GitHub source 63 have h : ‖a • x‖ ^ 2 ≤ (‖a‖ * ‖x‖) ^ 2 := by 64 calc 65 ‖a • x‖ ^ 2 = ‖a * ⟪x, x⟫_(Bᵐᵒᵖ) * star a‖ := by 66 rw [CStarModule.norm_sq_eq (Bᵐᵒᵖ), inner_op_smul_right, inner_op_smul_left, ← mul_assoc] 67 _ ≤ ‖a‖ * ‖⟪x, x⟫_(Bᵐᵒᵖ)‖ * ‖star a‖ := norm_mul₃_le 68 _ = (‖a‖ * ‖x‖) ^ 2 := by 69 rw [norm_star, ← CStarModule.norm_sq_eq (Bᵐᵒᵖ)] 70 ring 71 exact (pow_le_pow_iff_left₀ (_root_.norm_nonneg _) (by positivity) (by decide : 2 ≠ 0)).mp h 72 73 variable [StarOrderedRing B] 74 75 /-- The standard right module over B has the usual B-valued inner product. -/ 76 theorem standard_module_inner (x y : B) : GitHub source 77 MulOpposite.unop ⟪MulOpposite.op x, MulOpposite.op y⟫_(Bᵐᵒᵖ) = star x * y := rfl 78 79 omit [PartialOrder B] [StarOrderedRing B] in 80 /-- The standard right module is complete. -/ 81 theorem standard_module_complete : CompleteSpace Bᵐᵒᵖ := inferInstance GitHub source 82 83 end BC4lean.KKTheory
源码 SHA-256:8fb98856ffd3521f889d54e0c04dd1dfe893c277b0891394e20c6d47ee36728d
1 import BC4lean.HilbertCStarModule 2 3 /-! # Adjointable maps of right Hilbert C⋆-modules 4 5 An adjointable map is a bounded complex-linear map with a bounded adjoint for 6 the coefficient-valued inner product. Module linearity is proved from the 7 adjoint identity. Completeness is not needed for these algebraic identities. 8 -/ 9 10 noncomputable section 11 namespace BC4lean.KKTheory 12 13 open scoped InnerProductSpace 14 open CStarModule 15 16 variable {B E F G H : Type*} [NonUnitalCStarAlgebra B] [PartialOrder B] 17 [NormedAddCommGroup E] [NormedSpace ℂ E] [SMul Bᵐᵒᵖ E] [CStarModule Bᵐᵒᵖ E] 18 [NormedAddCommGroup F] [NormedSpace ℂ F] [SMul Bᵐᵒᵖ F] [CStarModule Bᵐᵒᵖ F] 19 [NormedAddCommGroup G] [NormedSpace ℂ G] [SMul Bᵐᵒᵖ G] [CStarModule Bᵐᵒᵖ G] 20 [NormedAddCommGroup H] [NormedSpace ℂ H] [SMul Bᵐᵒᵖ H] [CStarModule Bᵐᵒᵖ H] 21 22 /-- A bounded adjointable map, storing its uniquely determined adjoint. -/ 23 structure AdjointableMap (B E F : Type*) [NonUnitalCStarAlgebra B] GitHub source 24 [PartialOrder B] 25 [NormedAddCommGroup E] [NormedSpace ℂ E] [SMul Bᵐᵒᵖ E] [CStarModule Bᵐᵒᵖ E] 26 [NormedAddCommGroup F] [NormedSpace ℂ F] [SMul Bᵐᵒᵖ F] [CStarModule Bᵐᵒᵖ F] where 27 toCLM : E →L[ℂ] F 28 adjointCLM : F →L[ℂ] E 29 adjoint_identity : ∀ x y, ⟪toCLM x, y⟫_(Bᵐᵒᵖ) = ⟪x, adjointCLM y⟫_(Bᵐᵒᵖ) 30 31 namespace AdjointableMap 32 33 instance instCoeFun : CoeFun (AdjointableMap B E F) (fun _ => E → F) := ⟨fun T => T.toCLM⟩ 34 35 /-- Uniqueness of an adjoint. -/ 36 theorem adjoint_unique (T : AdjointableMap B E F) (S : F →L[ℂ] E) GitHub source 37 (hS : ∀ x y, ⟪T x, y⟫_(Bᵐᵒᵖ) = ⟪x, S y⟫_(Bᵐᵒᵖ)) : S = T.adjointCLM := by 38 ext y 39 apply module_inner_ext_right (B := B) 40 intro x 41 rw [← hS, T.adjoint_identity] 42 43 @[ext] theorem ext {S T : AdjointableMap B E F} (h : ∀ x, S x = T x) : S = T := by 44 have hf : S.toCLM = T.toCLM := ContinuousLinearMap.ext h 45 have ha : S.adjointCLM = T.adjointCLM := T.adjoint_unique S.adjointCLM (by 46 intro x y 47 rw [← h x] 48 exact S.adjoint_identity x y) 49 cases S 50 cases T 51 cases hf 52 cases ha 53 rfl 54 55 /-- Every adjointable complex-linear map respects the right coefficient action. -/ 56 @[simp] theorem map_op_smul (T : AdjointableMap B E F) (a : Bᵐᵒᵖ) (x : E) : GitHub source 57 T (a • x) = a • T x := by 58 apply module_inner_ext_left (B := B) 59 intro y 60 rw [T.adjoint_identity, inner_op_smul_left, inner_op_smul_left, T.adjoint_identity] 61 62 /-- The adjoint as an adjointable map in the reverse direction. -/ 63 def adjoint (T : AdjointableMap B E F) : AdjointableMap B F E where 64 toCLM := T.adjointCLM 65 adjointCLM := T.toCLM 66 adjoint_identity x y := by 67 simpa only [CStarModule.star_inner] using (congrArg star (T.adjoint_identity y x)).symm 68 69 @[simp] theorem adjoint_adjoint (T : AdjointableMap B E F) : T.adjoint.adjoint = T := rfl GitHub source 70 71 /-- Zero adjointable map. -/ 72 def zero : AdjointableMap B E F where 73 toCLM := 0 74 adjointCLM := 0 75 adjoint_identity _ _ := by simp 76 77 @[simp] theorem zero_apply (x : E) : (zero : AdjointableMap B E F) x = 0 := rfl 78 79 @[simp] theorem adjoint_zero : (zero : AdjointableMap B E F).adjoint = zero := rfl 80 81 /-- Identity adjointable operator. -/ 82 def id : AdjointableMap B E E where 83 toCLM := ContinuousLinearMap.id ℂ E 84 adjointCLM := ContinuousLinearMap.id ℂ E 85 adjoint_identity _ _ := rfl 86 87 @[simp] theorem id_apply (x : E) : (id : AdjointableMap B E E) x = x := rfl 88 89 @[simp] theorem adjoint_id : (id : AdjointableMap B E E).adjoint = id := rfl 90 91 /-- Composition, with the adjoints in reverse order. -/ 92 def comp (S : AdjointableMap B F G) (T : AdjointableMap B E F) : AdjointableMap B E G where 93 toCLM := S.toCLM.comp T.toCLM 94 adjointCLM := T.adjointCLM.comp S.adjointCLM 95 adjoint_identity x y := by 96 change ⟪S (T x), y⟫_(Bᵐᵒᵖ) = ⟪x, T.adjointCLM (S.adjointCLM y)⟫_(Bᵐᵒᵖ) 97 rw [S.adjoint_identity, T.adjoint_identity] 98 99 @[simp] theorem comp_apply (S : AdjointableMap B F G) (T : AdjointableMap B E F) (x : E) : 100 S.comp T x = S (T x) := rfl 101 102 @[simp] theorem adjoint_comp (S : AdjointableMap B F G) (T : AdjointableMap B E F) : GitHub source 103 (S.comp T).adjoint = T.adjoint.comp S.adjoint := rfl 104 105 @[simp] theorem id_comp (T : AdjointableMap B E F) : id.comp T = T := by ext; rfl GitHub source 106 107 @[simp] theorem comp_id (T : AdjointableMap B E F) : T.comp id = T := by ext; rfl GitHub source 108 109 theorem comp_assoc (R : AdjointableMap B G H) (S : AdjointableMap B F G) GitHub source 110 (T : AdjointableMap B E F) : (R.comp S).comp T = R.comp (S.comp T) := by ext; rfl 111 112 /-- Sum of adjointable maps. -/ 113 def add (S T : AdjointableMap B E F) : AdjointableMap B E F where 114 toCLM := S.toCLM + T.toCLM 115 adjointCLM := S.adjointCLM + T.adjointCLM 116 adjoint_identity x y := by 117 change ⟪S x + T x, y⟫_(Bᵐᵒᵖ) = ⟪x, S.adjointCLM y + T.adjointCLM y⟫_(Bᵐᵒᵖ) 118 rw [CStarModule.inner_add_left, CStarModule.inner_add_right, S.adjoint_identity, T.adjoint_identity] 119 120 @[simp] theorem add_apply (S T : AdjointableMap B E F) (x : E) : 121 S.add T x = S x + T x := rfl 122 123 @[simp] theorem adjoint_add (S T : AdjointableMap B E F) : GitHub source 124 (S.add T).adjoint = S.adjoint.add T.adjoint := rfl 125 126 /-- Complex scalar multiplication; the adjoint is conjugate-linear. -/ 127 def smul (c : ℂ) (T : AdjointableMap B E F) : AdjointableMap B E F where 128 toCLM := c • T.toCLM 129 adjointCLM := star c • T.adjointCLM 130 adjoint_identity x y := by 131 change ⟪c • T x, y⟫_(Bᵐᵒᵖ) = ⟪x, star c • T.adjointCLM y⟫_(Bᵐᵒᵖ) 132 rw [inner_smul_left_complex, inner_smul_right_complex, T.adjoint_identity] 133 134 @[simp] theorem smul_apply (c : ℂ) (T : AdjointableMap B E F) (x : E) : 135 T.smul c x = c • T x := rfl 136 137 @[simp] theorem adjoint_smul (c : ℂ) (T : AdjointableMap B E F) : GitHub source 138 (T.smul c).adjoint = T.adjoint.smul (star c) := by ext; rfl 139 140 end AdjointableMap 141 end BC4lean.KKTheory
源码 SHA-256:d3b1c87e56a885b902f6f431a74d8b606c1ae0ec42f22a1520a3c08c92ea2675
1 import BC4lean.AdjointableOperator 2 3 /-! # Rank-one operators on right Hilbert C⋆-modules 4 5 For x in F and y in E, θ(x,y) maps z to x⟨y,z⟩. We prove boundedness, 6 adjointability and the composition identities used to construct compact module 7 operators. Operator-norm closure and the compact-operator ideal are later work. 8 -/ 9 10 noncomputable section 11 namespace BC4lean.KKTheory 12 13 open scoped InnerProductSpace 14 open CStarModule 15 16 variable {B E F G : Type*} [NonUnitalCStarAlgebra B] [PartialOrder B] [StarOrderedRing B] 17 [NormedAddCommGroup E] [NormedSpace ℂ E] [SMul Bᵐᵒᵖ E] [CStarModule Bᵐᵒᵖ E] 18 [NormedAddCommGroup F] [NormedSpace ℂ F] [SMul Bᵐᵒᵖ F] [CStarModule Bᵐᵒᵖ F] 19 [NormedAddCommGroup G] [NormedSpace ℂ G] [SMul Bᵐᵒᵖ G] [CStarModule Bᵐᵒᵖ G] 20 21 /-- The rank-one map as a bounded complex-linear map. -/ 22 def moduleRankOneCLM (x : F) (y : E) : E →L[ℂ] F := GitHub source 23 LinearMap.mkContinuous 24 { toFun := fun z => ⟪y, z⟫_(Bᵐᵒᵖ) • x 25 map_add' := fun z w => by rw [CStarModule.inner_add_right, module_add_smul] 26 map_smul' := fun c z => by 27 simp only [inner_smul_right_complex, module_complex_smul, RingHom.id_apply] } 28 (‖x‖ * ‖y‖) (fun z => by 29 calc 30 ‖⟪y, z⟫_(Bᵐᵒᵖ) • x‖ ≤ ‖⟪y, z⟫_(Bᵐᵒᵖ)‖ * ‖x‖ := module_norm_smul_le _ _ 31 _ ≤ (‖y‖ * ‖z‖) * ‖x‖ := mul_le_mul_of_nonneg_right (CStarModule.norm_inner_le E) (_root_.norm_nonneg _) 32 _ = (‖x‖ * ‖y‖) * ‖z‖ := by ring) 33 34 @[simp] theorem moduleRankOneCLM_apply (x : F) (y z : E) : 35 moduleRankOneCLM (B := B) x y z = ⟪y, z⟫_(Bᵐᵒᵖ) • x := rfl 36 37 /-- A rank-one map is adjointable, with θ(x,y)* = θ(y,x). -/ 38 def moduleRankOne (x : F) (y : E) : AdjointableMap B E F where GitHub source 39 toCLM := moduleRankOneCLM (B := B) x y 40 adjointCLM := moduleRankOneCLM (B := B) y x 41 adjoint_identity z w := by 42 change ⟪⟪y, z⟫_(Bᵐᵒᵖ) • x, w⟫_(Bᵐᵒᵖ) = ⟪z, ⟪x, w⟫_(Bᵐᵒᵖ) • y⟫_(Bᵐᵒᵖ) 43 simp only [inner_op_smul_left, inner_op_smul_right, CStarModule.star_inner] 44 45 @[simp] theorem moduleRankOne_apply (x : F) (y z : E) : 46 moduleRankOne (B := B) x y z = ⟪y, z⟫_(Bᵐᵒᵖ) • x := rfl 47 48 @[simp] theorem moduleRankOne_adjoint (x : F) (y : E) : GitHub source 49 (moduleRankOne (B := B) x y).adjoint = moduleRankOne y x := rfl 50 51 /-- The usual rank-one operator-norm bound. -/ 52 theorem moduleRankOne_norm_le (x : F) (y : E) : GitHub source 53 ‖(moduleRankOne (B := B) x y).toCLM‖ ≤ ‖x‖ * ‖y‖ := by 54 apply ContinuousLinearMap.opNorm_le_bound _ (by positivity) 55 intro z 56 change ‖⟪y, z⟫_(Bᵐᵒᵖ) • x‖ ≤ _ 57 calc 58 _ ≤ ‖⟪y, z⟫_(Bᵐᵒᵖ)‖ * ‖x‖ := module_norm_smul_le _ _ 59 _ ≤ (‖y‖ * ‖z‖) * ‖x‖ := mul_le_mul_of_nonneg_right (CStarModule.norm_inner_le E) (_root_.norm_nonneg _) 60 _ = (‖x‖ * ‖y‖) * ‖z‖ := by ring 61 62 /-- Left composition by an adjointable map preserves rank-one operators. -/ 63 theorem comp_moduleRankOne (T : AdjointableMap B F G) (x : F) (y : E) : GitHub source 64 T.comp (moduleRankOne x y) = moduleRankOne (T x) y := by 65 ext z 66 exact T.map_op_smul _ _ 67 68 /-- Right composition by an adjointable map preserves rank-one operators. -/ 69 theorem moduleRankOne_comp (x : G) (y : F) (T : AdjointableMap B E F) : GitHub source 70 (moduleRankOne x y).comp T = moduleRankOne x (T.adjoint y) := by 71 ext z 72 change ⟪y, T z⟫_(Bᵐᵒᵖ) • x = ⟪T.adjoint y, z⟫_(Bᵐᵒᵖ) • x 73 rw [T.adjoint.adjoint_identity] 74 rfl 75 76 /-- Product of two rank-one operators. -/ 77 theorem moduleRankOne_comp_moduleRankOne (x : G) (y u : F) (v : E) : GitHub source 78 (moduleRankOne (B := B) x y).comp (moduleRankOne u v) = 79 moduleRankOne (⟪y, u⟫_(Bᵐᵒᵖ) • x) v := 80 comp_moduleRankOne _ _ _ 81 82 /-- On the standard right module, θ(x,y) is left multiplication by x y*. -/ 83 theorem standard_moduleRankOne (x y z : B) : GitHub source 84 MulOpposite.unop (moduleRankOne (B := B) (MulOpposite.op x) 85 (MulOpposite.op y) (MulOpposite.op z)) = x * star y * z := by 86 change x * (star y * z) = x * star y * z 87 rw [mul_assoc] 88 89 end BC4lean.KKTheory