返回 blueprint

Lean 源码

此页定位 blueprint 引用的 Lean 声明,展示已验证的源码快照,并非完整的 API 文档。Lean 4.33.1。

Chapter 5: Audited declaration source index

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.

Lean declarationGitHub source
BC4lean.KKTheory.AdjointableMapBC4lean/AdjointableOperator.lean:23
BC4lean.KKTheory.AdjointableMap.adjoint_addBC4lean/AdjointableOperator.lean:123
BC4lean.KKTheory.AdjointableMap.adjoint_adjointBC4lean/AdjointableOperator.lean:69
BC4lean.KKTheory.AdjointableMap.adjoint_compBC4lean/AdjointableOperator.lean:102
BC4lean.KKTheory.AdjointableMap.adjoint_smulBC4lean/AdjointableOperator.lean:137
BC4lean.KKTheory.AdjointableMap.adjoint_uniqueBC4lean/AdjointableOperator.lean:36
BC4lean.KKTheory.AdjointableMap.comp_assocBC4lean/AdjointableOperator.lean:109
BC4lean.KKTheory.AdjointableMap.comp_idBC4lean/AdjointableOperator.lean:107
BC4lean.KKTheory.AdjointableMap.completionBC4lean/AdjointableCompletion.lean:46
BC4lean.KKTheory.AdjointableMap.completionHomBC4lean/AdjointableCompletion.lean:121
BC4lean.KKTheory.AdjointableMap.id_compBC4lean/AdjointableOperator.lean:105
BC4lean.KKTheory.AdjointableMap.instCStarAlgebraBC4lean/AdjointableComplete.lean:73
BC4lean.KKTheory.AdjointableMap.instCompleteSpaceBC4lean/AdjointableComplete.lean:62
BC4lean.KKTheory.AdjointableMap.instNormedAddCommGroupBC4lean/AdjointableAlgebra.lean:98
BC4lean.KKTheory.AdjointableMap.instNormedAlgebraBC4lean/AdjointableAlgebra.lean:155
BC4lean.KKTheory.AdjointableMap.instStarRingBC4lean/AdjointableAlgebra.lean:162
BC4lean.KKTheory.AdjointableMap.isClosed_range_toCLMPairBC4lean/AdjointableComplete.lean:45
BC4lean.KKTheory.AdjointableMap.map_op_smulBC4lean/AdjointableOperator.lean:56
BC4lean.KKTheory.AdjointableMap.norm_adjoint_toCLMBC4lean/AdjointableNorm.lean:72
BC4lean.KKTheory.AdjointableMap.norm_completionBC4lean/AdjointableCompletion.lean:72
BC4lean.KKTheory.AdjointableMap.norm_sub_comp_sq_leBC4lean/CompactModuleOperatorCriterion.lean:30
BC4lean.KKTheory.AdjointableMap.norm_toCLM_adjoint_comp_selfBC4lean/AdjointableNorm.lean:107
BC4lean.KKTheory.AdjointableMap.toCLMPair_isometryBC4lean/AdjointableComplete.lean:53
BC4lean.KKTheory.BalancedModuleTensorBC4lean/BalancedModuleTensor.lean:34
BC4lean.KKTheory.BundledGradedKasparovCycle.fullHomotopySetoidBC4lean/FullGradedKasparovHomotopyEquivalence.lean:101
BC4lean.KKTheory.BundledKasparovCycleBC4lean/BundledKasparovCycle.lean:24
BC4lean.KKTheory.BundledKasparovCycle.homotopic_directSumBC4lean/KasparovHomotopyGroup.lean:76
BC4lean.KKTheory.BundledKasparovCycle.homotopic_iff_fullBC4lean/IntervalKasparovCycleGluing.lean:422
BC4lean.KKTheory.BundledKasparovCycle.isomorphismSetoidBC4lean/BundledKasparovCycle.lean:101
BC4lean.KKTheory.BundledOddKasparovCycle.fullHomotopySetoidBC4lean/OddKasparovHomotopyRelation.lean:48
BC4lean.KKTheory.BundledOddKasparovCycle.homotopic_iff_fullBC4lean/OddKasparovHomotopyRelation.lean:57
BC4lean.KKTheory.CStarAlgebraActionBC4lean/EquivariantHilbertModule.lean:26
BC4lean.KKTheory.CStarAlgebraAction.continuousSectionsBC4lean/IntervalKasparovHomotopy.lean:44
BC4lean.KKTheory.CStarGradingBC4lean/GradedHilbertModule.lean:41
BC4lean.KKTheory.CliffordCommutingRepresentation.maximalNorm_eqBC4lean/CliffordAlgebraTensor.lean:438
BC4lean.KKTheory.CliffordExternalOddCoefficient.grading_tmulBC4lean/CliffordExternalOddCoefficient.lean:155
BC4lean.KKTheory.CliffordExternalOddCoefficient.mul_tmulBC4lean/CliffordExternalOddCoefficient.lean:113
BC4lean.KKTheory.CliffordExternalOddCoefficient.starTensor_tmulBC4lean/CliffordExternalOddCoefficient.lean:139
BC4lean.KKTheory.CliffordOne.epsilon_oddBC4lean/CliffordOne.lean:54
BC4lean.KKTheory.CliffordOne.epsilon_squareBC4lean/CliffordOne.lean:51
BC4lean.KKTheory.CliffordOne.existsUnique_liftBC4lean/CliffordOne.lean:183
BC4lean.KKTheory.CliffordOne.gradingBC4lean/CliffordOne.lean:41
BC4lean.KKTheory.CliffordTwoGradedTensor.grading_tensorBC4lean/CliffordTwoGradedTensor.lean:175
BC4lean.KKTheory.CliffordTwoGradedTensor.star_tensorBC4lean/CliffordTwoGradedTensor.lean:134
BC4lean.KKTheory.CliffordTwoGradedTensor.tensor_mulBC4lean/CliffordTwoGradedTensor.lean:119
BC4lean.KKTheory.CompactModuleOperatorBC4lean/CompactModuleOperator.lean:336
BC4lean.KKTheory.ConeHilbertModuleBC4lean/ConeHilbertModule.lean:42
BC4lean.KKTheory.ConeHilbertModule.instCStarModuleBC4lean/ConeHilbertModule.lean:75
BC4lean.KKTheory.CountableHilbertModuleSumBC4lean/CountableHilbertModuleSum.lean:126
BC4lean.KKTheory.EquivariantHilbertModuleBC4lean/EquivariantHilbertModule.lean:86
BC4lean.KKTheory.EquivariantHilbertModule.PreservesGradingBC4lean/EquivariantHilbertModule.lean:151
BC4lean.KKTheory.EquivariantHilbertModule.conjugateMap_mem_moduleCompactBC4lean/EquivariantCompactOperator.lean:68
BC4lean.KKTheory.EquivariantHilbertModule.conjugateOperatorBC4lean/EquivariantHilbertModule.lean:179
BC4lean.KKTheory.EquivariantHilbertModule.conjugateOperator_mem_moduleCompactBC4lean/EquivariantCompactOperator.lean:94
BC4lean.KKTheory.EquivariantHilbertModule.continuous_actionBC4lean/EquivariantHilbertModule.lean:132
BC4lean.KKTheory.EquivariantHilbertModule.fibreBC4lean/IntervalKasparovFibre.lean:102
BC4lean.KKTheory.EquivariantHilbertModule.map_op_smulBC4lean/EquivariantHilbertModule.lean:112
BC4lean.KKTheory.FiniteStandardModuleBC4lean/ModuleGramMatrix.lean:27
BC4lean.KKTheory.FullGradedKasparovHomotopyBC4lean/FullGradedKasparovHomotopy.lean:25
BC4lean.KKTheory.FullKasparovHomotopyBC4lean/KasparovHomotopyRelation.lean:31
BC4lean.KKTheory.FullKasparovHomotopy.degenerateConeBC4lean/KasparovHomotopyRelation.lean:91
BC4lean.KKTheory.FullKasparovHomotopy.directSumBC4lean/KasparovHomotopyGroup.lean:37
BC4lean.KKTheory.FullKasparovHomotopy.inverseRotationBC4lean/KasparovHomotopyRelation.lean:99
BC4lean.KKTheory.FullKasparovHomotopy.reflBC4lean/KasparovHomotopyRelation.lean:64
BC4lean.KKTheory.FullKasparovHomotopy.symmBC4lean/IntervalKasparovReversal.lean:503
BC4lean.KKTheory.FullKasparovHomotopy.transBC4lean/IntervalKasparovCycleGluing.lean:394
BC4lean.KKTheory.GradedHilbertModuleBC4lean/GradedHilbertModule.lean:73
BC4lean.KKTheory.GradedHilbertModule.IsEvenBC4lean/GradedHilbertModule.lean:246
BC4lean.KKTheory.GradedHilbertModule.IsOddBC4lean/GradedHilbertModule.lean:251
BC4lean.KKTheory.GradedHilbertModule.fibreBC4lean/IntervalKasparovFibre.lean:27
BC4lean.KKTheory.GradedKasparovConnectionBC4lean/GradedKasparovConnectionExistence.lean:33
BC4lean.KKTheory.GradedKasparovCycleBC4lean/GradedKasparovCycle.lean:30
BC4lean.KKTheory.GradedKasparovCycle.trivialEquivBC4lean/GradedKasparovCycle.lean:138
BC4lean.KKTheory.GradedKasparovCycleIsoBC4lean/GradedKasparovCycleIso.lean:31
BC4lean.KKTheory.GradedKasparovCycleIso.symmBC4lean/GradedKasparovCycleIso.lean:69
BC4lean.KKTheory.GradedKasparovCycleIso.transBC4lean/GradedKasparovCycleIso.lean:101
BC4lean.KKTheory.GradedKasparovHomotopyClassBC4lean/FullGradedKasparovHomotopyEquivalence.lean:108
BC4lean.KKTheory.GroupUniverseCommonParityProduct.productBC4lean/GroupUniverseCommonParityProduct.lean:49
BC4lean.KKTheory.GroupUniverseCommonParityProduct.productAddHomBC4lean/GroupUniverseCommonParityProduct.lean:80
BC4lean.KKTheory.GroupUniverseCommonParityProduct.product_add_firstBC4lean/GroupUniverseCommonParityProduct.lean:59
BC4lean.KKTheory.GroupUniverseCommonParityProduct.product_add_secondBC4lean/GroupUniverseCommonParityProduct.lean:69
BC4lean.KKTheory.GroupUniverseCommonParityProduct.product_assocBC4lean/GroupUniverseCommonParityProduct.lean:105
BC4lean.KKTheory.GroupUniverseCommonParityProduct.universeEquivalenceBC4lean/GroupUniverseCommonParityProduct.lean:31
BC4lean.KKTheory.GroupUniverseExternalOddSemantics.action_tmulBC4lean/GroupUniverseExternalOddSemantics.lean:99
BC4lean.KKTheory.GroupUniverseExternalOddSemantics.grading_tmulBC4lean/GroupUniverseExternalOddSemantics.lean:77
BC4lean.KKTheory.GroupUniverseExternalOddSemantics.inner_tmulBC4lean/GroupUniverseExternalOddSemantics.lean:35
BC4lean.KKTheory.GroupUniverseExternalOddSemantics.moduleEquivBC4lean/GroupUniverseExternalOddSemantics.lean:30
BC4lean.KKTheory.GroupUniverseExternalOddSemantics.op_smul_tmulBC4lean/GroupUniverseExternalOddSemantics.lean:47
BC4lean.KKTheory.GroupUniverseExternalOddSemantics.operator_tmulBC4lean/GroupUniverseExternalOddSemantics.lean:70
BC4lean.KKTheory.GroupUniverseExternalOddSemantics.representation_tmulBC4lean/GroupUniverseExternalOddSemantics.lean:86
BC4lean.KKTheory.GroupUniverseMatrixMoritaBridge.addEquivalenceBC4lean/GroupUniverseMatrixMoritaBridge.lean:92
BC4lean.KKTheory.GroupUniverseMatrixMoritaBridge.coefficient_roundtripBC4lean/GroupUniverseMatrixMoritaBridge.lean:69
BC4lean.KKTheory.GroupUniverseMatrixMoritaBridge.matrix_roundtripBC4lean/GroupUniverseMatrixMoritaBridge.lean:80
BC4lean.KKTheory.GroupUniverseMatrixMoritaProduct.toCoefficientClass_eq_productBC4lean/GroupUniverseMatrixMoritaProduct.lean:45
BC4lean.KKTheory.GroupUniverseMatrixMoritaProduct.toCoefficientClass_productBC4lean/GroupUniverseMatrixMoritaProduct.lean:81
BC4lean.KKTheory.GroupUniverseMatrixMoritaProduct.toMatrixClass_eq_productBC4lean/GroupUniverseMatrixMoritaProduct.lean:61
BC4lean.KKTheory.GroupUniverseOddFirstParityProduct.evenOddEvenProduct_assocBC4lean/GroupUniverseOddFirstParityAssociativity.lean:25
BC4lean.KKTheory.GroupUniverseOddFirstParityProduct.evenOddOddProduct_assocBC4lean/GroupUniverseOddMoritaProductReduction.lean:56
BC4lean.KKTheory.GroupUniverseOddFirstParityProduct.oddEvenEvenProduct_assocBC4lean/GroupUniverseExternalEvenMonoidalClass.lean:67
BC4lean.KKTheory.GroupUniverseOddFirstParityProduct.oddEvenOddProduct_assocBC4lean/GroupUniverseEvenOddSourceProduct.lean:86
BC4lean.KKTheory.GroupUniverseOddFirstParityProduct.oddEvenProductBC4lean/GroupUniverseOddFirstParityProduct.lean:29
BC4lean.KKTheory.GroupUniverseOddFirstParityProduct.oddOddEvenProduct_assocBC4lean/GroupUniverseOddMoritaProductReduction.lean:73
BC4lean.KKTheory.GroupUniverseOddFirstParityProduct.oddOddOddProduct_assocBC4lean/GroupUniverseOddOddSourceProduct.lean:81
BC4lean.KKTheory.GroupUniverseOddFirstParityProduct.oddOddProductBC4lean/GroupUniverseOddFirstParityProduct.lean:52
BC4lean.KKTheory.GroupUniverseOrdinaryEven.coefficientPushforward_shrinkBC4lean/GroupUniverseOrdinaryEvenShrink.lean:27
BC4lean.KKTheory.GroupUniverseOrdinaryOdd.coefficientPushforward_mk_coefficientTensorBC4lean/GroupUniverseOrdinaryOdd.lean:69
BC4lean.KKTheory.GroupUniverseParityFunctoriality.coefficientPushforwardHomBC4lean/GroupUniverseParityFunctoriality.lean:72
BC4lean.KKTheory.GroupUniverseParityFunctoriality.coefficientPushforward_compBC4lean/GroupUniverseParityFunctoriality.lean:148
BC4lean.KKTheory.GroupUniverseParityFunctoriality.coefficientPushforward_graded_evenBC4lean/GroupUniverseParityMapCoherence.lean:208
BC4lean.KKTheory.GroupUniverseParityFunctoriality.coefficientPushforward_graded_oddBC4lean/GroupUniverseParityMapCoherence.lean:224
BC4lean.KKTheory.GroupUniverseParityFunctoriality.coefficientPushforward_idBC4lean/GroupUniverseParityFunctoriality.lean:96
BC4lean.KKTheory.GroupUniverseParityFunctoriality.coefficientPushforward_productBC4lean/GroupUniverseParityFunctoriality.lean:208
BC4lean.KKTheory.GroupUniverseParityFunctoriality.coefficientPushforward_product_eq_sourcePullbackBC4lean/GroupUniverseParityFunctoriality.lean:224
BC4lean.KKTheory.GroupUniverseParityFunctoriality.homClass_leftProduct_eq_sourcePullbackBC4lean/GroupUniverseParityMapCoherence.lean:106
BC4lean.KKTheory.GroupUniverseParityFunctoriality.sourcePullbackHomBC4lean/GroupUniverseParityFunctoriality.lean:65
BC4lean.KKTheory.GroupUniverseParityFunctoriality.sourcePullback_coefficientPushforwardBC4lean/GroupUniverseParityFunctoriality.lean:177
BC4lean.KKTheory.GroupUniverseParityFunctoriality.sourcePullback_compBC4lean/GroupUniverseParityFunctoriality.lean:120
BC4lean.KKTheory.GroupUniverseParityFunctoriality.sourcePullback_graded_evenBC4lean/GroupUniverseParityMapCoherence.lean:178
BC4lean.KKTheory.GroupUniverseParityFunctoriality.sourcePullback_graded_oddBC4lean/GroupUniverseParityMapCoherence.lean:193
BC4lean.KKTheory.GroupUniverseParityFunctoriality.sourcePullback_idBC4lean/GroupUniverseParityFunctoriality.lean:88
BC4lean.KKTheory.GroupUniverseParityFunctoriality.sourcePullback_productBC4lean/GroupUniverseParityFunctoriality.lean:192
BC4lean.KKTheory.GroupUniverseParityGroup.KKParityGroupBC4lean/GroupUniverseParityGroup.lean:22
BC4lean.KKTheory.GroupUniverseParityGroup.evenParityIdentificationBC4lean/GroupUniverseParityGroup.lean:33
BC4lean.KKTheory.GroupUniverseParityGroup.kkParityGroupAddCommGroupBC4lean/GroupUniverseParityGroup.lean:28
BC4lean.KKTheory.GroupUniverseParityGroup.oddParityIdentificationBC4lean/GroupUniverseParityGroup.lean:41
BC4lean.KKTheory.GroupUniverseParityProduct.evenEvenOddProduct_assocBC4lean/GroupUniverseParityProduct.lean:103
BC4lean.KKTheory.GroupUniverseParityProduct.evenOddProductBC4lean/GroupUniverseParityProduct.lean:55
BC4lean.KKTheory.GroupUniverseParityProduct.evenProductBC4lean/GroupUniverseParityProduct.lean:28
BC4lean.KKTheory.GroupUniverseParityProduct.evenProduct_assocBC4lean/GroupUniverseParityProduct.lean:95
BC4lean.KKTheory.GroupUniverseParityUnits.identityBC4lean/GroupUniverseParityUnits.lean:44
BC4lean.KKTheory.GroupUniverseParityUnits.left_identityBC4lean/GroupUniverseParityUnits.lean:119
BC4lean.KKTheory.GroupUniverseParityUnits.right_identityBC4lean/GroupUniverseParityUnits.lean:97
BC4lean.KKTheory.GroupUniverseProduct.bundledProduct_fullHomotopic_firstBC4lean/GroupUniverseProduct.lean:51
BC4lean.KKTheory.GroupUniverseProduct.bundledProduct_fullHomotopic_secondBC4lean/GroupUniverseProduct.lean:59
BC4lean.KKTheory.GroupUniverseProduct.identityBC4lean/GroupUniverseProduct.lean:187
BC4lean.KKTheory.GroupUniverseProduct.productBC4lean/GroupUniverseProduct.lean:75
BC4lean.KKTheory.GroupUniverseProduct.productOperatorBC4lean/GroupUniverseProduct.lean:33
BC4lean.KKTheory.GroupUniverseProduct.productOperator_isProductBC4lean/GroupUniverseProduct.lean:39
BC4lean.KKTheory.GroupUniverseProduct.product_assocBC4lean/GroupUniverseProduct.lean:171
BC4lean.KKTheory.GroupUniverseProduct.product_left_identityBC4lean/GroupUniverseProduct.lean:213
BC4lean.KKTheory.GroupUniverseProduct.product_mk_eq_of_isProductBC4lean/GroupUniverseProduct.lean:87
BC4lean.KKTheory.GroupUniverseProduct.product_right_identityBC4lean/GroupUniverseProduct.lean:203
BC4lean.KKTheory.HilbertModuleEquivBC4lean/HilbertModuleEquiv.lean:22
BC4lean.KKTheory.HilbertModuleEquiv.toAdjointableBC4lean/HilbertModuleEquiv.lean:107
BC4lean.KKTheory.HilbertModuleEquiv.transportMap_isModuleCompact_iffBC4lean/HilbertModuleEquiv.lean:211
BC4lean.KKTheory.HilbertModuleEquiv.transportMap_normBC4lean/HilbertModuleEquiv.lean:193
BC4lean.KKTheory.HilbertModuleEquiv.transportStarAlgEquivBC4lean/HilbertModuleEquiv.lean:172
BC4lean.KKTheory.HilbertModuleFibreBC4lean/IntervalModuleFibre.lean:227
BC4lean.KKTheory.HilbertModuleSumBC4lean/HilbertModuleSum.lean:23
BC4lean.KKTheory.InteriorCreationCycleCounterexample.creationAtOne_adjoint_compBC4lean/InteriorCreationCycleCounterexample.lean:51
BC4lean.KKTheory.InteriorCreationCycleCounterexample.creationAtOne_not_moduleCompactBC4lean/InteriorCreationCycleCounterexample.lean:60
BC4lean.KKTheory.InteriorCreationCycleCounterexample.fullCycleCounterexampleBC4lean/InteriorCreationCycleCounterexample.lean:67
BC4lean.KKTheory.InteriorModuleTensorBC4lean/InteriorModuleTensor.lean:26
BC4lean.KKTheory.InteriorModuleTensorFirstFactorEquiv.hilbertEquivBC4lean/InteriorModuleTensorFirstFactorEquiv.lean:91
BC4lean.KKTheory.InteriorModuleTensorFirstFactorEquiv.hilbertEquiv_operatorBC4lean/InteriorModuleTensorFirstFactorEquiv.lean:100
BC4lean.KKTheory.InteriorModuleTensorSecondDirectSum.hilbertEquivBC4lean/InteriorModuleTensorSecondDirectSum.lean:154
BC4lean.KKTheory.InteriorModuleTensorSecondDirectSum.hilbertEquiv_actionBC4lean/InteriorModuleTensorSecondDirectSumCompatibility.lean:135
BC4lean.KKTheory.InteriorModuleTensorSecondDirectSum.hilbertEquiv_creationBC4lean/InteriorModuleTensorSecondDirectSumCompatibility.lean:31
BC4lean.KKTheory.InteriorModuleTensorSecondDirectSum.hilbertEquiv_creation_adjointBC4lean/InteriorModuleTensorSecondDirectSumCompatibility.lean:42
BC4lean.KKTheory.InteriorModuleTensorSecondDirectSum.hilbertEquiv_gradingBC4lean/InteriorModuleTensorSecondDirectSumCompatibility.lean:97
BC4lean.KKTheory.IsCountablyGeneratedModuleBC4lean/CountablyGeneratedModule.lean:24
BC4lean.KKTheory.IsCountablyGeneratedModule.completionBC4lean/HilbertModuleCompletion.lean:193
BC4lean.KKTheory.IsCountablyGeneratedModule.fibreBC4lean/IntervalModuleFibre.lean:313
BC4lean.KKTheory.IsCountablyGeneratedModule.interiorTensorBC4lean/InteriorModuleTensorCountableGeneration.lean:45
BC4lean.KKTheory.IsCountablyGeneratedModule.map_linearIsometryEquivBC4lean/CountablyGeneratedModule.lean:57
BC4lean.KKTheory.IsCountablyGeneratedModule.separableSpaceBC4lean/HilbertModuleCountableGenerationSeparable.lean:41
BC4lean.KKTheory.IsCountablyGeneratedModule.sumBC4lean/HilbertModuleSum.lean:247
BC4lean.KKTheory.IsGradedKasparovProductOperatorBC4lean/GradedKasparovProductCriterion.lean:132
BC4lean.KKTheory.IsModuleCompactBC4lean/CompactModuleOperator.lean:104
BC4lean.KKTheory.IsModuleCompact.cfcAbsBC4lean/ModuleCompactPositivePart.lean:24
BC4lean.KKTheory.IsModuleCompact.fibreBC4lean/IntervalModuleFibre.lean:505
BC4lean.KKTheory.IsModuleCompact.of_adjoint_comp_selfBC4lean/CompactModuleOperatorCriterion.lean:114
BC4lean.KKTheory.IsModuleCompact.posPartBC4lean/ModuleCompactPositivePart.lean:33
BC4lean.KKTheory.IsModuleCompact.sumMapBC4lean/HilbertModuleSum.lean:241
BC4lean.KKTheory.IsPositiveModuloModuleCompactBC4lean/EssentialModulePositivity.lean:28
BC4lean.KKTheory.IsPositiveModuloModuleCompact.addBC4lean/EssentialModulePositivity.lean:44
BC4lean.KKTheory.IsPositiveModuloModuleCompact.star_left_conjugateBC4lean/EssentialModulePositivity.lean:103
BC4lean.KKTheory.KasparovConnectionBC4lean/KasparovConnection.lean:28
BC4lean.KKTheory.KasparovConnection.add_compactBC4lean/KasparovConnection.lean:51
BC4lean.KKTheory.KasparovCycleBC4lean/KasparovCycle.lean:30
BC4lean.KKTheory.KasparovCycle.IsDegenerateBC4lean/KasparovCycle.lean:58
BC4lean.KKTheory.KasparovCycle.OperatorConditionsBC4lean/KasparovOperatorHomotopy.lean:31
BC4lean.KKTheory.KasparovCycle.directSumBC4lean/KasparovDirectSum.lean:155
BC4lean.KKTheory.KasparovCycle.directSum_isDegenerateBC4lean/KasparovDirectSum.lean:200
BC4lean.KKTheory.KasparovCycle.fibreBC4lean/IntervalKasparovFibre.lean:187
BC4lean.KKTheory.KasparovCycle.isDegenerate_fibreBC4lean/IntervalKasparovFibre.lean:257
BC4lean.KKTheory.KasparovCycle.operatorConditions_affine_compactPerturbationBC4lean/KasparovCompactPerturbation.lean:106
BC4lean.KKTheory.KasparovCycle.oppositeBC4lean/KasparovInverseRotation.lean:195
BC4lean.KKTheory.KasparovCycle.transportBC4lean/KasparovCycleTransport.lean:129
BC4lean.KKTheory.KasparovCycle.transportIsoBC4lean/KasparovCycleTransport.lean:201
BC4lean.KKTheory.KasparovCycle.transport_isDegenerateBC4lean/KasparovCycleTransport.lean:172
BC4lean.KKTheory.KasparovCycle.withOperatorBC4lean/KasparovOperatorHomotopy.lean:53
BC4lean.KKTheory.KasparovCycle.zeroRepresentationBC4lean/KasparovCycle.lean:72
BC4lean.KKTheory.KasparovCycle.zeroRepresentation_isDegenerateBC4lean/KasparovCycle.lean:92
BC4lean.KKTheory.KasparovCycleIsoBC4lean/KasparovCycleIso.lean:30
BC4lean.KKTheory.KasparovCycleIso.directSumBC4lean/KasparovDirectSumIso.lean:62
BC4lean.KKTheory.KasparovCycleIso.fibreDirectSumBC4lean/KasparovFibreDirectSumIso.lean:29
BC4lean.KKTheory.KasparovCycleIso.reflBC4lean/KasparovCycleIso.lean:58
BC4lean.KKTheory.KasparovCycleIso.sumAssocBC4lean/KasparovDirectSumIso.lean:114
BC4lean.KKTheory.KasparovCycleIso.sumCommBC4lean/KasparovDirectSumIso.lean:91
BC4lean.KKTheory.KasparovCycleIso.symmBC4lean/KasparovCycleIso.lean:68
BC4lean.KKTheory.KasparovCycleIso.transBC4lean/KasparovCycleIso.lean:100
BC4lean.KKTheory.KasparovHomotopyClassBC4lean/KasparovHomotopyGroup.lean:86
BC4lean.KKTheory.KasparovHomotopyClass.instAddCommGroupBC4lean/KasparovHomotopyGroup.lean:144
BC4lean.KKTheory.KasparovHomotopyClass.mk_directSumBC4lean/KasparovHomotopyGroup.lean:136
BC4lean.KKTheory.KasparovHomotopyClass.mk_eq_mk_iff_fullBC4lean/KasparovHomotopyGroup.lean:105
BC4lean.KKTheory.KasparovHomotopyClass.mk_eq_zero_of_degenerateBC4lean/KasparovHomotopyGroup.lean:170
BC4lean.KKTheory.KasparovHomotopyClass.mk_oppositeBC4lean/KasparovHomotopyGroup.lean:139
BC4lean.KKTheory.KasparovOperatorHomotopyBC4lean/KasparovOperatorHomotopy.lean:89
BC4lean.KKTheory.KasparovOperatorHomotopy.compactPerturbationBC4lean/KasparovCompactPerturbation.lean:141
BC4lean.KKTheory.KasparovOperatorHomotopy.continuous_operatorBC4lean/KasparovOperatorHomotopy.lean:123
BC4lean.KKTheory.KasparovOperatorHomotopy.cycleAtBC4lean/KasparovOperatorHomotopy.lean:107
BC4lean.KKTheory.KasparovOperatorHomotopy.directSumBC4lean/KasparovHomotopyDirectSum.lean:87
BC4lean.KKTheory.KasparovOperatorHomotopy.fibreCycleIsoBC4lean/IntervalKasparovHomotopy.lean:207
BC4lean.KKTheory.KasparovOperatorHomotopy.fibreCycleOneIsoBC4lean/IntervalKasparovHomotopy.lean:265
BC4lean.KKTheory.KasparovOperatorHomotopy.fibreCycleZeroIsoBC4lean/IntervalKasparovHomotopy.lean:260
BC4lean.KKTheory.KasparovOperatorHomotopy.intervalCycleBC4lean/IntervalKasparovHomotopy.lean:120
BC4lean.KKTheory.KasparovOperatorHomotopy.intervalFibreIsoBC4lean/IntervalKasparovFibre.lean:309
BC4lean.KKTheory.KasparovOperatorHomotopy.inverseRotationBC4lean/KasparovInverseRotation.lean:308
BC4lean.KKTheory.KasparovOperatorHomotopy.inverseRotation_target_isDegenerateBC4lean/KasparovInverseRotation.lean:322
BC4lean.KKTheory.KasparovOperatorHomotopy.reflBC4lean/KasparovOperatorHomotopy.lean:164
BC4lean.KKTheory.KasparovOperatorHomotopy.source_cycleAtBC4lean/KasparovOperatorHomotopy.lean:148
BC4lean.KKTheory.KasparovOperatorHomotopy.symmBC4lean/KasparovOperatorHomotopy.lean:177
BC4lean.KKTheory.KasparovOperatorHomotopy.target_cycleAtBC4lean/KasparovOperatorHomotopy.lean:153
BC4lean.KKTheory.KasparovOperatorHomotopy.transBC4lean/KasparovOperatorHomotopy.lean:193
BC4lean.KKTheory.OddKKBC4lean/OddKasparovHomotopyRelation.lean:73
BC4lean.KKTheory.OddKK.instAddCommGroupBC4lean/OddKasparovHomotopyGroup.lean:53
BC4lean.KKTheory.OddKasparovCycleBC4lean/KasparovCycle.lean:110
BC4lean.KKTheory.OddKasparovCycle.IsDegenerateBC4lean/KasparovCycle.lean:133
BC4lean.KKTheory.OddKasparovCycle.directSumBC4lean/KasparovDirectSum.lean:230
BC4lean.KKTheory.OddKasparovCycle.directSum_isDegenerateBC4lean/KasparovDirectSum.lean:268
BC4lean.KKTheory.OddKasparovCycle.zeroRepresentationBC4lean/KasparovCycle.lean:146
BC4lean.KKTheory.OddKasparovCycle.zeroRepresentation_isDegenerateBC4lean/KasparovCycle.lean:159
BC4lean.KKTheory.PositiveModuleFormBC4lean/PositiveModuleForm.lean:29
BC4lean.KKTheory.PositiveModuleForm.formNorm_triangleBC4lean/PositiveModuleForm.lean:254
BC4lean.KKTheory.PositiveModuleForm.inner_mul_inner_swap_leBC4lean/PositiveModuleForm.lean:144
BC4lean.KKTheory.PositiveModuleForm.nullRadicalBC4lean/PositiveModuleForm.lean:199
BC4lean.KKTheory.PositiveModuleQuotientBC4lean/PositiveModuleQuotient.lean:25
BC4lean.KKTheory.PositiveModuleQuotient.instCStarModuleBC4lean/PositiveModuleQuotient.lean:137
BC4lean.KKTheory.PreHilbertModuleTensorBC4lean/PreHilbertModuleTensor.lean:25
BC4lean.KKTheory.ScalarCreationCycleCounterexample.firstCycleBC4lean/ScalarCreationCycleCounterexample.lean:127
BC4lean.KKTheory.ScalarCreationCycleCounterexample.fullCycleCounterexampleBC4lean/ScalarCreationCycleCounterexample.lean:267
BC4lean.KKTheory.ScalarCreationCycleCounterexample.secondCycleBC4lean/ScalarCreationCycleCounterexample.lean:208
BC4lean.KKTheory.ScalarCreationCycleCounterexample.secondCycle_isDegenerateBC4lean/ScalarCreationCycleCounterexample.lean:236
BC4lean.KKTheory.ScalarHilbertModule.isCompactOperator_of_isModuleCompactBC4lean/ScalarHilbertModule.lean:126
BC4lean.KKTheory.affineKasparovOperator_square_defectBC4lean/KasparovCompactPerturbation.lean:53
BC4lean.KKTheory.cfc_sub_value_mul_isModuleCompactBC4lean/LocalizedModuleFunctionalCalculus.lean:27
BC4lean.KKTheory.cliffordTensorCoordinateStarAlgEquivBC4lean/CliffordAlgebraTensor.lean:379
BC4lean.KKTheory.cliffordTensorCoordinates_tmulBC4lean/CliffordAlgebraTensor.lean:35
BC4lean.KKTheory.cliffordTensorNorm_cstarBC4lean/CliffordAlgebraTensor.lean:130
BC4lean.KKTheory.cliffordTensorParityAddEquivBC4lean/CliffordTensorParityGroup.lean:27
BC4lean.KKTheory.comp_mem_moduleCompactBC4lean/CompactModuleOperator.lean:234
BC4lean.KKTheory.comp_moduleRankOneBC4lean/RankOneOperator.lean:63
BC4lean.KKTheory.compactModuleOperatorIdeal_isTwoSidedBC4lean/CompactModuleOperator.lean:309
BC4lean.KKTheory.compactModuleOperator_nonUnitalCStarAlgebraBC4lean/CompactModuleOperator.lean:341
BC4lean.KKTheory.compact_approximateUnit_vector_error_sq_leBC4lean/CompactModuleApproximateUnit.lean:66
BC4lean.KKTheory.compact_fibreKernel_eq_fibreNullCompactBC4lean/IntervalModuleCompactFibre.lean:167
BC4lean.KKTheory.completionCStarModuleBC4lean/HilbertModuleCompletion.lean:126
BC4lean.KKTheory.completionInner_coeBC4lean/HilbertModuleCompletion.lean:70
BC4lean.KKTheory.completionModuleSMulBC4lean/HilbertModuleCompletion.lean:45
BC4lean.KKTheory.completion_norm_eq_sqrt_innerBC4lean/HilbertModuleCompletion.lean:109
BC4lean.KKTheory.coneOperatorHomBC4lean/ConeHilbertModule.lean:430
BC4lean.KKTheory.coneRampMap_denseRangeBC4lean/ConeHilbertModule.lean:260
BC4lean.KKTheory.cone_isCountablyGeneratedBC4lean/ConeHilbertModule.lean:339
BC4lean.KKTheory.continuousSectionCStarModuleBC4lean/IntervalHilbertModule.lean:112
BC4lean.KKTheory.continuousSectionFibreIsometryEquivBC4lean/IntervalHilbertModule.lean:397
BC4lean.KKTheory.continuousSectionFibreModuleEquivBC4lean/IntervalHilbertModule.lean:434
BC4lean.KKTheory.continuousSectionOperatorBC4lean/IntervalHilbertModule.lean:195
BC4lean.KKTheory.continuousSectionOperator_isModuleCompactBC4lean/IntervalHilbertModule.lean:286
BC4lean.KKTheory.continuousSection_isCountablyGeneratedBC4lean/IntervalHilbertModule.lean:304
BC4lean.KKTheory.continuous_eventually_uniform_moduleSandwichBC4lean/CompactModuleUniformCutoff.lean:72
BC4lean.KKTheory.contractiveJuliaEquivBC4lean/HilbertModuleJuliaSqrt.lean:198
BC4lean.KKTheory.contractiveJuliaEquiv_applyBC4lean/HilbertModuleJuliaSqrt.lean:204
BC4lean.KKTheory.countableModuleEvaluation_sequenceSumBC4lean/CountableModuleSequence.lean:122
BC4lean.KKTheory.countableModuleFinitePositiveFormBC4lean/CountableHilbertModuleSum.lean:54
BC4lean.KKTheory.countableModuleFinite_nullRadical_eq_botBC4lean/CountableHilbertModuleSum.lean:95
BC4lean.KKTheory.countableModuleSequenceSumBC4lean/CountableModuleSequence.lean:98
BC4lean.KKTheory.countableModuleSequenceSum_innerBC4lean/CountableModuleSequence.lean:107
BC4lean.KKTheory.evaluatedModuleQuotient_completeSpaceBC4lean/IntervalModuleFibreNorm.lean:230
BC4lean.KKTheory.exists_actualGradedKasparovProductOperatorBC4lean/KasparovProductExistence.lean:106
BC4lean.KKTheory.exists_compactFibre_lift_norm_eqBC4lean/IntervalModuleCompactFibre.lean:88
BC4lean.KKTheory.exists_finite_partition_approximationBC4lean/ContinuousMapFiniteApproximation.lean:39
BC4lean.KKTheory.exists_fullGradedKasparovProductOperatorHomotopyBC4lean/KasparovProductOperatorUniqueness.lean:226
BC4lean.KKTheory.exists_internally_quasicentral_approximate_unit_sequenceBC4lean/QuasicentralApproximateUnit.lean:168
BC4lean.KKTheory.exists_kasparovDiscreteTechnicalPartitionBC4lean/KasparovDiscreteTechnicalTheorem.lean:35
BC4lean.KKTheory.exists_odd_gradedKasparovConnectionBC4lean/GradedKasparovConnectionExistence.lean:94
BC4lean.KKTheory.exists_positive_contractive_approximate_unit_sequenceBC4lean/QuasicentralApproximateUnit.lean:116
BC4lean.KKTheory.exists_positive_selfadjoint_contraction_smul_approx_onBC4lean/HilbertModuleCoefficientApproximateUnit.lean:91
BC4lean.KKTheory.exists_standardModuleCompactSynthesis_denseRangeBC4lean/StandardModuleFrame.lean:303
BC4lean.KKTheory.exists_standardModuleStabilizationBC4lean/StandardModuleStabilization.lean:75
BC4lean.KKTheory.globalFredholmNormalizationBC4lean/GlobalModuleContractiveNormalization.lean:81
BC4lean.KKTheory.hilbertModuleBanachFibreEquivBC4lean/IntervalModuleFibreNorm.lean:219
BC4lean.KKTheory.hilbertModuleBanachFibre_norm_mkBC4lean/IntervalModuleFibreNorm.lean:187
BC4lean.KKTheory.hilbertModuleCompactFibreHomBC4lean/IntervalModuleCompactFibre.lean:49
BC4lean.KKTheory.hilbertModuleCompactFibreHom_surjectiveBC4lean/IntervalModuleCompactFibre.lean:65
BC4lean.KKTheory.hilbertModuleFibreMk_denseRangeBC4lean/IntervalModuleFibre.lean:270
BC4lean.KKTheory.hilbertModuleFibreMk_surjectiveBC4lean/IntervalModuleFibreNorm.lean:236
BC4lean.KKTheory.hilbertModuleFibreOperatorHomBC4lean/IntervalModuleFibre.lean:464
BC4lean.KKTheory.hilbertModuleFibre_inner_mkBC4lean/IntervalModuleFibre.lean:277
BC4lean.KKTheory.hilbertModuleSum_completeBC4lean/HilbertModuleSum.lean:76
BC4lean.KKTheory.hilbertModuleToCompletionBC4lean/HilbertModuleCompletion.lean:174
BC4lean.KKTheory.hilbertModuleToCompletion_denseRangeBC4lean/HilbertModuleCompletion.lean:179
BC4lean.KKTheory.injectiveStarHom_isSelfAdjoint_iffBC4lean/InjectiveStarHomPositivity.lean:19
BC4lean.KKTheory.injectiveStarHom_le_iffBC4lean/InjectiveStarHomPositivity.lean:55
BC4lean.KKTheory.injectiveStarHom_nonneg_iffBC4lean/InjectiveStarHomPositivity.lean:42
BC4lean.KKTheory.inner_sumBC4lean/HilbertModuleSum.lean:46
BC4lean.KKTheory.interiorModuleTensorInner_mk_mkBC4lean/InteriorModuleTensor.lean:49
BC4lean.KKTheory.interiorModuleTensorMk_balanceBC4lean/InteriorModuleTensor.lean:56
BC4lean.KKTheory.interiorModuleTensorOperatorBC4lean/ModuleTensorOperator.lean:280
BC4lean.KKTheory.interiorModuleTensorOperatorHomBC4lean/ModuleTensorOperator.lean:301
BC4lean.KKTheory.interiorModuleTensorOperator_adjointBC4lean/ModuleTensorOperator.lean:311
BC4lean.KKTheory.interiorModuleTensorOperator_mkBC4lean/ModuleTensorOperator.lean:285
BC4lean.KKTheory.interiorModuleTensorOperator_norm_leBC4lean/ModuleTensorOperator.lean:292
BC4lean.KKTheory.interiorModuleTensor_span_denseBC4lean/InteriorModuleTensor.lean:76
BC4lean.KKTheory.intervalMatchedCompactPairEquivBC4lean/IntervalMatchedCompactPairs.lean:472
BC4lean.KKTheory.intervalMatchedOperator_isModuleCompactBC4lean/IntervalMatchedCompactPairs.lean:432
BC4lean.KKTheory.intervalMatchedRankPairAlgebra_eq_compactPairAlgebraBC4lean/IntervalMatchedCompactPairs.lean:235
BC4lean.KKTheory.isCompact_eventually_uniform_moduleSandwichBC4lean/CompactModuleUniformCutoff.lean:43
BC4lean.KKTheory.isCountablyGeneratedModule_of_separableSpaceBC4lean/HilbertModuleCountableGenerationSeparable.lean:91
BC4lean.KKTheory.isModuleCompact_iff_adjoint_comp_selfBC4lean/CompactModuleOperatorCriterion.lean:71
BC4lean.KKTheory.isModuleCompact_tendsto_comp_left_of_strong_contractionsBC4lean/CompactModuleStrongCutoff.lean:63
BC4lean.KKTheory.isModuleCompact_tendsto_comp_right_of_strong_selfadjoint_contractionsBC4lean/CompactModuleStrongCutoff.lean:102
BC4lean.KKTheory.isPositiveModuloModuleCompact_iff_of_sub_compactBC4lean/EssentialModulePositivity.lean:120
BC4lean.KKTheory.isPositiveModuloModuleCompact_iff_star_squareBC4lean/EssentialModulePositivity.lean:111
BC4lean.KKTheory.juliaDefect_intertwineBC4lean/HilbertModuleJuliaSqrt.lean:181
BC4lean.KKTheory.juliaSourceDefectBC4lean/HilbertModuleJuliaSqrt.lean:135
BC4lean.KKTheory.juliaTargetDefectBC4lean/HilbertModuleJuliaSqrt.lean:131
BC4lean.KKTheory.mem_moduleCompact_compBC4lean/CompactModuleOperator.lean:246
BC4lean.KKTheory.mem_moduleCompact_iff_approxBC4lean/CompactModuleOperator.lean:118
BC4lean.KKTheory.moduleCompactBC4lean/CompactModuleOperator.lean:96
BC4lean.KKTheory.moduleCompact_adjointBC4lean/CompactModuleOperator.lean:219
BC4lean.KKTheory.moduleCompact_isClosedBC4lean/CompactModuleOperator.lean:136
BC4lean.KKTheory.moduleCompact_standard_eq_rangeBC4lean/StandardModuleOperator.lean:146
BC4lean.KKTheory.moduleCreationMapBC4lean/ModuleCreationMap.lean:145
BC4lean.KKTheory.moduleCreationMap_adjoint_compBC4lean/ModuleCreationMap.lean:253
BC4lean.KKTheory.moduleCreationMap_adjoint_mkBC4lean/ModuleCreationMap.lean:169
BC4lean.KKTheory.moduleCreationMap_isModuleCompact_iffBC4lean/ModuleCreationMap.lean:261
BC4lean.KKTheory.moduleCreationMap_isModuleCompact_of_compact_left_actionBC4lean/ModuleCreationMap.lean:268
BC4lean.KKTheory.moduleCreationMap_norm_leBC4lean/ModuleCreationMap.lean:178
BC4lean.KKTheory.moduleFiniteRankBC4lean/CompactModuleOperator.lean:88
BC4lean.KKTheory.moduleGeneratingSpanBC4lean/CountablyGeneratedModule.lean:20
BC4lean.KKTheory.moduleGeneratingSpan_closure_eq_top_iffBC4lean/CountablyGeneratedModule.lean:37
BC4lean.KKTheory.moduleGramMatrix_nonnegBC4lean/ModuleGramMatrix.lean:232
BC4lean.KKTheory.moduleGramSynthesisBC4lean/ModuleGramMatrix.lean:72
BC4lean.KKTheory.moduleGram_quadratic_eq_innerBC4lean/ModuleGramPositivity.lean:21
BC4lean.KKTheory.moduleGram_quadratic_nonnegBC4lean/ModuleGramPositivity.lean:35
BC4lean.KKTheory.moduleMatrixPairing_eq_zero_of_quadraticBC4lean/ModuleTensorPositivity.lean:111
BC4lean.KKTheory.moduleMatrixQuadratic_nonnegBC4lean/ModuleTensorPositivity.lean:95
BC4lean.KKTheory.moduleMatrixRepresentationBC4lean/ModuleGramMatrix.lean:131
BC4lean.KKTheory.moduleMatrixRepresentation_injectiveBC4lean/ModuleGramMatrix.lean:165
BC4lean.KKTheory.moduleRankOneBC4lean/RankOneOperator.lean:38
BC4lean.KKTheory.moduleRankOneCLMBC4lean/RankOneOperator.lean:22
BC4lean.KKTheory.moduleRankOne_adjointBC4lean/RankOneOperator.lean:48
BC4lean.KKTheory.moduleRankOne_compBC4lean/RankOneOperator.lean:69
BC4lean.KKTheory.moduleRankOne_comp_moduleRankOneBC4lean/RankOneOperator.lean:77
BC4lean.KKTheory.moduleRankOne_norm_leBC4lean/RankOneOperator.lean:52
BC4lean.KKTheory.moduleRankOne_self_normBC4lean/CompactModuleApproximateUnit.lean:22
BC4lean.KKTheory.moduleTensorInnerBC4lean/ModuleTensorInner.lean:156
BC4lean.KKTheory.moduleTensorInner_eq_zero_of_selfBC4lean/ModuleTensorRadical.lean:51
BC4lean.KKTheory.moduleTensorInner_self_nonnegBC4lean/ModuleTensorPositivity.lean:178
BC4lean.KKTheory.moduleTensorInner_standard_eqBC4lean/StandardModuleTensor.lean:68
BC4lean.KKTheory.moduleTensorInner_starBC4lean/ModuleTensorInner.lean:168
BC4lean.KKTheory.moduleTensorInner_sum_mk_self_nonnegBC4lean/ModuleTensorPositivity.lean:167
BC4lean.KKTheory.moduleTensorLiftBC4lean/BalancedModuleTensor.lean:72
BC4lean.KKTheory.moduleTensorLift_uniqueBC4lean/BalancedModuleTensor.lean:94
BC4lean.KKTheory.moduleTensorMk_balanceBC4lean/BalancedModuleTensor.lean:48
BC4lean.KKTheory.moduleTensorNullBC4lean/ModuleTensorRadical.lean:73
BC4lean.KKTheory.moduleTensorPureInnerBC4lean/ModuleTensorPureInner.lean:28
BC4lean.KKTheory.moduleTensorPureInner_norm_leBC4lean/ModuleTensorPureInner.lean:136
BC4lean.KKTheory.moduleTensorPureInner_self_nonnegBC4lean/ModuleTensorPureInner.lean:119
BC4lean.KKTheory.moduleVectorCreation_compactBC4lean/StandardModuleFrame.lean:68
BC4lean.KKTheory.module_add_smulBC4lean/HilbertCStarModule.lean:37
BC4lean.KKTheory.module_complex_smulBC4lean/HilbertCStarModule.lean:55
BC4lean.KKTheory.module_inner_ext_leftBC4lean/HilbertCStarModule.lean:23
BC4lean.KKTheory.module_inner_ext_rightBC4lean/HilbertCStarModule.lean:30
BC4lean.KKTheory.module_mul_smulBC4lean/HilbertCStarModule.lean:49
BC4lean.KKTheory.module_norm_smul_leBC4lean/HilbertCStarModule.lean:62
BC4lean.KKTheory.module_smul_addBC4lean/HilbertCStarModule.lean:43
BC4lean.KKTheory.nonUnitalCStarHomQuotientIsometryBC4lean/CStarHomClosedRange.lean:195
BC4lean.KKTheory.nonUnitalCStarHom_exists_norm_eq_liftBC4lean/CStarHomClosedRange.lean:137
BC4lean.KKTheory.nonUnitalCStarHom_isClosed_rangeBC4lean/CStarHomClosedRange.lean:218
BC4lean.KKTheory.nonUnitalCStarHom_quotient_norm_mkBC4lean/CStarHomClosedRange.lean:165
BC4lean.KKTheory.nonunitalRelativeK0KasparovMapAtUniverse_leftInverseBC4lean/ScalarKasparovK0ComparisonAddEquiv.lean:55
BC4lean.KKTheory.nonunitalRelativeK0KasparovMapAtUniverse_rightInverseBC4lean/ScalarKasparovK0IndexUniverse.lean:37
BC4lean.KKTheory.nonunitalRelativeK0KasparovMapAtZero_naturalBC4lean/ScalarKasparovK0ComparisonNaturality.lean:32
BC4lean.KKTheory.norm_globalFredholmNormalization_leBC4lean/GlobalModuleContractiveNormalization.lean:106
BC4lean.KKTheory.norm_standardCompactEquivBC4lean/StandardModuleOperator.lean:181
BC4lean.KKTheory.norm_standardLeftMulBC4lean/StandardModuleOperator.lean:81
BC4lean.KKTheory.norm_sumBC4lean/HilbertModuleSum.lean:51
BC4lean.KKTheory.oddKKIndependentCoefficientPushforward_comparison_squareBC4lean/OddKTheoryIndependentCoefficientNaturality.lean:175
BC4lean.KKTheory.oddKKOperatorK1AllModuleUniversesAddEquivBC4lean/GroupUniverseOddFullComparison.lean:33
BC4lean.KKTheory.oddKKOperatorK1AllModuleUniversesAddEquiv_independentCoefficient_naturalBC4lean/OddKTheoryIndependentCoefficientNaturality.lean:155
BC4lean.KKTheory.oddKKOperatorK1Index_independentCoefficientPushforward_anyModuleUniverseBC4lean/OddKTheoryIndependentCoefficientNaturality.lean:146
BC4lean.KKTheory.oddOperatorK1KKInverseAllModuleUniverses_independentCoefficient_naturalBC4lean/OddKTheoryIndependentCoefficientNaturality.lean:163
BC4lean.KKTheory.oddOperatorK1KKInverseAllModuleUniverses_leftInverse_indexBC4lean/OddKTheoryModuleUniverseIndex.lean:45
BC4lean.KKTheory.oddOperatorK1KKInverseAllModuleUniverses_rightInverse_indexBC4lean/OddKTheoryModuleUniverseIndex.lean:37
BC4lean.KKTheory.preModuleTensorCStarModuleBC4lean/PreHilbertModuleTensor.lean:111
BC4lean.KKTheory.scalarCliffordOperatorK1AllModuleUniversesAddEquivBC4lean/GroupUniverseOddFullComparison.lean:57
BC4lean.KKTheory.scalarCreationMap_adjoint_identityBC4lean/HilbertModuleCreationMap.lean:67
BC4lean.KKTheory.scalarCreationMap_one_not_compactBC4lean/HilbertModuleCreationMap.lean:115
BC4lean.KKTheory.scalarCreationModuleMap_one_not_moduleCompactBC4lean/ScalarCreationModule.lean:39
BC4lean.KKTheory.scalarKKOperatorK0AddEquivBC4lean/ScalarKasparovK0ComparisonAddEquiv.lean:84
BC4lean.KKTheory.scalarKKOperatorK0AddEquiv_naturalBC4lean/ScalarKasparovK0ComparisonNaturality.lean:76
BC4lean.KKTheory.scalarKKOperatorK0IndexHomBC4lean/ScalarKasparovK0ComparisonAddEquiv.lean:79
BC4lean.KKTheory.scalarKKOperatorK0IndexHom_naturalBC4lean/ScalarKasparovK0ComparisonNaturality.lean:83
BC4lean.KKTheory.scalarKKOperatorK0Index_universeBC4lean/ScalarKasparovK0IndexUniverse.lean:23
BC4lean.KKTheory.standardCompactEquivBC4lean/StandardModuleOperator.lean:174
BC4lean.KKTheory.standardCountableCutoff_mul_mul_tendstoBC4lean/CompactModuleStrongCutoff.lean:166
BC4lean.KKTheory.standardCountableInfiniteSumEquivBC4lean/StandardCountableFlatten.lean:201
BC4lean.KKTheory.standardCountablePairedCutoff_commutes_referenceBC4lean/StandardCountablePairedCutoff.lean:92
BC4lean.KKTheory.standardCountableReferenceCompression_tendstoBC4lean/StandardCountablePairedCutoff.lean:139
BC4lean.KKTheory.standardIdentityCycleBC4lean/StandardKasparovCycle.lean:22
BC4lean.KKTheory.standardIdentityCycle_operatorBC4lean/StandardKasparovCycle.lean:62
BC4lean.KKTheory.standardIdentityCycle_representationBC4lean/StandardKasparovCycle.lean:65
BC4lean.KKTheory.standardInteriorModuleTensorEquivEssentialBC4lean/StandardModuleTensor.lean:369
BC4lean.KKTheory.standardInteriorModuleTensorEvaluationCLM_normBC4lean/StandardModuleTensor.lean:211
BC4lean.KKTheory.standardInteriorModuleTensorEvaluation_rangeBC4lean/StandardModuleTensor.lean:305
BC4lean.KKTheory.standardInteriorModuleTensorHilbertEquivBC4lean/StandardModuleTensor.lean:384
BC4lean.KKTheory.standardLeftMulBC4lean/StandardModuleOperator.lean:41
BC4lean.KKTheory.standardModuleAbsorptionOfDenseSynthesisBC4lean/StandardModuleStabilization.lean:65
BC4lean.KKTheory.standardModuleAnalysis_square_hasSumBC4lean/StandardModuleFrame.lean:199
BC4lean.KKTheory.standardModuleStabilizationBC4lean/StandardModuleStabilization.lean:82
BC4lean.KKTheory.standardModuleSynthesis_adjoint_applyBC4lean/StandardModuleFrame.lean:166
BC4lean.KKTheory.standardModuleSynthesis_compactBC4lean/StandardModuleFrame.lean:124
BC4lean.KKTheory.standard_moduleRankOneBC4lean/RankOneOperator.lean:83
BC4lean.KKTheory.standard_module_completeBC4lean/HilbertCStarModule.lean:81
BC4lean.KKTheory.standard_module_innerBC4lean/HilbertCStarModule.lean:76
BC4lean.KKTheory.standard_module_isCountablyGeneratedBC4lean/StandardModuleOperator.lean:203
BC4lean.KKTheory.sumAssocBC4lean/HilbertModuleSum.lean:315
BC4lean.KKTheory.sumMapBC4lean/HilbertModuleSum.lean:186
BC4lean.KKTheory.sumSwapBC4lean/HilbertModuleSum.lean:295
BC4lean.KKTheory.tendsto_canonical_compact_approximateUnit_applyBC4lean/CompactModuleApproximateUnit.lean:119
BC4lean.KKTheory.tendsto_coefficient_approximateUnit_smulBC4lean/HilbertModuleCoefficientApproximateUnit.lean:85
BC4lean.KKTheory.tendsto_compact_sequence_applyBC4lean/CompactModuleApproximateUnit.lean:148
BC4lean.KKTheory.zero_mem_closure_convexHull_of_weak_tendstoBC4lean/QuasicentralApproximateUnit.lean:187

Chapter 6: Audited declaration source index

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.

Lean declarationGitHub source
BC4lean.KKTheory.CZero.actionBC4lean/CZeroAlgebra.lean:65
BC4lean.KKTheory.CZero.action_applyBC4lean/CZeroAlgebra.lean:78
BC4lean.KKTheory.CZero.pieceRestrictionBC4lean/CZeroPullback.lean:86
BC4lean.KKTheory.CZero.pieceRestriction_compBC4lean/CZeroPullback.lean:99
BC4lean.KKTheory.CZero.pieceRestriction_equivariantBC4lean/CZeroPullback.lean:106
BC4lean.TopologicalKHomology.cZero_separableSpaceBC4lean/CZeroSeparability.lean:91
BC4lean.TopologicalKHomology.cofinalIndexEquivBC4lean/TopologicalKHomologyColimit.lean:70
BC4lean.TopologicalKHomology.diagramBC4lean/TopologicalKHomologyColimit.lean:31
BC4lean.TopologicalKHomology.existsUnique_descBC4lean/TopologicalKHomologyColimit.lean:59
BC4lean.TopologicalKHomology.groupBC4lean/TopologicalKHomologyColimit.lean:38
BC4lean.TopologicalKHomology.homotopyEquivBC4lean/TopologicalKHomologyHomotopy.lean:79
BC4lean.TopologicalKHomology.ofPiece_eq_iffBC4lean/TopologicalKHomologyColimit.lean:51
BC4lean.TopologicalKHomology.pieceGroupBC4lean/TopologicalKHomologyDiagram.lean:32
BC4lean.TopologicalKHomology.pushforward_homotopyBC4lean/TopologicalKHomologyHomotopy.lean:55
BC4lean.TopologicalKHomology.spaceGroupBC4lean/TopologicalKHomologyDiagram.lean:26
BC4lean.TopologicalKHomology.toCanonicalModelEquivBC4lean/TopologicalKHomologyHomotopy.lean:135
BC4lean.TopologicalKHomology.topologicalGroupBC4lean/TopologicalKHomologyHomotopy.lean:130
BC4lean.TopologicalKHomology.transitionBC4lean/TopologicalKHomologyDiagram.lean:50
BC4lean.TopologicalKHomology.transition_reflBC4lean/TopologicalKHomologyDiagram.lean:56
BC4lean.TopologicalKHomology.transition_transBC4lean/TopologicalKHomologyDiagram.lean:62
BC4lean.TopologicalKHomology.universalComparison_uniqueBC4lean/TopologicalKHomologyHomotopy.lean:118
BC4lean.TopologicalKHomology.universalModelEquivBC4lean/TopologicalKHomologyHomotopy.lean:108

Chapter 7: Audited declaration source index

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.

Lean declarationGitHub source
BC4lean.Assembly.assemblyEvenHomBC4lean/AssemblyColimit.lean:52
BC4lean.Assembly.assemblyHomBC4lean/AssemblyColimit.lean:30
BC4lean.Assembly.assemblyHom_cofinalIndexEquivBC4lean/AssemblyCofinalIndex.lean:54
BC4lean.Assembly.assemblyHom_comp_pushforwardBC4lean/AssemblyModelNaturality.lean:63
BC4lean.Assembly.assemblyHom_homotopyEquivBC4lean/AssemblyModelNaturality.lean:71
BC4lean.Assembly.assemblyHom_ofPieceBC4lean/AssemblyColimit.lean:38
BC4lean.Assembly.assemblyHom_reindexBC4lean/AssemblyCofinalIndex.lean:43
BC4lean.Assembly.assemblyHom_uniqueBC4lean/AssemblyColimit.lean:43
BC4lean.Assembly.assemblyHom_universalModelEquivBC4lean/AssemblyModelNaturality.lean:88
BC4lean.Assembly.assemblyOddHomBC4lean/AssemblyColimit.lean:56
BC4lean.Assembly.cutoffKKClassBC4lean/AssemblyPieceHom.lean:43
BC4lean.Assembly.cutoffProductHomBC4lean/AssemblyPieceHom.lean:58
BC4lean.Assembly.indexedAssemblyHomBC4lean/AssemblyCofinalIndex.lean:29
BC4lean.Assembly.indexedAssemblyHom_cofinalComparisonEquivBC4lean/AssemblyCofinalIndex.lean:65
BC4lean.Assembly.indexedAssemblyHom_ofBC4lean/AssemblyCofinalIndex.lean:36
BC4lean.Assembly.pieceAssemblyEvenHomBC4lean/AssemblyPieceHom.lean:110
BC4lean.Assembly.pieceAssemblyHomBC4lean/AssemblyPieceHom.lean:100
BC4lean.Assembly.pieceAssemblyHom_boundedMapBC4lean/AssemblyModelNaturality.lean:40
BC4lean.Assembly.pieceAssemblyHom_eq_of_cutoffBC4lean/AssemblyPieceHom.lean:104
BC4lean.Assembly.pieceAssemblyHom_transitionBC4lean/AssemblyTransition.lean:38
BC4lean.Assembly.pieceAssemblyOddHomBC4lean/AssemblyPieceHom.lean:115
BC4lean.Assembly.reducedAssemblyEvenHomBC4lean/AssemblyModelNaturality.lean:115
BC4lean.Assembly.reducedAssemblyHomBC4lean/AssemblyModelNaturality.lean:110
BC4lean.Assembly.reducedAssemblyOddHomBC4lean/AssemblyModelNaturality.lean:118
BC4lean.Assembly.reducedScalarKKToAnalyticHomBC4lean/ReducedScalarKKComparison.lean:69
BC4lean.Assembly.spaceAssemblyHomBC4lean/AssemblyPieceHom.lean:76
BC4lean.Assembly.spaceAssemblyHom_independentBC4lean/AssemblyPieceHom.lean:85
BC4lean.KKTheory.AlgebraicCrossedProductBC4lean/AlgebraicCrossedProduct.lean:20
BC4lean.KKTheory.AlgebraicCrossedProduct.coeff_mulBC4lean/AlgebraicCrossedProduct.lean:183
BC4lean.KKTheory.AlgebraicCrossedProduct.coeff_starBC4lean/AlgebraicCrossedProduct.lean:205
BC4lean.KKTheory.EquivariantHilbertModule.adjointableActionBC4lean/KasparovDescentCompactAction.lean:22
BC4lean.KKTheory.EquivariantHilbertModule.compactOperatorActionBC4lean/KasparovDescentCompactAction.lean:67
BC4lean.KKTheory.EquivariantHilbertModule.compactOperatorAction_equivariantBC4lean/KasparovDescentCompactAction.lean:85
BC4lean.KKTheory.EquivariantHilbertModule.compactOperatorAction_rankOneBC4lean/KasparovDescentCompactAction.lean:91
BC4lean.KKTheory.KasparovDescent.ModuleBC4lean/KasparovDescentModule.lean:59
BC4lean.KKTheory.KasparovDescent.algebraicSourceOperator_norm_leBC4lean/KasparovDescentReducedRepresentation.lean:283
BC4lean.KKTheory.KasparovDescent.classHomBC4lean/KasparovDescentClass.lean:193
BC4lean.KKTheory.KasparovDescent.classHom_productBC4lean/KasparovDescentNativeParityProduct.lean:139
BC4lean.KKTheory.KasparovDescent.classHom_sourcePullbackBC4lean/KasparovDescentSourcePullbackClass.lean:106
BC4lean.KKTheory.KasparovDescent.coefficientRepresentationBC4lean/KasparovDescentModule.lean:39
BC4lean.KKTheory.KasparovDescent.countablyGeneratedBC4lean/KasparovDescentModule.lean:63
BC4lean.KKTheory.KasparovDescent.descended_gradedConnectionBC4lean/KasparovDescentConnection.lean:354
BC4lean.KKTheory.KasparovDescent.descended_isGradedProductBC4lean/KasparovDescentGradedProduct.lean:344
BC4lean.KKTheory.KasparovDescent.evenClassHomBC4lean/KasparovDescentClass.lean:148
BC4lean.KKTheory.KasparovDescent.evenClassHom_evenProductBC4lean/KasparovDescentEvenProduct.lean:55
BC4lean.KKTheory.KasparovDescent.evenClassHom_oddOddProductBC4lean/KasparovDescentNativeParityProduct.lean:108
BC4lean.KKTheory.KasparovDescent.evenClass_mkBC4lean/KasparovDescentClass.lean:118
BC4lean.KKTheory.KasparovDescent.evenFullHomotopyBC4lean/KasparovDescentFullHomotopy.lean:52
BC4lean.KKTheory.KasparovDescent.gradedFullHomotopyBC4lean/KasparovDescentGradedFullHomotopy.lean:68
BC4lean.KKTheory.KasparovDescent.mk_balanceBC4lean/KasparovDescentModule.lean:72
BC4lean.KKTheory.KasparovDescent.mk_innerBC4lean/KasparovDescentModule.lean:78
BC4lean.KKTheory.KasparovDescent.norm_operatorHom_leBC4lean/KasparovDescentModule.lean:96
BC4lean.KKTheory.KasparovDescent.oddClassHomBC4lean/KasparovDescentClass.lean:152
BC4lean.KKTheory.KasparovDescent.oddClassHom_evenOddProductBC4lean/KasparovDescentNativeParityProduct.lean:44
BC4lean.KKTheory.KasparovDescent.oddClassHom_oddEvenProductBC4lean/KasparovDescentNativeParityProduct.lean:75
BC4lean.KKTheory.KasparovDescent.oddClass_mkBC4lean/KasparovDescentClass.lean:122
BC4lean.KKTheory.KasparovDescent.oddFullHomotopyBC4lean/KasparovDescentFullHomotopy.lean:65
BC4lean.KKTheory.KasparovDescent.operatorHom_adjointBC4lean/KasparovDescentModule.lean:100
BC4lean.KKTheory.KasparovDescent.operatorHom_compactBC4lean/KasparovDescentModule.lean:109
BC4lean.KKTheory.KasparovDescent.operatorHom_mkBC4lean/KasparovDescentModule.lean:91
BC4lean.KKTheory.KasparovDescent.reducedSourceRepresentationBC4lean/KasparovDescentReducedRepresentation.lean:309
BC4lean.KKTheory.KasparovDescent.reducedSourceRepresentation_quadratic_positiveBC4lean/KasparovDescentProductPositivity.lean:70
BC4lean.KKTheory.KasparovDescent.reducedSourceRepresentation_singleBC4lean/KasparovDescentReducedRepresentation.lean:323
BC4lean.KKTheory.KasparovDescent.tensorComparisonBC4lean/KasparovDescentTensorComparison.lean:295
BC4lean.KKTheory.ReducedCrossedHilbertModuleBC4lean/ReducedCrossedHilbertModule.lean:137
BC4lean.KKTheory.ReducedCrossedProductBC4lean/ReducedCrossedProduct.lean:57
BC4lean.KKTheory.algebraicCrossedOperatorHom_eq_sumBC4lean/AlgebraicCrossedRepresentation.lean:86
BC4lean.KKTheory.algebraicCrossedReducedNormBC4lean/ReducedCrossedNorm.lean:86
BC4lean.KKTheory.algebraicCrossedReducedNorm_cstarBC4lean/ReducedCrossedNorm.lean:121
BC4lean.KKTheory.algebraicCrossedReducedNorm_eq_zeroBC4lean/ReducedCrossedNorm.lean:116
BC4lean.KKTheory.algebraicToReducedCrossedBC4lean/AlgebraicCrossedRepresentation.lean:111
BC4lean.KKTheory.algebraicToReducedCrossed_denseRangeBC4lean/AlgebraicCrossedRepresentation.lean:144
BC4lean.KKTheory.algebraicToReducedCrossed_injectiveBC4lean/ReducedCrossedNorm.lean:80
BC4lean.KKTheory.coefficientToReducedCrossedBC4lean/ReducedCrossedProduct.lean:87
BC4lean.KKTheory.norm_coefficientToReducedCrossedBC4lean/ReducedCrossedProduct.lean:100
BC4lean.KKTheory.norm_reducedCrossedCoefficientBC4lean/ReducedCrossedRegularOperators.lean:307
BC4lean.KKTheory.reducedCrossedAlgebra_coe_eq_closure_spanBC4lean/ReducedCrossedNorm.lean:158
BC4lean.KKTheory.reducedCrossedCoefficientBC4lean/ReducedCrossedRegularOperators.lean:165
BC4lean.KKTheory.reducedCrossedEvaluation_coefficientBC4lean/ReducedCrossedRegularOperators.lean:340
BC4lean.KKTheory.reducedCrossedEvaluation_regularBC4lean/ReducedCrossedRegularOperators.lean:333
BC4lean.KKTheory.reducedCrossedFiniteInner_self_eq_zero_iffBC4lean/ReducedCrossedHilbertModule.lean:88
BC4lean.KKTheory.reducedCrossedMapBC4lean/ReducedCrossedProductMap.lean:131
BC4lean.KKTheory.reducedCrossedMap_compBC4lean/ReducedCrossedProductMap.lean:239
BC4lean.KKTheory.reducedCrossedMk_denseRangeBC4lean/ReducedCrossedHilbertModule.lean:151
BC4lean.KKTheory.reducedCrossedMk_norm_coefficientsBC4lean/ReducedCrossedHilbertModule.lean:167
BC4lean.KKTheory.reducedCrossedProduct_nonUnitalCStarAlgebraBC4lean/ReducedCrossedProduct.lean:64
BC4lean.KKTheory.reducedCrossedProduct_separableSpaceBC4lean/ReducedCrossedNorm.lean:201
BC4lean.KKTheory.reducedCrossedRegularBC4lean/ReducedCrossedRegularOperators.lean:232
BC4lean.KKTheory.reducedCrossedScalarHilbertEquivBC4lean/ReducedCrossedScalarHilbert.lean:127
BC4lean.KKTheory.reducedCrossedScalarOperatorEquiv_generatorBC4lean/ReducedCrossedScalarProduct.lean:53
BC4lean.KKTheory.reducedCrossedScalarProductEquivBC4lean/ReducedCrossedScalarProduct.lean:123
BC4lean.KKTheory.reducedCrossedScalarProductEquiv_oneCoefficientBC4lean/ReducedCrossedScalarProduct.lean:153
BC4lean.KKTheory.reducedCrossed_covarianceBC4lean/ReducedCrossedRegularOperators.lean:284
BC4lean.OperatorKTheory.nonunitalProjectionK0BC4lean/NonunitalProjectionK0.lean:77
BC4lean.OperatorKTheory.nonunitalProjectionK0_eq_of_partialIsometryBC4lean/NonunitalProjectionK0.lean:85
BC4lean.OperatorKTheory.operatorK0Inclusion_nonunitalProjectionK0BC4lean/NonunitalProjectionK0.lean:80
BC4lean.ProperActions.CocompactPiece.exists_cutoffFunctionBC4lean/CocompactPieceCutoff.lean:54
BC4lean.ProperActions.CocompactPiece.properBC4lean/CocompactPieceCutoff.lean:46
BC4lean.ProperActions.Cutoff.CutoffFunctionBC4lean/ProperCutoffFunction.lean:27
BC4lean.ProperActions.Cutoff.algebraicProjectionBC4lean/CutoffAlgebraicProjection.lean:143
BC4lean.ProperActions.Cutoff.algebraicProjection_mul_selfBC4lean/CutoffAlgebraicProjection.lean:149
BC4lean.ProperActions.Cutoff.coeff_mixedAlgebraicBC4lean/CutoffAlgebraicProjection.lean:63
BC4lean.ProperActions.Cutoff.cutoffK0BC4lean/ReducedCutoffProjection.lean:51
BC4lean.ProperActions.Cutoff.cutoffK0_independentBC4lean/ReducedCutoffProjection.lean:56
BC4lean.ProperActions.Cutoff.cutoffK0_pieceRestrictionBC4lean/CutoffRestrictionNaturality.lean:149
BC4lean.ProperActions.Cutoff.cutoffK0_properPullbackBC4lean/CutoffProperPullbackNaturality.lean:116
BC4lean.ProperActions.Cutoff.exists_cutoffFunctionBC4lean/ProperCutoffFunction.lean:139
BC4lean.ProperActions.Cutoff.finite_mixedCoefficient_supportBC4lean/ProperCutoffFunction.lean:153
BC4lean.ProperActions.Cutoff.mixedAlgebraicBC4lean/CutoffAlgebraicProjection.lean:59
BC4lean.ProperActions.Cutoff.mixedAlgebraic_partialIsometryBC4lean/CutoffAlgebraicProjection.lean:154
BC4lean.ProperActions.Cutoff.normalized_tsumBC4lean/ProperCutoffFunction.lean:146
BC4lean.ProperActions.Cutoff.reducedCutoffProjectionBC4lean/ReducedCutoffProjection.lean:24
BC4lean.ProperActions.Cutoff.reducedCutoffProjection_isStarProjectionBC4lean/ReducedCutoffProjection.lean:28
BC4lean.ProperActions.Cutoff.reducedCutoffProjection_partialIsometryBC4lean/ReducedCutoffProjection.lean:40
BC4lean.ProperActions.Cutoff.star_algebraicProjectionBC4lean/CutoffAlgebraicProjection.lean:146
BC4lean.ProperActions.CutoffCoefficients.convolution_mixed_of_normalizedBC4lean/CutoffCoefficientProjection.lean:76
BC4lean.ProperActions.CutoffCoefficients.involution_mixedBC4lean/CutoffCoefficientProjection.lean:58

Chapter 8: Audited definitions and verified milestones

The linked general conjecture is a proposition-valued definition and remains unproved.

Lean declarationImmutable source
BC4lean.Assembly.BaumConnesConjectureBC4lean/BaumConnesProperty.lean:41
BC4lean.Assembly.BaumConnesPropertyBC4lean/BaumConnesProperty.lean:23
BC4lean.Assembly.assemblyHom_bijective_iff_homotopyEquivBC4lean/BaumConnesInvariance.lean:97
BC4lean.Assembly.assemblyHom_bijective_iff_pieceCriteriaBC4lean/AssemblyBijectivityCriteria.lean:76
BC4lean.Assembly.assemblyHom_injective_iff_commonTransitionBC4lean/AssemblyBijectivityCriteria.lean:47
BC4lean.Assembly.assemblyHom_injective_iff_homotopyEquivBC4lean/BaumConnesInvariance.lean:79
BC4lean.Assembly.assemblyHom_surjective_iff_homotopyEquivBC4lean/BaumConnesInvariance.lean:88
BC4lean.Assembly.assemblyHom_surjective_iff_pieceImagesBC4lean/AssemblyBijectivityCriteria.lean:27
BC4lean.Assembly.baumConnesProperty_iff_even_and_oddBC4lean/BaumConnesProperty.lean:27
BC4lean.Assembly.indexedAssemblyHom_bijective_iff_cofinalIndexBC4lean/BaumConnesInvariance.lean:145
BC4lean.Assembly.indexedAssemblyHom_injective_iff_cofinalIndexBC4lean/BaumConnesInvariance.lean:127
BC4lean.Assembly.indexedAssemblyHom_surjective_iff_cofinalIndexBC4lean/BaumConnesInvariance.lean:136
BC4lean.Assembly.indexedAssemblyProperty_iff_cofinalComparisonBC4lean/BaumConnesInvariance.lean:200
BC4lean.Assembly.modelAssemblyProperty_iff_baumConnesPropertyBC4lean/BaumConnesInvariance.lean:342
BC4lean.Chapter8Examples.FiniteGroupPointBC4lean/FiniteGroupPointCalibration.lean:18
BC4lean.Chapter8Examples.assemblyHom_eq_compactSpaceAssemblyBC4lean/CompactModelColimitCalibration.lean:169
BC4lean.Chapter8Examples.baumConnesProperty_unitBC4lean/UnitAssemblyEquivalence.lean:320
BC4lean.Chapter8Examples.compactSpaceGroupEquivBC4lean/CompactModelColimitCalibration.lean:144
BC4lean.Chapter8Examples.finiteCanonicalGlobalFixedPointBC4lean/FiniteGroupPointCalibration.lean:63
BC4lean.Chapter8Examples.finiteCanonicalPointHomotopyEquivBC4lean/FiniteGroupPointCalibration.lean:86
BC4lean.Chapter8Examples.finiteTopologicalPointSpaceEquivBC4lean/FiniteGroupPointCalibration.lean:111
BC4lean.Chapter8Examples.reducedAssemblyHom_finitePoint_formulaBC4lean/FiniteGroupPointCalibration.lean:145
BC4lean.Chapter8Examples.reducedAssemblyHom_unit_eqBC4lean/UnitAssemblyEquivalence.lean:311
BC4lean.Chapter8Examples.terminalColimitEquivBC4lean/CompactModelColimitCalibration.lean:31
BC4lean.Chapter8Examples.trivialAnalyticK0EquivBC4lean/TrivialAnalyticCalibration.lean:30
BC4lean.Chapter8Examples.trivialAnalyticK0Equiv_projectionBC4lean/TrivialAnalyticCalibration.lean:46
BC4lean.Chapter8Examples.trivialAnalyticK1EquivBC4lean/TrivialAnalyticCalibration.lean:34
BC4lean.Chapter8Examples.trivialAnalyticK1Equiv_unitaryBC4lean/TrivialAnalyticCalibration.lean:53
BC4lean.Chapter8Examples.unitAssemblyAddEquivBC4lean/UnitAssemblyEquivalence.lean:305
BC4lean.Chapter8Examples.wholeCompactPieceBC4lean/CompactModelColimitCalibration.lean:52
BC4lean.KKTheory.ScalarUnitProjection.relativeMap_nonunitalUnitProjectionBC4lean/ScalarUnitProjection.lean:125
BC4lean.KKTheory.ScalarUnitProjection.scalarKKOperatorK0AddEquiv_identityBC4lean/ScalarUnitProjection.lean:138
BC4lean.KKTheory.ScalarUnitProjection.unitRelativeCycleIsoBC4lean/ScalarUnitProjection.lean:100
BC4lean.KKTheory.UnitPointCutoff.cutoffKKClass_eq_homClassBC4lean/UnitPointCutoff.lean:114
BC4lean.KKTheory.UnitPointCutoff.pointCZeroEquivBC4lean/UnitPointCutoff.lean:43
BC4lean.KKTheory.UnitPointCutoff.reducedCutoffProjection_eq_scalarCoefficientBC4lean/UnitPointCutoff.lean:99
BC4lean.KKTheory.UnitScalarDescent.evenClass_coefficientRestrictionBC4lean/UnitScalarDescent.lean:88
BC4lean.KKTheory.UnitScalarDescent.evenCoefficientRestrictionIsoBC4lean/UnitScalarDescent.lean:46
BC4lean.KKTheory.UnitScalarDescent.oddClass_coefficientRestrictionBC4lean/UnitScalarDescent.lean:127
BC4lean.KKTheory.UnitScalarDescent.oddCoefficientRestrictionIsoBC4lean/UnitScalarDescent.lean:66

GroupAlgebra.lean

源码 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

L2Group.lean

源码 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

LeftRegularRepresentation.lean

源码 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

IntegratedRepresentation.lean

源码 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

ReducedGroupCStar.lean

源码 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

ReducedGroupCStarTrivial.lean

源码 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

ReducedNormGroupAlgebra.lean

源码 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

ReducedCompletion.lean

源码 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

OperatorProjections.lean

源码 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

MatrixStabilization.lean

源码 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

UnitaryHomotopy.lean

源码 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

RectangularEquivalence.lean

源码 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

StableProjectionMonoid.lean

源码 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

OperatorK0.lean

源码 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

ReducedOperatorK0.lean

源码 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

MatrixProjectionMap.lean

源码 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

OperatorK0Functoriality.lean

源码 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

OperatorK0Equivalence.lean

源码 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

ReducedCompletionK0.lean

源码 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

UnitaryRotation.lean

源码 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

StableUnitary.lean

源码 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

OperatorK1Functoriality.lean

源码 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

NonunitalOperatorK.lean

源码 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

UnitizationSplitting.lean

源码 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

NonUnitalK0Map.lean

源码 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

OperatorK0Product.lean

源码 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

OperatorK1Product.lean

源码 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

KernelProductEquiv.lean

源码 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

OperatorK1Equivalence.lean

源码 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

OperatorKUnitalAgreement.lean

源码 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

ReducedOperatorK1.lean

源码 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

UnitaryStableConjugation.lean

源码 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

ProjectionHomotopy.lean

源码 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

StarHomotopy.lean

源码 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

OperatorKHomotopy.lean

源码 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

ProperActions.lean

源码 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

ProperFixedPoints.lean

源码 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

EquivariantMaps.lean

源码 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

EquivariantHomotopy.lean

源码 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

EquivariantHomotopyEquiv.lean

源码 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

OrbitFixedPoints.lean

源码 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

ProperOrbitCells.lean

源码 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

HomotopyTerminal.lean

源码 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

FixedPointCriterion.lean

源码 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

CocompactPieces.lean

源码 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

EquivariantCW.lean

源码 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

OrbitCellMaps.lean

源码 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

DiskExtension.lean

源码 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

OrbitCellExtension.lean

源码 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

CellularExtension.lean

源码 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

CylinderBoundary.lean

源码 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

DiskHomotopyExtension.lean

源码 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

DiskPathLifting.lean

源码 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

EquivariantPathLifting.lean

源码 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

CellularHomotopy.lean

源码 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

ProbabilitySimplex.lean

源码 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

ProbabilityFixedPoints.lean

源码 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

ProbabilityProperAction.lean

源码 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

ProperActionPullback.lean

源码 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

ProbabilityUniversalTarget.lean

源码 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

HilbertCStarModule.lean

源码 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

AdjointableOperator.lean

源码 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

RankOneOperator.lean

源码 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