analysis.normed.group.SemiNormedGroup.kernels
⟷
Mathlib.Analysis.Normed.Group.SemiNormedGroupCat.Kernels
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -3,7 +3,7 @@ Copyright (c) 2021 Scott Morrison. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca, Johan Commelin, Scott Morrison
-/
-import Analysis.Normed.Group.SemiNormedGroup
+import Analysis.Normed.Group.SemiNormedGroupCat
import Analysis.Normed.Group.Quotient
import CategoryTheory.Limits.Shapes.Kernels
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,9 +3,9 @@ Copyright (c) 2021 Scott Morrison. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca, Johan Commelin, Scott Morrison
-/
-import Mathbin.Analysis.Normed.Group.SemiNormedGroup
-import Mathbin.Analysis.Normed.Group.Quotient
-import Mathbin.CategoryTheory.Limits.Shapes.Kernels
+import Analysis.Normed.Group.SemiNormedGroup
+import Analysis.Normed.Group.Quotient
+import CategoryTheory.Limits.Shapes.Kernels
#align_import analysis.normed.group.SemiNormedGroup.kernels from "leanprover-community/mathlib"@"1a51edf13debfcbe223fa06b1cb353b9ed9751cc"
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,16 +2,13 @@
Copyright (c) 2021 Scott Morrison. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca, Johan Commelin, Scott Morrison
-
-! This file was ported from Lean 3 source module analysis.normed.group.SemiNormedGroup.kernels
-! leanprover-community/mathlib commit 1a51edf13debfcbe223fa06b1cb353b9ed9751cc
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Analysis.Normed.Group.SemiNormedGroup
import Mathbin.Analysis.Normed.Group.Quotient
import Mathbin.CategoryTheory.Limits.Shapes.Kernels
+#align_import analysis.normed.group.SemiNormedGroup.kernels from "leanprover-community/mathlib"@"1a51edf13debfcbe223fa06b1cb353b9ed9751cc"
+
/-!
# Kernels and cokernels in SemiNormedGroup₁ and SemiNormedGroup
mathlib commit https://github.com/leanprover-community/mathlib/commit/1a51edf13debfcbe223fa06b1cb353b9ed9751cc
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca, Johan Commelin, Scott Morrison
! This file was ported from Lean 3 source module analysis.normed.group.SemiNormedGroup.kernels
-! leanprover-community/mathlib commit 17ef379e997badd73e5eabb4d38f11919ab3c4b3
+! leanprover-community/mathlib commit 1a51edf13debfcbe223fa06b1cb353b9ed9751cc
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -15,6 +15,9 @@ import Mathbin.CategoryTheory.Limits.Shapes.Kernels
/-!
# Kernels and cokernels in SemiNormedGroup₁ and SemiNormedGroup
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
We show that `SemiNormedGroup₁` has cokernels
(for which of course the `cokernel.π f` maps are norm non-increasing),
as well as the easier result that `SemiNormedGroup` has cokernels. We also show that
mathlib commit https://github.com/leanprover-community/mathlib/commit/5dc6092d09e5e489106865241986f7f2ad28d4c8
@@ -37,6 +37,7 @@ namespace SemiNormedGroupCat₁
noncomputable section
+#print SemiNormedGroupCat₁.cokernelCocone /-
/-- Auxiliary definition for `has_cokernels SemiNormedGroup₁`. -/
def cokernelCocone {X Y : SemiNormedGroupCat₁.{u}} (f : X ⟶ Y) : Cofork f 0 :=
Cofork.ofπ
@@ -50,7 +51,9 @@ def cokernelCocone {X Y : SemiNormedGroupCat₁.{u}} (f : X ⟶ Y) : Cofork f 0
use x
rfl)
#align SemiNormedGroup₁.cokernel_cocone SemiNormedGroupCat₁.cokernelCocone
+-/
+#print SemiNormedGroupCat₁.cokernelLift /-
/-- Auxiliary definition for `has_cokernels SemiNormedGroup₁`. -/
def cokernelLift {X Y : SemiNormedGroupCat₁.{u}} (f : X ⟶ Y) (s : CokernelCofork f) :
(cokernelCocone f).pt ⟶ s.pt := by
@@ -63,6 +66,7 @@ def cokernelLift {X Y : SemiNormedGroupCat₁.{u}} (f : X ⟶ Y) (s : CokernelCo
-- The lift has norm at most one:
exact NormedAddGroupHom.lift_normNoninc _ _ _ s.π.2
#align SemiNormedGroup₁.cokernel_lift SemiNormedGroupCat₁.cokernelLift
+-/
instance : HasCokernels SemiNormedGroupCat₁.{u}
where HasColimit X Y f :=
@@ -89,6 +93,7 @@ namespace SemiNormedGroupCat
section EqualizersAndKernels
+#print SemiNormedGroupCat.fork /-
/-- The equalizer cone for a parallel pair of morphisms of seminormed groups. -/
def fork {V W : SemiNormedGroupCat.{u}} (f g : V ⟶ W) : Fork f g :=
@Fork.ofι _ _ _ _ _ _ (of (f - g).ker) (NormedAddGroupHom.incl (f - g).ker) <|
@@ -99,7 +104,9 @@ def fork {V W : SemiNormedGroupCat.{u}} (f g : V ⟶ W) : Fork f g :=
Subtype.val_eq_coe, NormedAddGroupHom.mem_ker, NormedAddGroupHom.coe_sub, Pi.sub_apply,
sub_eq_zero] using this
#align SemiNormedGroup.fork SemiNormedGroupCat.fork
+-/
+#print SemiNormedGroupCat.hasLimit_parallelPair /-
instance hasLimit_parallelPair {V W : SemiNormedGroupCat.{u}} (f g : V ⟶ W) :
HasLimit (parallelPair f g)
where exists_limit :=
@@ -114,6 +121,7 @@ instance hasLimit_parallelPair {V W : SemiNormedGroupCat.{u}} (f g : V ⟶ W) :
(fun c => NormedAddGroupHom.ker.incl_comp_lift _ _ _) fun c g h => by ext x; dsimp;
rw [← h]; rfl }
#align SemiNormedGroup.has_limit_parallel_pair SemiNormedGroupCat.hasLimit_parallelPair
+-/
instance : Limits.HasEqualizers.{u, u + 1} SemiNormedGroupCat :=
@hasEqualizers_of_hasLimit_parallelPair SemiNormedGroupCat _ fun V W f g =>
@@ -123,6 +131,7 @@ end EqualizersAndKernels
section Cokernel
+#print SemiNormedGroupCat.cokernelCocone /-
-- PROJECT: can we reuse the work to construct cokernels in `SemiNormedGroup₁` here?
-- I don't see a way to do this that is less work than just repeating the relevant parts.
/-- Auxiliary definition for `has_cokernels SemiNormedGroup`. -/
@@ -133,7 +142,9 @@ def cokernelCocone {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) : Cofork f 0 :=
simp only [comp_apply, limits.zero_comp, NormedAddGroupHom.zero_apply, ←
NormedAddGroupHom.mem_ker, f.range.ker_normed_mk, f.mem_range, exists_apply_eq_apply])
#align SemiNormedGroup.cokernel_cocone SemiNormedGroupCat.cokernelCocone
+-/
+#print SemiNormedGroupCat.cokernelLift /-
/-- Auxiliary definition for `has_cokernels SemiNormedGroup`. -/
def cokernelLift {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) (s : CokernelCofork f) :
(cokernelCocone f).pt ⟶ s.pt :=
@@ -143,7 +154,9 @@ def cokernelLift {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) (s : CokernelCofor
change (f ≫ s.π) b = 0
simp)
#align SemiNormedGroup.cokernel_lift SemiNormedGroupCat.cokernelLift
+-/
+#print SemiNormedGroupCat.isColimitCokernelCocone /-
/-- Auxiliary definition for `has_cokernels SemiNormedGroup`. -/
def isColimitCokernelCocone {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
IsColimit (cokernelCocone f) :=
@@ -156,6 +169,7 @@ def isColimitCokernelCocone {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
simp)
fun s m w => NormedAddGroupHom.lift_unique f.range _ _ _ w
#align SemiNormedGroup.is_colimit_cokernel_cocone SemiNormedGroupCat.isColimitCokernelCocone
+-/
instance : HasCokernels SemiNormedGroupCat.{u}
where HasColimit X Y f :=
@@ -168,27 +182,36 @@ example : HasCokernels SemiNormedGroupCat := by infer_instance
section ExplicitCokernel
+#print SemiNormedGroupCat.explicitCokernel /-
/-- An explicit choice of cokernel, which has good properties with respect to the norm. -/
def explicitCokernel {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) : SemiNormedGroupCat.{u} :=
(cokernelCocone f).pt
#align SemiNormedGroup.explicit_cokernel SemiNormedGroupCat.explicitCokernel
+-/
+#print SemiNormedGroupCat.explicitCokernelDesc /-
/-- Descend to the explicit cokernel. -/
def explicitCokernelDesc {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y} {g : Y ⟶ Z} (w : f ≫ g = 0) :
explicitCokernel f ⟶ Z :=
(isColimitCokernelCocone f).desc (Cofork.ofπ g (by simp [w]))
#align SemiNormedGroup.explicit_cokernel_desc SemiNormedGroupCat.explicitCokernelDesc
+-/
+#print SemiNormedGroupCat.explicitCokernelπ /-
/-- The projection from `Y` to the explicit cokernel of `X ⟶ Y`. -/
def explicitCokernelπ {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) : Y ⟶ explicitCokernel f :=
(cokernelCocone f).ι.app WalkingParallelPair.one
#align SemiNormedGroup.explicit_cokernel_π SemiNormedGroupCat.explicitCokernelπ
+-/
+#print SemiNormedGroupCat.explicitCokernelπ_surjective /-
theorem explicitCokernelπ_surjective {X Y : SemiNormedGroupCat.{u}} {f : X ⟶ Y} :
Function.Surjective (explicitCokernelπ f) :=
surjective_quot_mk _
#align SemiNormedGroup.explicit_cokernel_π_surjective SemiNormedGroupCat.explicitCokernelπ_surjective
+-/
+#print SemiNormedGroupCat.comp_explicitCokernelπ /-
@[simp, reassoc]
theorem comp_explicitCokernelπ {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
f ≫ explicitCokernelπ f = 0 :=
@@ -196,25 +219,33 @@ theorem comp_explicitCokernelπ {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
convert (cokernel_cocone f).w walking_parallel_pair_hom.left
simp
#align SemiNormedGroup.comp_explicit_cokernel_π SemiNormedGroupCat.comp_explicitCokernelπ
+-/
+#print SemiNormedGroupCat.explicitCokernelπ_apply_dom_eq_zero /-
@[simp]
theorem explicitCokernelπ_apply_dom_eq_zero {X Y : SemiNormedGroupCat.{u}} {f : X ⟶ Y} (x : X) :
(explicitCokernelπ f) (f x) = 0 :=
show (f ≫ explicitCokernelπ f) x = 0 by rw [comp_explicit_cokernel_π]; rfl
#align SemiNormedGroup.explicit_cokernel_π_apply_dom_eq_zero SemiNormedGroupCat.explicitCokernelπ_apply_dom_eq_zero
+-/
+#print SemiNormedGroupCat.explicitCokernelπ_desc /-
@[simp, reassoc]
theorem explicitCokernelπ_desc {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
(w : f ≫ g = 0) : explicitCokernelπ f ≫ explicitCokernelDesc w = g :=
(isColimitCokernelCocone f).fac _ _
#align SemiNormedGroup.explicit_cokernel_π_desc SemiNormedGroupCat.explicitCokernelπ_desc
+-/
+#print SemiNormedGroupCat.explicitCokernelπ_desc_apply /-
@[simp]
theorem explicitCokernelπ_desc_apply {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
{cond : f ≫ g = 0} (x : Y) : explicitCokernelDesc cond (explicitCokernelπ f x) = g x :=
show (explicitCokernelπ f ≫ explicitCokernelDesc cond) x = g x by rw [explicit_cokernel_π_desc]
#align SemiNormedGroup.explicit_cokernel_π_desc_apply SemiNormedGroupCat.explicitCokernelπ_desc_apply
+-/
+#print SemiNormedGroupCat.explicitCokernelDesc_unique /-
theorem explicitCokernelDesc_unique {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
(w : f ≫ g = 0) (e : explicitCokernel f ⟶ Z) (he : explicitCokernelπ f ≫ e = g) :
e = explicitCokernelDesc w :=
@@ -225,7 +256,9 @@ theorem explicitCokernelDesc_unique {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶
simp
· exact he
#align SemiNormedGroup.explicit_cokernel_desc_unique SemiNormedGroupCat.explicitCokernelDesc_unique
+-/
+#print SemiNormedGroupCat.explicitCokernelDesc_comp_eq_desc /-
theorem explicitCokernelDesc_comp_eq_desc {X Y Z W : SemiNormedGroupCat.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
{h : Z ⟶ W} {cond : f ≫ g = 0} :
explicitCokernelDesc cond ≫ h =
@@ -235,13 +268,17 @@ theorem explicitCokernelDesc_comp_eq_desc {X Y Z W : SemiNormedGroupCat.{u}} {f
refine' explicit_cokernel_desc_unique _ _ _
rw [← CategoryTheory.Category.assoc, explicit_cokernel_π_desc]
#align SemiNormedGroup.explicit_cokernel_desc_comp_eq_desc SemiNormedGroupCat.explicitCokernelDesc_comp_eq_desc
+-/
+#print SemiNormedGroupCat.explicitCokernelDesc_zero /-
@[simp]
theorem explicitCokernelDesc_zero {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y} :
explicitCokernelDesc (show f ≫ (0 : Y ⟶ Z) = 0 from CategoryTheory.Limits.comp_zero) = 0 :=
Eq.symm <| explicitCokernelDesc_unique _ _ CategoryTheory.Limits.comp_zero
#align SemiNormedGroup.explicit_cokernel_desc_zero SemiNormedGroupCat.explicitCokernelDesc_zero
+-/
+#print SemiNormedGroupCat.explicitCokernel_hom_ext /-
@[ext]
theorem explicitCokernel_hom_ext {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y}
(e₁ e₂ : explicitCokernel f ⟶ Z) (h : explicitCokernelπ f ≫ e₁ = explicitCokernelπ f ≫ e₂) :
@@ -253,7 +290,9 @@ theorem explicitCokernel_hom_ext {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y}
apply explicit_cokernel_desc_unique
exact h
#align SemiNormedGroup.explicit_cokernel_hom_ext SemiNormedGroupCat.explicitCokernel_hom_ext
+-/
+#print SemiNormedGroupCat.explicitCokernelπ.epi /-
instance explicitCokernelπ.epi {X Y : SemiNormedGroupCat.{u}} {f : X ⟶ Y} :
Epi (explicitCokernelπ f) := by
constructor
@@ -263,24 +302,32 @@ instance explicitCokernelπ.epi {X Y : SemiNormedGroupCat.{u}} {f : X ⟶ Y} :
change (explicit_cokernel_π f ≫ g) _ = _
rw [H]
#align SemiNormedGroup.explicit_cokernel_π.epi SemiNormedGroupCat.explicitCokernelπ.epi
+-/
+#print SemiNormedGroupCat.isQuotient_explicitCokernelπ /-
theorem isQuotient_explicitCokernelπ {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
NormedAddGroupHom.IsQuotient (explicitCokernelπ f) :=
NormedAddGroupHom.isQuotientQuotient _
#align SemiNormedGroup.is_quotient_explicit_cokernel_π SemiNormedGroupCat.isQuotient_explicitCokernelπ
+-/
+#print SemiNormedGroupCat.normNoninc_explicitCokernelπ /-
theorem normNoninc_explicitCokernelπ {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
(explicitCokernelπ f).NormNoninc :=
(isQuotient_explicitCokernelπ f).norm_le
#align SemiNormedGroup.norm_noninc_explicit_cokernel_π SemiNormedGroupCat.normNoninc_explicitCokernelπ
+-/
open scoped NNReal
+#print SemiNormedGroupCat.explicitCokernelDesc_norm_le_of_norm_le /-
theorem explicitCokernelDesc_norm_le_of_norm_le {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y}
{g : Y ⟶ Z} (w : f ≫ g = 0) (c : ℝ≥0) (h : ‖g‖ ≤ c) : ‖explicitCokernelDesc w‖ ≤ c :=
NormedAddGroupHom.lift_norm_le _ _ _ h
#align SemiNormedGroup.explicit_cokernel_desc_norm_le_of_norm_le SemiNormedGroupCat.explicitCokernelDesc_norm_le_of_norm_le
+-/
+#print SemiNormedGroupCat.explicitCokernelDesc_normNoninc /-
theorem explicitCokernelDesc_normNoninc {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
{cond : f ≫ g = 0} (hg : g.NormNoninc) : (explicitCokernelDesc cond).NormNoninc :=
by
@@ -290,37 +337,49 @@ theorem explicitCokernelDesc_normNoninc {X Y Z : SemiNormedGroupCat.{u}} {f : X
explicit_cokernel_desc_norm_le_of_norm_le cond 1
(NormedAddGroupHom.NormNoninc.normNoninc_iff_norm_le_one.1 hg)
#align SemiNormedGroup.explicit_cokernel_desc_norm_noninc SemiNormedGroupCat.explicitCokernelDesc_normNoninc
+-/
+#print SemiNormedGroupCat.explicitCokernelDesc_comp_eq_zero /-
theorem explicitCokernelDesc_comp_eq_zero {X Y Z W : SemiNormedGroupCat.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
{h : Z ⟶ W} (cond : f ≫ g = 0) (cond2 : g ≫ h = 0) : explicitCokernelDesc cond ≫ h = 0 :=
by
rw [← cancel_epi (explicit_cokernel_π f), ← category.assoc, explicit_cokernel_π_desc]
simp [cond2]
#align SemiNormedGroup.explicit_cokernel_desc_comp_eq_zero SemiNormedGroupCat.explicitCokernelDesc_comp_eq_zero
+-/
+#print SemiNormedGroupCat.explicitCokernelDesc_norm_le /-
theorem explicitCokernelDesc_norm_le {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
(w : f ≫ g = 0) : ‖explicitCokernelDesc w‖ ≤ ‖g‖ :=
explicitCokernelDesc_norm_le_of_norm_le w ‖g‖₊ le_rfl
#align SemiNormedGroup.explicit_cokernel_desc_norm_le SemiNormedGroupCat.explicitCokernelDesc_norm_le
+-/
+#print SemiNormedGroupCat.explicitCokernelIso /-
/-- The explicit cokernel is isomorphic to the usual cokernel. -/
def explicitCokernelIso {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
explicitCokernel f ≅ cokernel f :=
(isColimitCokernelCocone f).coconePointUniqueUpToIso (colimit.isColimit _)
#align SemiNormedGroup.explicit_cokernel_iso SemiNormedGroupCat.explicitCokernelIso
+-/
+#print SemiNormedGroupCat.explicitCokernelIso_hom_π /-
@[simp]
theorem explicitCokernelIso_hom_π {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
explicitCokernelπ f ≫ (explicitCokernelIso f).hom = cokernel.π _ := by
simp [explicit_cokernel_π, explicit_cokernel_iso, is_colimit.cocone_point_unique_up_to_iso]
#align SemiNormedGroup.explicit_cokernel_iso_hom_π SemiNormedGroupCat.explicitCokernelIso_hom_π
+-/
+#print SemiNormedGroupCat.explicitCokernelIso_inv_π /-
@[simp]
theorem explicitCokernelIso_inv_π {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
cokernel.π f ≫ (explicitCokernelIso f).inv = explicitCokernelπ f := by
simp [explicit_cokernel_π, explicit_cokernel_iso]
#align SemiNormedGroup.explicit_cokernel_iso_inv_π SemiNormedGroupCat.explicitCokernelIso_inv_π
+-/
+#print SemiNormedGroupCat.explicitCokernelIso_hom_desc /-
@[simp]
theorem explicitCokernelIso_hom_desc {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
(w : f ≫ g = 0) : (explicitCokernelIso f).hom ≫ cokernel.desc f g w = explicitCokernelDesc w :=
@@ -329,14 +388,18 @@ theorem explicitCokernelIso_hom_desc {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶
simp [explicit_cokernel_desc, explicit_cokernel_π, explicit_cokernel_iso,
is_colimit.cocone_point_unique_up_to_iso]
#align SemiNormedGroup.explicit_cokernel_iso_hom_desc SemiNormedGroupCat.explicitCokernelIso_hom_desc
+-/
+#print SemiNormedGroupCat.explicitCokernel.map /-
/-- A special case of `category_theory.limits.cokernel.map` adapted to `explicit_cokernel`. -/
noncomputable def explicitCokernel.map {A B C D : SemiNormedGroupCat.{u}} {fab : A ⟶ B}
{fbd : B ⟶ D} {fac : A ⟶ C} {fcd : C ⟶ D} (h : fab ≫ fbd = fac ≫ fcd) :
explicitCokernel fab ⟶ explicitCokernel fcd :=
@explicitCokernelDesc _ _ _ fab (fbd ≫ explicitCokernelπ _) <| by simp [reassoc_of h]
#align SemiNormedGroup.explicit_cokernel.map SemiNormedGroupCat.explicitCokernel.map
+-/
+#print SemiNormedGroupCat.ExplicitCoker.map_desc /-
/-- A special case of `category_theory.limits.cokernel.map_desc` adapted to `explicit_cokernel`. -/
theorem ExplicitCoker.map_desc {A B C D B' D' : SemiNormedGroupCat.{u}} {fab : A ⟶ B} {fbd : B ⟶ D}
{fac : A ⟶ C} {fcd : C ⟶ D} {h : fab ≫ fbd = fac ≫ fcd} {fbb' : B ⟶ B'} {fdd' : D ⟶ D'}
@@ -346,6 +409,7 @@ theorem ExplicitCoker.map_desc {A B C D B' D' : SemiNormedGroupCat.{u}} {fab : A
delta explicit_cokernel.map
simp [← cancel_epi (explicit_cokernel_π fab), category.assoc, explicit_cokernel_π_desc, h']
#align SemiNormedGroup.explicit_coker.map_desc SemiNormedGroupCat.ExplicitCoker.map_desc
+-/
end ExplicitCokernel
mathlib commit https://github.com/leanprover-community/mathlib/commit/2a0ce625dbb0ffbc7d1316597de0b25c1ec75303
@@ -33,26 +33,26 @@ open CategoryTheory CategoryTheory.Limits
universe u
-namespace SemiNormedGroup₁
+namespace SemiNormedGroupCat₁
noncomputable section
/-- Auxiliary definition for `has_cokernels SemiNormedGroup₁`. -/
-def cokernelCocone {X Y : SemiNormedGroup₁.{u}} (f : X ⟶ Y) : Cofork f 0 :=
+def cokernelCocone {X Y : SemiNormedGroupCat₁.{u}} (f : X ⟶ Y) : Cofork f 0 :=
Cofork.ofπ
- (@SemiNormedGroup₁.mkHom _ (SemiNormedGroup.of (Y ⧸ NormedAddGroupHom.range f.1))
+ (@SemiNormedGroupCat₁.mkHom _ (SemiNormedGroupCat.of (Y ⧸ NormedAddGroupHom.range f.1))
f.1.range.normedMk (NormedAddGroupHom.isQuotientQuotient _).norm_le)
(by
ext
simp only [comp_apply, limits.zero_comp, NormedAddGroupHom.zero_apply,
- SemiNormedGroup₁.mkHom_apply, SemiNormedGroup₁.zero_apply, ← NormedAddGroupHom.mem_ker,
- f.1.range.ker_normedMk, f.1.mem_range]
+ SemiNormedGroupCat₁.mkHom_apply, SemiNormedGroupCat₁.zero_apply, ←
+ NormedAddGroupHom.mem_ker, f.1.range.ker_normedMk, f.1.mem_range]
use x
rfl)
-#align SemiNormedGroup₁.cokernel_cocone SemiNormedGroup₁.cokernelCocone
+#align SemiNormedGroup₁.cokernel_cocone SemiNormedGroupCat₁.cokernelCocone
/-- Auxiliary definition for `has_cokernels SemiNormedGroup₁`. -/
-def cokernelLift {X Y : SemiNormedGroup₁.{u}} (f : X ⟶ Y) (s : CokernelCofork f) :
+def cokernelLift {X Y : SemiNormedGroupCat₁.{u}} (f : X ⟶ Y) (s : CokernelCofork f) :
(cokernelCocone f).pt ⟶ s.pt := by
fconstructor
-- The lift itself:
@@ -62,9 +62,9 @@ def cokernelLift {X Y : SemiNormedGroup₁.{u}} (f : X ⟶ Y) (s : CokernelCofor
simp
-- The lift has norm at most one:
exact NormedAddGroupHom.lift_normNoninc _ _ _ s.π.2
-#align SemiNormedGroup₁.cokernel_lift SemiNormedGroup₁.cokernelLift
+#align SemiNormedGroup₁.cokernel_lift SemiNormedGroupCat₁.cokernelLift
-instance : HasCokernels SemiNormedGroup₁.{u}
+instance : HasCokernels SemiNormedGroupCat₁.{u}
where HasColimit X Y f :=
HasColimit.mk
{ Cocone := cokernelCocone f
@@ -81,16 +81,16 @@ instance : HasCokernels SemiNormedGroup₁.{u}
(NormedAddGroupHom.lift_unique f.1.range _ _ _ (congr_arg Subtype.val w : _)) }
-- Sanity check
-example : HasCokernels SemiNormedGroup₁ := by infer_instance
+example : HasCokernels SemiNormedGroupCat₁ := by infer_instance
-end SemiNormedGroup₁
+end SemiNormedGroupCat₁
-namespace SemiNormedGroup
+namespace SemiNormedGroupCat
section EqualizersAndKernels
/-- The equalizer cone for a parallel pair of morphisms of seminormed groups. -/
-def fork {V W : SemiNormedGroup.{u}} (f g : V ⟶ W) : Fork f g :=
+def fork {V W : SemiNormedGroupCat.{u}} (f g : V ⟶ W) : Fork f g :=
@Fork.ofι _ _ _ _ _ _ (of (f - g).ker) (NormedAddGroupHom.incl (f - g).ker) <|
by
ext v
@@ -98,9 +98,9 @@ def fork {V W : SemiNormedGroup.{u}} (f g : V ⟶ W) : Fork f g :=
simpa only [NormedAddGroupHom.incl_apply, Pi.zero_apply, coe_comp, NormedAddGroupHom.coe_zero,
Subtype.val_eq_coe, NormedAddGroupHom.mem_ker, NormedAddGroupHom.coe_sub, Pi.sub_apply,
sub_eq_zero] using this
-#align SemiNormedGroup.fork SemiNormedGroup.fork
+#align SemiNormedGroup.fork SemiNormedGroupCat.fork
-instance hasLimit_parallelPair {V W : SemiNormedGroup.{u}} (f g : V ⟶ W) :
+instance hasLimit_parallelPair {V W : SemiNormedGroupCat.{u}} (f g : V ⟶ W) :
HasLimit (parallelPair f g)
where exists_limit :=
Nonempty.intro
@@ -113,11 +113,11 @@ instance hasLimit_parallelPair {V W : SemiNormedGroup.{u}} (f g : V ⟶ W) :
rw [AddMonoidHom.map_sub, AddMonoidHom.sub_apply, sub_eq_zero]; exact c.condition)
(fun c => NormedAddGroupHom.ker.incl_comp_lift _ _ _) fun c g h => by ext x; dsimp;
rw [← h]; rfl }
-#align SemiNormedGroup.has_limit_parallel_pair SemiNormedGroup.hasLimit_parallelPair
+#align SemiNormedGroup.has_limit_parallel_pair SemiNormedGroupCat.hasLimit_parallelPair
-instance : Limits.HasEqualizers.{u, u + 1} SemiNormedGroup :=
- @hasEqualizers_of_hasLimit_parallelPair SemiNormedGroup _ fun V W f g =>
- SemiNormedGroup.hasLimit_parallelPair f g
+instance : Limits.HasEqualizers.{u, u + 1} SemiNormedGroupCat :=
+ @hasEqualizers_of_hasLimit_parallelPair SemiNormedGroupCat _ fun V W f g =>
+ SemiNormedGroupCat.hasLimit_parallelPair f g
end EqualizersAndKernels
@@ -126,26 +126,26 @@ section Cokernel
-- PROJECT: can we reuse the work to construct cokernels in `SemiNormedGroup₁` here?
-- I don't see a way to do this that is less work than just repeating the relevant parts.
/-- Auxiliary definition for `has_cokernels SemiNormedGroup`. -/
-def cokernelCocone {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) : Cofork f 0 :=
- @Cofork.ofπ _ _ _ _ _ _ (SemiNormedGroup.of (Y ⧸ NormedAddGroupHom.range f)) f.range.normedMk
+def cokernelCocone {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) : Cofork f 0 :=
+ @Cofork.ofπ _ _ _ _ _ _ (SemiNormedGroupCat.of (Y ⧸ NormedAddGroupHom.range f)) f.range.normedMk
(by
ext
simp only [comp_apply, limits.zero_comp, NormedAddGroupHom.zero_apply, ←
NormedAddGroupHom.mem_ker, f.range.ker_normed_mk, f.mem_range, exists_apply_eq_apply])
-#align SemiNormedGroup.cokernel_cocone SemiNormedGroup.cokernelCocone
+#align SemiNormedGroup.cokernel_cocone SemiNormedGroupCat.cokernelCocone
/-- Auxiliary definition for `has_cokernels SemiNormedGroup`. -/
-def cokernelLift {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) (s : CokernelCofork f) :
+def cokernelLift {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) (s : CokernelCofork f) :
(cokernelCocone f).pt ⟶ s.pt :=
NormedAddGroupHom.lift _ s.π
(by
rintro _ ⟨b, rfl⟩
change (f ≫ s.π) b = 0
simp)
-#align SemiNormedGroup.cokernel_lift SemiNormedGroup.cokernelLift
+#align SemiNormedGroup.cokernel_lift SemiNormedGroupCat.cokernelLift
/-- Auxiliary definition for `has_cokernels SemiNormedGroup`. -/
-def isColimitCokernelCocone {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) :
+def isColimitCokernelCocone {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
IsColimit (cokernelCocone f) :=
isColimitAux _ (cokernelLift f)
(fun s => by
@@ -155,67 +155,67 @@ def isColimitCokernelCocone {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) :
change (f ≫ s.π) b = 0
simp)
fun s m w => NormedAddGroupHom.lift_unique f.range _ _ _ w
-#align SemiNormedGroup.is_colimit_cokernel_cocone SemiNormedGroup.isColimitCokernelCocone
+#align SemiNormedGroup.is_colimit_cokernel_cocone SemiNormedGroupCat.isColimitCokernelCocone
-instance : HasCokernels SemiNormedGroup.{u}
+instance : HasCokernels SemiNormedGroupCat.{u}
where HasColimit X Y f :=
HasColimit.mk
{ Cocone := cokernelCocone f
IsColimit := isColimitCokernelCocone f }
-- Sanity check
-example : HasCokernels SemiNormedGroup := by infer_instance
+example : HasCokernels SemiNormedGroupCat := by infer_instance
section ExplicitCokernel
/-- An explicit choice of cokernel, which has good properties with respect to the norm. -/
-def explicitCokernel {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) : SemiNormedGroup.{u} :=
+def explicitCokernel {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) : SemiNormedGroupCat.{u} :=
(cokernelCocone f).pt
-#align SemiNormedGroup.explicit_cokernel SemiNormedGroup.explicitCokernel
+#align SemiNormedGroup.explicit_cokernel SemiNormedGroupCat.explicitCokernel
/-- Descend to the explicit cokernel. -/
-def explicitCokernelDesc {X Y Z : SemiNormedGroup.{u}} {f : X ⟶ Y} {g : Y ⟶ Z} (w : f ≫ g = 0) :
+def explicitCokernelDesc {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y} {g : Y ⟶ Z} (w : f ≫ g = 0) :
explicitCokernel f ⟶ Z :=
(isColimitCokernelCocone f).desc (Cofork.ofπ g (by simp [w]))
-#align SemiNormedGroup.explicit_cokernel_desc SemiNormedGroup.explicitCokernelDesc
+#align SemiNormedGroup.explicit_cokernel_desc SemiNormedGroupCat.explicitCokernelDesc
/-- The projection from `Y` to the explicit cokernel of `X ⟶ Y`. -/
-def explicitCokernelπ {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) : Y ⟶ explicitCokernel f :=
+def explicitCokernelπ {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) : Y ⟶ explicitCokernel f :=
(cokernelCocone f).ι.app WalkingParallelPair.one
-#align SemiNormedGroup.explicit_cokernel_π SemiNormedGroup.explicitCokernelπ
+#align SemiNormedGroup.explicit_cokernel_π SemiNormedGroupCat.explicitCokernelπ
-theorem explicitCokernelπ_surjective {X Y : SemiNormedGroup.{u}} {f : X ⟶ Y} :
+theorem explicitCokernelπ_surjective {X Y : SemiNormedGroupCat.{u}} {f : X ⟶ Y} :
Function.Surjective (explicitCokernelπ f) :=
surjective_quot_mk _
-#align SemiNormedGroup.explicit_cokernel_π_surjective SemiNormedGroup.explicitCokernelπ_surjective
+#align SemiNormedGroup.explicit_cokernel_π_surjective SemiNormedGroupCat.explicitCokernelπ_surjective
@[simp, reassoc]
-theorem comp_explicitCokernelπ {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) :
+theorem comp_explicitCokernelπ {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
f ≫ explicitCokernelπ f = 0 :=
by
convert (cokernel_cocone f).w walking_parallel_pair_hom.left
simp
-#align SemiNormedGroup.comp_explicit_cokernel_π SemiNormedGroup.comp_explicitCokernelπ
+#align SemiNormedGroup.comp_explicit_cokernel_π SemiNormedGroupCat.comp_explicitCokernelπ
@[simp]
-theorem explicitCokernelπ_apply_dom_eq_zero {X Y : SemiNormedGroup.{u}} {f : X ⟶ Y} (x : X) :
+theorem explicitCokernelπ_apply_dom_eq_zero {X Y : SemiNormedGroupCat.{u}} {f : X ⟶ Y} (x : X) :
(explicitCokernelπ f) (f x) = 0 :=
show (f ≫ explicitCokernelπ f) x = 0 by rw [comp_explicit_cokernel_π]; rfl
-#align SemiNormedGroup.explicit_cokernel_π_apply_dom_eq_zero SemiNormedGroup.explicitCokernelπ_apply_dom_eq_zero
+#align SemiNormedGroup.explicit_cokernel_π_apply_dom_eq_zero SemiNormedGroupCat.explicitCokernelπ_apply_dom_eq_zero
@[simp, reassoc]
-theorem explicitCokernelπ_desc {X Y Z : SemiNormedGroup.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
+theorem explicitCokernelπ_desc {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
(w : f ≫ g = 0) : explicitCokernelπ f ≫ explicitCokernelDesc w = g :=
(isColimitCokernelCocone f).fac _ _
-#align SemiNormedGroup.explicit_cokernel_π_desc SemiNormedGroup.explicitCokernelπ_desc
+#align SemiNormedGroup.explicit_cokernel_π_desc SemiNormedGroupCat.explicitCokernelπ_desc
@[simp]
-theorem explicitCokernelπ_desc_apply {X Y Z : SemiNormedGroup.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
+theorem explicitCokernelπ_desc_apply {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
{cond : f ≫ g = 0} (x : Y) : explicitCokernelDesc cond (explicitCokernelπ f x) = g x :=
show (explicitCokernelπ f ≫ explicitCokernelDesc cond) x = g x by rw [explicit_cokernel_π_desc]
-#align SemiNormedGroup.explicit_cokernel_π_desc_apply SemiNormedGroup.explicitCokernelπ_desc_apply
+#align SemiNormedGroup.explicit_cokernel_π_desc_apply SemiNormedGroupCat.explicitCokernelπ_desc_apply
-theorem explicitCokernelDesc_unique {X Y Z : SemiNormedGroup.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
+theorem explicitCokernelDesc_unique {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
(w : f ≫ g = 0) (e : explicitCokernel f ⟶ Z) (he : explicitCokernelπ f ≫ e = g) :
e = explicitCokernelDesc w :=
by
@@ -224,9 +224,9 @@ theorem explicitCokernelDesc_unique {X Y Z : SemiNormedGroup.{u}} {f : X ⟶ Y}
· convert w.symm
simp
· exact he
-#align SemiNormedGroup.explicit_cokernel_desc_unique SemiNormedGroup.explicitCokernelDesc_unique
+#align SemiNormedGroup.explicit_cokernel_desc_unique SemiNormedGroupCat.explicitCokernelDesc_unique
-theorem explicitCokernelDesc_comp_eq_desc {X Y Z W : SemiNormedGroup.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
+theorem explicitCokernelDesc_comp_eq_desc {X Y Z W : SemiNormedGroupCat.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
{h : Z ⟶ W} {cond : f ≫ g = 0} :
explicitCokernelDesc cond ≫ h =
explicitCokernelDesc
@@ -234,16 +234,16 @@ theorem explicitCokernelDesc_comp_eq_desc {X Y Z W : SemiNormedGroup.{u}} {f : X
by
refine' explicit_cokernel_desc_unique _ _ _
rw [← CategoryTheory.Category.assoc, explicit_cokernel_π_desc]
-#align SemiNormedGroup.explicit_cokernel_desc_comp_eq_desc SemiNormedGroup.explicitCokernelDesc_comp_eq_desc
+#align SemiNormedGroup.explicit_cokernel_desc_comp_eq_desc SemiNormedGroupCat.explicitCokernelDesc_comp_eq_desc
@[simp]
-theorem explicitCokernelDesc_zero {X Y Z : SemiNormedGroup.{u}} {f : X ⟶ Y} :
+theorem explicitCokernelDesc_zero {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y} :
explicitCokernelDesc (show f ≫ (0 : Y ⟶ Z) = 0 from CategoryTheory.Limits.comp_zero) = 0 :=
Eq.symm <| explicitCokernelDesc_unique _ _ CategoryTheory.Limits.comp_zero
-#align SemiNormedGroup.explicit_cokernel_desc_zero SemiNormedGroup.explicitCokernelDesc_zero
+#align SemiNormedGroup.explicit_cokernel_desc_zero SemiNormedGroupCat.explicitCokernelDesc_zero
@[ext]
-theorem explicitCokernel_hom_ext {X Y Z : SemiNormedGroup.{u}} {f : X ⟶ Y}
+theorem explicitCokernel_hom_ext {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y}
(e₁ e₂ : explicitCokernel f ⟶ Z) (h : explicitCokernelπ f ≫ e₁ = explicitCokernelπ f ≫ e₂) :
e₁ = e₂ := by
let g : Y ⟶ Z := explicit_cokernel_π f ≫ e₂
@@ -252,9 +252,9 @@ theorem explicitCokernel_hom_ext {X Y Z : SemiNormedGroup.{u}} {f : X ⟶ Y}
rw [this]
apply explicit_cokernel_desc_unique
exact h
-#align SemiNormedGroup.explicit_cokernel_hom_ext SemiNormedGroup.explicitCokernel_hom_ext
+#align SemiNormedGroup.explicit_cokernel_hom_ext SemiNormedGroupCat.explicitCokernel_hom_ext
-instance explicitCokernelπ.epi {X Y : SemiNormedGroup.{u}} {f : X ⟶ Y} :
+instance explicitCokernelπ.epi {X Y : SemiNormedGroupCat.{u}} {f : X ⟶ Y} :
Epi (explicitCokernelπ f) := by
constructor
intro Z g h H
@@ -262,26 +262,26 @@ instance explicitCokernelπ.epi {X Y : SemiNormedGroup.{u}} {f : X ⟶ Y} :
obtain ⟨x, hx⟩ := explicit_cokernel_π_surjective (explicit_cokernel_π f x)
change (explicit_cokernel_π f ≫ g) _ = _
rw [H]
-#align SemiNormedGroup.explicit_cokernel_π.epi SemiNormedGroup.explicitCokernelπ.epi
+#align SemiNormedGroup.explicit_cokernel_π.epi SemiNormedGroupCat.explicitCokernelπ.epi
-theorem isQuotient_explicitCokernelπ {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) :
+theorem isQuotient_explicitCokernelπ {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
NormedAddGroupHom.IsQuotient (explicitCokernelπ f) :=
NormedAddGroupHom.isQuotientQuotient _
-#align SemiNormedGroup.is_quotient_explicit_cokernel_π SemiNormedGroup.isQuotient_explicitCokernelπ
+#align SemiNormedGroup.is_quotient_explicit_cokernel_π SemiNormedGroupCat.isQuotient_explicitCokernelπ
-theorem normNoninc_explicitCokernelπ {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) :
+theorem normNoninc_explicitCokernelπ {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
(explicitCokernelπ f).NormNoninc :=
(isQuotient_explicitCokernelπ f).norm_le
-#align SemiNormedGroup.norm_noninc_explicit_cokernel_π SemiNormedGroup.normNoninc_explicitCokernelπ
+#align SemiNormedGroup.norm_noninc_explicit_cokernel_π SemiNormedGroupCat.normNoninc_explicitCokernelπ
open scoped NNReal
-theorem explicitCokernelDesc_norm_le_of_norm_le {X Y Z : SemiNormedGroup.{u}} {f : X ⟶ Y}
+theorem explicitCokernelDesc_norm_le_of_norm_le {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y}
{g : Y ⟶ Z} (w : f ≫ g = 0) (c : ℝ≥0) (h : ‖g‖ ≤ c) : ‖explicitCokernelDesc w‖ ≤ c :=
NormedAddGroupHom.lift_norm_le _ _ _ h
-#align SemiNormedGroup.explicit_cokernel_desc_norm_le_of_norm_le SemiNormedGroup.explicitCokernelDesc_norm_le_of_norm_le
+#align SemiNormedGroup.explicit_cokernel_desc_norm_le_of_norm_le SemiNormedGroupCat.explicitCokernelDesc_norm_le_of_norm_le
-theorem explicitCokernelDesc_normNoninc {X Y Z : SemiNormedGroup.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
+theorem explicitCokernelDesc_normNoninc {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
{cond : f ≫ g = 0} (hg : g.NormNoninc) : (explicitCokernelDesc cond).NormNoninc :=
by
refine' NormedAddGroupHom.NormNoninc.normNoninc_iff_norm_le_one.2 _
@@ -289,66 +289,67 @@ theorem explicitCokernelDesc_normNoninc {X Y Z : SemiNormedGroup.{u}} {f : X ⟶
exact
explicit_cokernel_desc_norm_le_of_norm_le cond 1
(NormedAddGroupHom.NormNoninc.normNoninc_iff_norm_le_one.1 hg)
-#align SemiNormedGroup.explicit_cokernel_desc_norm_noninc SemiNormedGroup.explicitCokernelDesc_normNoninc
+#align SemiNormedGroup.explicit_cokernel_desc_norm_noninc SemiNormedGroupCat.explicitCokernelDesc_normNoninc
-theorem explicitCokernelDesc_comp_eq_zero {X Y Z W : SemiNormedGroup.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
+theorem explicitCokernelDesc_comp_eq_zero {X Y Z W : SemiNormedGroupCat.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
{h : Z ⟶ W} (cond : f ≫ g = 0) (cond2 : g ≫ h = 0) : explicitCokernelDesc cond ≫ h = 0 :=
by
rw [← cancel_epi (explicit_cokernel_π f), ← category.assoc, explicit_cokernel_π_desc]
simp [cond2]
-#align SemiNormedGroup.explicit_cokernel_desc_comp_eq_zero SemiNormedGroup.explicitCokernelDesc_comp_eq_zero
+#align SemiNormedGroup.explicit_cokernel_desc_comp_eq_zero SemiNormedGroupCat.explicitCokernelDesc_comp_eq_zero
-theorem explicitCokernelDesc_norm_le {X Y Z : SemiNormedGroup.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
+theorem explicitCokernelDesc_norm_le {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
(w : f ≫ g = 0) : ‖explicitCokernelDesc w‖ ≤ ‖g‖ :=
explicitCokernelDesc_norm_le_of_norm_le w ‖g‖₊ le_rfl
-#align SemiNormedGroup.explicit_cokernel_desc_norm_le SemiNormedGroup.explicitCokernelDesc_norm_le
+#align SemiNormedGroup.explicit_cokernel_desc_norm_le SemiNormedGroupCat.explicitCokernelDesc_norm_le
/-- The explicit cokernel is isomorphic to the usual cokernel. -/
-def explicitCokernelIso {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) : explicitCokernel f ≅ cokernel f :=
+def explicitCokernelIso {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
+ explicitCokernel f ≅ cokernel f :=
(isColimitCokernelCocone f).coconePointUniqueUpToIso (colimit.isColimit _)
-#align SemiNormedGroup.explicit_cokernel_iso SemiNormedGroup.explicitCokernelIso
+#align SemiNormedGroup.explicit_cokernel_iso SemiNormedGroupCat.explicitCokernelIso
@[simp]
-theorem explicitCokernelIso_hom_π {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) :
+theorem explicitCokernelIso_hom_π {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
explicitCokernelπ f ≫ (explicitCokernelIso f).hom = cokernel.π _ := by
simp [explicit_cokernel_π, explicit_cokernel_iso, is_colimit.cocone_point_unique_up_to_iso]
-#align SemiNormedGroup.explicit_cokernel_iso_hom_π SemiNormedGroup.explicitCokernelIso_hom_π
+#align SemiNormedGroup.explicit_cokernel_iso_hom_π SemiNormedGroupCat.explicitCokernelIso_hom_π
@[simp]
-theorem explicitCokernelIso_inv_π {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) :
+theorem explicitCokernelIso_inv_π {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
cokernel.π f ≫ (explicitCokernelIso f).inv = explicitCokernelπ f := by
simp [explicit_cokernel_π, explicit_cokernel_iso]
-#align SemiNormedGroup.explicit_cokernel_iso_inv_π SemiNormedGroup.explicitCokernelIso_inv_π
+#align SemiNormedGroup.explicit_cokernel_iso_inv_π SemiNormedGroupCat.explicitCokernelIso_inv_π
@[simp]
-theorem explicitCokernelIso_hom_desc {X Y Z : SemiNormedGroup.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
+theorem explicitCokernelIso_hom_desc {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
(w : f ≫ g = 0) : (explicitCokernelIso f).hom ≫ cokernel.desc f g w = explicitCokernelDesc w :=
by
ext1
simp [explicit_cokernel_desc, explicit_cokernel_π, explicit_cokernel_iso,
is_colimit.cocone_point_unique_up_to_iso]
-#align SemiNormedGroup.explicit_cokernel_iso_hom_desc SemiNormedGroup.explicitCokernelIso_hom_desc
+#align SemiNormedGroup.explicit_cokernel_iso_hom_desc SemiNormedGroupCat.explicitCokernelIso_hom_desc
/-- A special case of `category_theory.limits.cokernel.map` adapted to `explicit_cokernel`. -/
-noncomputable def explicitCokernel.map {A B C D : SemiNormedGroup.{u}} {fab : A ⟶ B} {fbd : B ⟶ D}
- {fac : A ⟶ C} {fcd : C ⟶ D} (h : fab ≫ fbd = fac ≫ fcd) :
+noncomputable def explicitCokernel.map {A B C D : SemiNormedGroupCat.{u}} {fab : A ⟶ B}
+ {fbd : B ⟶ D} {fac : A ⟶ C} {fcd : C ⟶ D} (h : fab ≫ fbd = fac ≫ fcd) :
explicitCokernel fab ⟶ explicitCokernel fcd :=
@explicitCokernelDesc _ _ _ fab (fbd ≫ explicitCokernelπ _) <| by simp [reassoc_of h]
-#align SemiNormedGroup.explicit_cokernel.map SemiNormedGroup.explicitCokernel.map
+#align SemiNormedGroup.explicit_cokernel.map SemiNormedGroupCat.explicitCokernel.map
/-- A special case of `category_theory.limits.cokernel.map_desc` adapted to `explicit_cokernel`. -/
-theorem ExplicitCoker.map_desc {A B C D B' D' : SemiNormedGroup.{u}} {fab : A ⟶ B} {fbd : B ⟶ D}
+theorem ExplicitCoker.map_desc {A B C D B' D' : SemiNormedGroupCat.{u}} {fab : A ⟶ B} {fbd : B ⟶ D}
{fac : A ⟶ C} {fcd : C ⟶ D} {h : fab ≫ fbd = fac ≫ fcd} {fbb' : B ⟶ B'} {fdd' : D ⟶ D'}
{condb : fab ≫ fbb' = 0} {condd : fcd ≫ fdd' = 0} {g : B' ⟶ D'} (h' : fbb' ≫ g = fbd ≫ fdd') :
explicitCokernelDesc condb ≫ g = explicitCokernel.map h ≫ explicitCokernelDesc condd :=
by
delta explicit_cokernel.map
simp [← cancel_epi (explicit_cokernel_π fab), category.assoc, explicit_cokernel_π_desc, h']
-#align SemiNormedGroup.explicit_coker.map_desc SemiNormedGroup.ExplicitCoker.map_desc
+#align SemiNormedGroup.explicit_coker.map_desc SemiNormedGroupCat.ExplicitCoker.map_desc
end ExplicitCokernel
end Cokernel
-end SemiNormedGroup
+end SemiNormedGroupCat
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -193,7 +193,7 @@ theorem explicitCokernelπ_surjective {X Y : SemiNormedGroup.{u}} {f : X ⟶ Y}
theorem comp_explicitCokernelπ {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) :
f ≫ explicitCokernelπ f = 0 :=
by
- convert(cokernel_cocone f).w walking_parallel_pair_hom.left
+ convert (cokernel_cocone f).w walking_parallel_pair_hom.left
simp
#align SemiNormedGroup.comp_explicit_cokernel_π SemiNormedGroup.comp_explicitCokernelπ
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -274,7 +274,7 @@ theorem normNoninc_explicitCokernelπ {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y)
(isQuotient_explicitCokernelπ f).norm_le
#align SemiNormedGroup.norm_noninc_explicit_cokernel_π SemiNormedGroup.normNoninc_explicitCokernelπ
-open NNReal
+open scoped NNReal
theorem explicitCokernelDesc_norm_le_of_norm_le {X Y Z : SemiNormedGroup.{u}} {f : X ⟶ Y}
{g : Y ⟶ Z} (w : f ≫ g = 0) (c : ℝ≥0) (h : ‖g‖ ≤ c) : ‖explicitCokernelDesc w‖ ≤ c :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -109,16 +109,10 @@ instance hasLimit_parallelPair {V W : SemiNormedGroup.{u}} (f g : V ⟶ W) :
Fork.IsLimit.mk _
(fun c =>
NormedAddGroupHom.ker.lift (Fork.ι c) _ <|
- show NormedAddGroupHom.compHom (f - g) c.ι = 0
- by
- rw [AddMonoidHom.map_sub, AddMonoidHom.sub_apply, sub_eq_zero]
- exact c.condition)
- (fun c => NormedAddGroupHom.ker.incl_comp_lift _ _ _) fun c g h =>
- by
- ext x
- dsimp
- rw [← h]
- rfl }
+ show NormedAddGroupHom.compHom (f - g) c.ι = 0 by
+ rw [AddMonoidHom.map_sub, AddMonoidHom.sub_apply, sub_eq_zero]; exact c.condition)
+ (fun c => NormedAddGroupHom.ker.incl_comp_lift _ _ _) fun c g h => by ext x; dsimp;
+ rw [← h]; rfl }
#align SemiNormedGroup.has_limit_parallel_pair SemiNormedGroup.hasLimit_parallelPair
instance : Limits.HasEqualizers.{u, u + 1} SemiNormedGroup :=
@@ -206,10 +200,7 @@ theorem comp_explicitCokernelπ {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) :
@[simp]
theorem explicitCokernelπ_apply_dom_eq_zero {X Y : SemiNormedGroup.{u}} {f : X ⟶ Y} (x : X) :
(explicitCokernelπ f) (f x) = 0 :=
- show (f ≫ explicitCokernelπ f) x = 0
- by
- rw [comp_explicit_cokernel_π]
- rfl
+ show (f ≫ explicitCokernelπ f) x = 0 by rw [comp_explicit_cokernel_π]; rfl
#align SemiNormedGroup.explicit_cokernel_π_apply_dom_eq_zero SemiNormedGroup.explicitCokernelπ_apply_dom_eq_zero
@[simp, reassoc]
@@ -257,10 +248,7 @@ theorem explicitCokernel_hom_ext {X Y Z : SemiNormedGroup.{u}} {f : X ⟶ Y}
e₁ = e₂ := by
let g : Y ⟶ Z := explicit_cokernel_π f ≫ e₂
have w : f ≫ g = 0 := by simp
- have : e₂ = explicit_cokernel_desc w :=
- by
- apply explicit_cokernel_desc_unique
- rfl
+ have : e₂ = explicit_cokernel_desc w := by apply explicit_cokernel_desc_unique; rfl
rw [this]
apply explicit_cokernel_desc_unique
exact h
mathlib commit https://github.com/leanprover-community/mathlib/commit/75e7fca56381d056096ce5d05e938f63a6567828
@@ -195,7 +195,7 @@ theorem explicitCokernelπ_surjective {X Y : SemiNormedGroup.{u}} {f : X ⟶ Y}
surjective_quot_mk _
#align SemiNormedGroup.explicit_cokernel_π_surjective SemiNormedGroup.explicitCokernelπ_surjective
-@[simp, reassoc.1]
+@[simp, reassoc]
theorem comp_explicitCokernelπ {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) :
f ≫ explicitCokernelπ f = 0 :=
by
@@ -212,7 +212,7 @@ theorem explicitCokernelπ_apply_dom_eq_zero {X Y : SemiNormedGroup.{u}} {f : X
rfl
#align SemiNormedGroup.explicit_cokernel_π_apply_dom_eq_zero SemiNormedGroup.explicitCokernelπ_apply_dom_eq_zero
-@[simp, reassoc.1]
+@[simp, reassoc]
theorem explicitCokernelπ_desc {X Y Z : SemiNormedGroup.{u}} {f : X ⟶ Y} {g : Y ⟶ Z}
(w : f ≫ g = 0) : explicitCokernelπ f ≫ explicitCokernelDesc w = g :=
(isColimitCokernelCocone f).fac _ _
mathlib commit https://github.com/leanprover-community/mathlib/commit/08e1d8d4d989df3a6df86f385e9053ec8a372cc1
@@ -276,14 +276,14 @@ instance explicitCokernelπ.epi {X Y : SemiNormedGroup.{u}} {f : X ⟶ Y} :
rw [H]
#align SemiNormedGroup.explicit_cokernel_π.epi SemiNormedGroup.explicitCokernelπ.epi
-theorem isQuotientExplicitCokernelπ {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) :
+theorem isQuotient_explicitCokernelπ {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) :
NormedAddGroupHom.IsQuotient (explicitCokernelπ f) :=
NormedAddGroupHom.isQuotientQuotient _
-#align SemiNormedGroup.is_quotient_explicit_cokernel_π SemiNormedGroup.isQuotientExplicitCokernelπ
+#align SemiNormedGroup.is_quotient_explicit_cokernel_π SemiNormedGroup.isQuotient_explicitCokernelπ
theorem normNoninc_explicitCokernelπ {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) :
(explicitCokernelπ f).NormNoninc :=
- (isQuotientExplicitCokernelπ f).norm_le
+ (isQuotient_explicitCokernelπ f).norm_le
#align SemiNormedGroup.norm_noninc_explicit_cokernel_π SemiNormedGroup.normNoninc_explicitCokernelπ
open NNReal
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce7e9d53d4bbc38065db3b595cd5bd73c323bc1d
@@ -199,7 +199,7 @@ theorem explicitCokernelπ_surjective {X Y : SemiNormedGroup.{u}} {f : X ⟶ Y}
theorem comp_explicitCokernelπ {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) :
f ≫ explicitCokernelπ f = 0 :=
by
- convert (cokernel_cocone f).w walking_parallel_pair_hom.left
+ convert(cokernel_cocone f).w walking_parallel_pair_hom.left
simp
#align SemiNormedGroup.comp_explicit_cokernel_π SemiNormedGroup.comp_explicitCokernelπ
mathlib commit https://github.com/leanprover-community/mathlib/commit/9da1b3534b65d9661eb8f42443598a92bbb49211
@@ -53,7 +53,7 @@ def cokernelCocone {X Y : SemiNormedGroup₁.{u}} (f : X ⟶ Y) : Cofork f 0 :=
/-- Auxiliary definition for `has_cokernels SemiNormedGroup₁`. -/
def cokernelLift {X Y : SemiNormedGroup₁.{u}} (f : X ⟶ Y) (s : CokernelCofork f) :
- (cokernelCocone f).x ⟶ s.x := by
+ (cokernelCocone f).pt ⟶ s.pt := by
fconstructor
-- The lift itself:
· apply NormedAddGroupHom.lift _ s.π.1
@@ -142,7 +142,7 @@ def cokernelCocone {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) : Cofork f 0 :=
/-- Auxiliary definition for `has_cokernels SemiNormedGroup`. -/
def cokernelLift {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) (s : CokernelCofork f) :
- (cokernelCocone f).x ⟶ s.x :=
+ (cokernelCocone f).pt ⟶ s.pt :=
NormedAddGroupHom.lift _ s.π
(by
rintro _ ⟨b, rfl⟩
@@ -176,7 +176,7 @@ section ExplicitCokernel
/-- An explicit choice of cokernel, which has good properties with respect to the norm. -/
def explicitCokernel {X Y : SemiNormedGroup.{u}} (f : X ⟶ Y) : SemiNormedGroup.{u} :=
- (cokernelCocone f).x
+ (cokernelCocone f).pt
#align SemiNormedGroup.explicit_cokernel SemiNormedGroup.explicitCokernel
/-- Descend to the explicit cokernel. -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/eb0cb4511aaef0da2462207b67358a0e1fe1e2ee
@@ -100,7 +100,7 @@ def fork {V W : SemiNormedGroup.{u}} (f g : V ⟶ W) : Fork f g :=
sub_eq_zero] using this
#align SemiNormedGroup.fork SemiNormedGroup.fork
-instance hasLimitParallelPair {V W : SemiNormedGroup.{u}} (f g : V ⟶ W) :
+instance hasLimit_parallelPair {V W : SemiNormedGroup.{u}} (f g : V ⟶ W) :
HasLimit (parallelPair f g)
where exists_limit :=
Nonempty.intro
@@ -119,11 +119,11 @@ instance hasLimitParallelPair {V W : SemiNormedGroup.{u}} (f g : V ⟶ W) :
dsimp
rw [← h]
rfl }
-#align SemiNormedGroup.has_limit_parallel_pair SemiNormedGroup.hasLimitParallelPair
+#align SemiNormedGroup.has_limit_parallel_pair SemiNormedGroup.hasLimit_parallelPair
instance : Limits.HasEqualizers.{u, u + 1} SemiNormedGroup :=
@hasEqualizers_of_hasLimit_parallelPair SemiNormedGroup _ fun V W f g =>
- SemiNormedGroup.hasLimitParallelPair f g
+ SemiNormedGroup.hasLimit_parallelPair f g
end EqualizersAndKernels
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
Homogenises porting notes via capitalisation and addition of whitespace.
It makes the following changes:
@@ -99,7 +99,7 @@ namespace SemiNormedGroupCat
section EqualizersAndKernels
--- porting note: these weren't needed in Lean 3
+-- Porting note: these weren't needed in Lean 3
instance {V W : SemiNormedGroupCat.{u}} : Sub (V ⟶ W) :=
(inferInstance : Sub (NormedAddGroupHom V W))
noncomputable instance {V W : SemiNormedGroupCat.{u}} : Norm (V ⟶ W) :=
@@ -110,7 +110,7 @@ noncomputable instance {V W : SemiNormedGroupCat.{u}} : NNNorm (V ⟶ W) :=
def fork {V W : SemiNormedGroupCat.{u}} (f g : V ⟶ W) : Fork f g :=
@Fork.ofι _ _ _ _ _ _ (of (f - g : NormedAddGroupHom V W).ker)
(NormedAddGroupHom.incl (f - g).ker) <| by
- -- porting note: not needed in mathlib3
+ -- Porting note: not needed in mathlib3
change NormedAddGroupHom V W at f g
ext v
have : v.1 ∈ (f - g).ker := v.2
@@ -132,7 +132,7 @@ instance hasLimit_parallelPair {V W : SemiNormedGroupCat.{u}} (f g : V ⟶ W) :
show NormedAddGroupHom.compHom (f - g) c.ι = 0 by
rw [AddMonoidHom.map_sub, AddMonoidHom.sub_apply, sub_eq_zero]; exact c.condition)
(fun c => NormedAddGroupHom.ker.incl_comp_lift _ _ _) fun c g h => by
- -- porting note: the `simp_rw` was was `rw [← h]` but motive is not type correct in mathlib4
+ -- Porting note: the `simp_rw` was was `rw [← h]` but motive is not type correct in mathlib4
ext x; dsimp; simp_rw [← h]; rfl}
set_option linter.uppercaseLean3 false in
#align SemiNormedGroup.has_limit_parallel_pair SemiNormedGroupCat.hasLimit_parallelPair
@@ -154,13 +154,13 @@ def cokernelCocone {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) : Cofork f 0 :=
(by
ext a
simp only [comp_apply, Limits.zero_comp]
- -- porting note: `simp` not firing on the below
+ -- Porting note: `simp` not firing on the below
-- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
erw [comp_apply, NormedAddGroupHom.zero_apply]
- -- porting note: Lean 3 didn't need this instance
+ -- Porting note: Lean 3 didn't need this instance
letI : SeminormedAddCommGroup ((forget SemiNormedGroupCat).obj Y) :=
(inferInstance : SeminormedAddCommGroup Y)
- -- porting note: again simp doesn't seem to be firing in the below line
+ -- Porting note: again simp doesn't seem to be firing in the below line
-- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
erw [← NormedAddGroupHom.mem_ker, f.range.ker_normedMk, f.mem_range]
-- This used to be `simp only [exists_apply_eq_apply]` before leanprover/lean4#2644
@@ -246,7 +246,7 @@ theorem comp_explicitCokernelπ {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
set_option linter.uppercaseLean3 false in
#align SemiNormedGroup.comp_explicit_cokernel_π SemiNormedGroupCat.comp_explicitCokernelπ
--- porting note: wasn't necessary in Lean 3. Is this a bug?
+-- Porting note: wasn't necessary in Lean 3. Is this a bug?
attribute [simp] comp_explicitCokernelπ_assoc
@[simp]
@@ -305,7 +305,7 @@ theorem explicitCokernel_hom_ext {X Y Z : SemiNormedGroupCat.{u}} {f : X ⟶ Y}
(e₁ e₂ : explicitCokernel f ⟶ Z) (h : explicitCokernelπ f ≫ e₁ = explicitCokernelπ f ≫ e₂) :
e₁ = e₂ := by
let g : Y ⟶ Z := explicitCokernelπ f ≫ e₂
- have w : f ≫ g = 0 := by simp
+ have w : f ≫ g = 0 := by simp [g]
have : e₂ = explicitCokernelDesc w := by apply explicitCokernelDesc_unique; rfl
rw [this]
apply explicitCokernelDesc_unique
@@ -162,7 +162,7 @@ def cokernelCocone {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) : Cofork f 0 :=
(inferInstance : SeminormedAddCommGroup Y)
-- porting note: again simp doesn't seem to be firing in the below line
-- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
- erw [ ←NormedAddGroupHom.mem_ker, f.range.ker_normedMk, f.mem_range]
+ erw [← NormedAddGroupHom.mem_ker, f.range.ker_normedMk, f.mem_range]
-- This used to be `simp only [exists_apply_eq_apply]` before leanprover/lean4#2644
convert exists_apply_eq_apply f a)
set_option linter.uppercaseLean3 false in
@@ -45,7 +45,8 @@ def cokernelCocone {X Y : SemiNormedGroupCat₁.{u}} (f : X ⟶ Y) : Cofork f 0
-- simp only [comp_apply, Limits.zero_comp, NormedAddGroupHom.zero_apply,
-- SemiNormedGroupCat₁.mkHom_apply, SemiNormedGroupCat₁.zero_apply,
-- ← NormedAddGroupHom.mem_ker, f.1.range.ker_normedMk, f.1.mem_range]
- rw [Limits.zero_comp, comp_apply, SemiNormedGroupCat₁.mkHom_apply,
+ -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
+ erw [Limits.zero_comp, comp_apply, SemiNormedGroupCat₁.mkHom_apply,
SemiNormedGroupCat₁.zero_apply, ← NormedAddGroupHom.mem_ker, f.1.range.ker_normedMk,
f.1.mem_range]
use x
@@ -62,6 +63,8 @@ def cokernelLift {X Y : SemiNormedGroupCat₁.{u}} (f : X ⟶ Y) (s : CokernelCo
rintro _ ⟨b, rfl⟩
change (f ≫ s.π) b = 0
simp
+ -- This used to be the end of the proof before leanprover/lean4#2644
+ erw [zero_apply]
-- The lift has norm at most one:
exact NormedAddGroupHom.lift_normNoninc _ _ _ s.π.2
set_option linter.uppercaseLean3 false in
@@ -78,7 +81,9 @@ instance : HasCokernels SemiNormedGroupCat₁.{u} where
apply NormedAddGroupHom.lift_mk f.1.range
rintro _ ⟨b, rfl⟩
change (f ≫ s.π) b = 0
- simp)
+ simp
+ -- This used to be the end of the proof before leanprover/lean4#2644
+ erw [zero_apply])
fun s m w =>
Subtype.eq
(NormedAddGroupHom.lift_unique f.1.range _ _ _ (congr_arg Subtype.val w : _)) }
@@ -147,16 +152,19 @@ noncomputable
def cokernelCocone {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) : Cofork f 0 :=
@Cofork.ofπ _ _ _ _ _ _ (SemiNormedGroupCat.of (Y ⧸ NormedAddGroupHom.range f)) f.range.normedMk
(by
- ext
+ ext a
simp only [comp_apply, Limits.zero_comp]
-- porting note: `simp` not firing on the below
- rw [comp_apply, NormedAddGroupHom.zero_apply]
+ -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
+ erw [comp_apply, NormedAddGroupHom.zero_apply]
-- porting note: Lean 3 didn't need this instance
letI : SeminormedAddCommGroup ((forget SemiNormedGroupCat).obj Y) :=
(inferInstance : SeminormedAddCommGroup Y)
-- porting note: again simp doesn't seem to be firing in the below line
- rw [ ←NormedAddGroupHom.mem_ker, f.range.ker_normedMk, f.mem_range]
- simp only [exists_apply_eq_apply])
+ -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
+ erw [ ←NormedAddGroupHom.mem_ker, f.range.ker_normedMk, f.mem_range]
+ -- This used to be `simp only [exists_apply_eq_apply]` before leanprover/lean4#2644
+ convert exists_apply_eq_apply f a)
set_option linter.uppercaseLean3 false in
#align SemiNormedGroup.cokernel_cocone SemiNormedGroupCat.cokernelCocone
@@ -168,7 +176,9 @@ def cokernelLift {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) (s : CokernelCofor
(by
rintro _ ⟨b, rfl⟩
change (f ≫ s.π) b = 0
- simp)
+ simp
+ -- This used to be the end of the proof before leanprover/lean4#2644
+ erw [zero_apply])
set_option linter.uppercaseLean3 false in
#align SemiNormedGroup.cokernel_lift SemiNormedGroupCat.cokernelLift
@@ -182,7 +192,9 @@ def isColimitCokernelCocone {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
apply NormedAddGroupHom.lift_mk f.range
rintro _ ⟨b, rfl⟩
change (f ≫ s.π) b = 0
- simp)
+ simp
+ -- This used to be the end of the proof before leanprover/lean4#2644
+ erw [zero_apply])
fun s m w => NormedAddGroupHom.lift_unique f.range _ _ _ w
set_option linter.uppercaseLean3 false in
#align SemiNormedGroup.is_colimit_cokernel_cocone SemiNormedGroupCat.isColimitCokernelCocone
@@ -45,8 +45,7 @@ def cokernelCocone {X Y : SemiNormedGroupCat₁.{u}} (f : X ⟶ Y) : Cofork f 0
-- simp only [comp_apply, Limits.zero_comp, NormedAddGroupHom.zero_apply,
-- SemiNormedGroupCat₁.mkHom_apply, SemiNormedGroupCat₁.zero_apply,
-- ← NormedAddGroupHom.mem_ker, f.1.range.ker_normedMk, f.1.mem_range]
- -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
- erw [Limits.zero_comp, comp_apply, SemiNormedGroupCat₁.mkHom_apply,
+ rw [Limits.zero_comp, comp_apply, SemiNormedGroupCat₁.mkHom_apply,
SemiNormedGroupCat₁.zero_apply, ← NormedAddGroupHom.mem_ker, f.1.range.ker_normedMk,
f.1.mem_range]
use x
@@ -63,8 +62,6 @@ def cokernelLift {X Y : SemiNormedGroupCat₁.{u}} (f : X ⟶ Y) (s : CokernelCo
rintro _ ⟨b, rfl⟩
change (f ≫ s.π) b = 0
simp
- -- This used to be the end of the proof before leanprover/lean4#2644
- erw [zero_apply]
-- The lift has norm at most one:
exact NormedAddGroupHom.lift_normNoninc _ _ _ s.π.2
set_option linter.uppercaseLean3 false in
@@ -81,9 +78,7 @@ instance : HasCokernels SemiNormedGroupCat₁.{u} where
apply NormedAddGroupHom.lift_mk f.1.range
rintro _ ⟨b, rfl⟩
change (f ≫ s.π) b = 0
- simp
- -- This used to be the end of the proof before leanprover/lean4#2644
- erw [zero_apply])
+ simp)
fun s m w =>
Subtype.eq
(NormedAddGroupHom.lift_unique f.1.range _ _ _ (congr_arg Subtype.val w : _)) }
@@ -152,19 +147,16 @@ noncomputable
def cokernelCocone {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) : Cofork f 0 :=
@Cofork.ofπ _ _ _ _ _ _ (SemiNormedGroupCat.of (Y ⧸ NormedAddGroupHom.range f)) f.range.normedMk
(by
- ext a
+ ext
simp only [comp_apply, Limits.zero_comp]
-- porting note: `simp` not firing on the below
- -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
- erw [comp_apply, NormedAddGroupHom.zero_apply]
+ rw [comp_apply, NormedAddGroupHom.zero_apply]
-- porting note: Lean 3 didn't need this instance
letI : SeminormedAddCommGroup ((forget SemiNormedGroupCat).obj Y) :=
(inferInstance : SeminormedAddCommGroup Y)
-- porting note: again simp doesn't seem to be firing in the below line
- -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
- erw [ ←NormedAddGroupHom.mem_ker, f.range.ker_normedMk, f.mem_range]
- -- This used to be `simp only [exists_apply_eq_apply]` before leanprover/lean4#2644
- convert exists_apply_eq_apply f a)
+ rw [ ←NormedAddGroupHom.mem_ker, f.range.ker_normedMk, f.mem_range]
+ simp only [exists_apply_eq_apply])
set_option linter.uppercaseLean3 false in
#align SemiNormedGroup.cokernel_cocone SemiNormedGroupCat.cokernelCocone
@@ -176,9 +168,7 @@ def cokernelLift {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) (s : CokernelCofor
(by
rintro _ ⟨b, rfl⟩
change (f ≫ s.π) b = 0
- simp
- -- This used to be the end of the proof before leanprover/lean4#2644
- erw [zero_apply])
+ simp)
set_option linter.uppercaseLean3 false in
#align SemiNormedGroup.cokernel_lift SemiNormedGroupCat.cokernelLift
@@ -192,9 +182,7 @@ def isColimitCokernelCocone {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
apply NormedAddGroupHom.lift_mk f.range
rintro _ ⟨b, rfl⟩
change (f ≫ s.π) b = 0
- simp
- -- This used to be the end of the proof before leanprover/lean4#2644
- erw [zero_apply])
+ simp)
fun s m w => NormedAddGroupHom.lift_unique f.range _ _ _ w
set_option linter.uppercaseLean3 false in
#align SemiNormedGroup.is_colimit_cokernel_cocone SemiNormedGroupCat.isColimitCokernelCocone
@@ -45,7 +45,8 @@ def cokernelCocone {X Y : SemiNormedGroupCat₁.{u}} (f : X ⟶ Y) : Cofork f 0
-- simp only [comp_apply, Limits.zero_comp, NormedAddGroupHom.zero_apply,
-- SemiNormedGroupCat₁.mkHom_apply, SemiNormedGroupCat₁.zero_apply,
-- ← NormedAddGroupHom.mem_ker, f.1.range.ker_normedMk, f.1.mem_range]
- rw [Limits.zero_comp, comp_apply, SemiNormedGroupCat₁.mkHom_apply,
+ -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
+ erw [Limits.zero_comp, comp_apply, SemiNormedGroupCat₁.mkHom_apply,
SemiNormedGroupCat₁.zero_apply, ← NormedAddGroupHom.mem_ker, f.1.range.ker_normedMk,
f.1.mem_range]
use x
@@ -62,6 +63,8 @@ def cokernelLift {X Y : SemiNormedGroupCat₁.{u}} (f : X ⟶ Y) (s : CokernelCo
rintro _ ⟨b, rfl⟩
change (f ≫ s.π) b = 0
simp
+ -- This used to be the end of the proof before leanprover/lean4#2644
+ erw [zero_apply]
-- The lift has norm at most one:
exact NormedAddGroupHom.lift_normNoninc _ _ _ s.π.2
set_option linter.uppercaseLean3 false in
@@ -78,7 +81,9 @@ instance : HasCokernels SemiNormedGroupCat₁.{u} where
apply NormedAddGroupHom.lift_mk f.1.range
rintro _ ⟨b, rfl⟩
change (f ≫ s.π) b = 0
- simp)
+ simp
+ -- This used to be the end of the proof before leanprover/lean4#2644
+ erw [zero_apply])
fun s m w =>
Subtype.eq
(NormedAddGroupHom.lift_unique f.1.range _ _ _ (congr_arg Subtype.val w : _)) }
@@ -147,16 +152,19 @@ noncomputable
def cokernelCocone {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) : Cofork f 0 :=
@Cofork.ofπ _ _ _ _ _ _ (SemiNormedGroupCat.of (Y ⧸ NormedAddGroupHom.range f)) f.range.normedMk
(by
- ext
+ ext a
simp only [comp_apply, Limits.zero_comp]
-- porting note: `simp` not firing on the below
- rw [comp_apply, NormedAddGroupHom.zero_apply]
+ -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
+ erw [comp_apply, NormedAddGroupHom.zero_apply]
-- porting note: Lean 3 didn't need this instance
letI : SeminormedAddCommGroup ((forget SemiNormedGroupCat).obj Y) :=
(inferInstance : SeminormedAddCommGroup Y)
-- porting note: again simp doesn't seem to be firing in the below line
- rw [ ←NormedAddGroupHom.mem_ker, f.range.ker_normedMk, f.mem_range]
- simp only [exists_apply_eq_apply])
+ -- This used to be `rw`, but we need `erw` after leanprover/lean4#2644
+ erw [ ←NormedAddGroupHom.mem_ker, f.range.ker_normedMk, f.mem_range]
+ -- This used to be `simp only [exists_apply_eq_apply]` before leanprover/lean4#2644
+ convert exists_apply_eq_apply f a)
set_option linter.uppercaseLean3 false in
#align SemiNormedGroup.cokernel_cocone SemiNormedGroupCat.cokernelCocone
@@ -168,7 +176,9 @@ def cokernelLift {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) (s : CokernelCofor
(by
rintro _ ⟨b, rfl⟩
change (f ≫ s.π) b = 0
- simp)
+ simp
+ -- This used to be the end of the proof before leanprover/lean4#2644
+ erw [zero_apply])
set_option linter.uppercaseLean3 false in
#align SemiNormedGroup.cokernel_lift SemiNormedGroupCat.cokernelLift
@@ -182,7 +192,9 @@ def isColimitCokernelCocone {X Y : SemiNormedGroupCat.{u}} (f : X ⟶ Y) :
apply NormedAddGroupHom.lift_mk f.range
rintro _ ⟨b, rfl⟩
change (f ≫ s.π) b = 0
- simp)
+ simp
+ -- This used to be the end of the proof before leanprover/lean4#2644
+ erw [zero_apply])
fun s m w => NormedAddGroupHom.lift_unique f.range _ _ _ w
set_option linter.uppercaseLean3 false in
#align SemiNormedGroup.is_colimit_cokernel_cocone SemiNormedGroupCat.isColimitCokernelCocone
@@ -2,16 +2,13 @@
Copyright (c) 2021 Scott Morrison. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca, Johan Commelin, Scott Morrison
-
-! This file was ported from Lean 3 source module analysis.normed.group.SemiNormedGroup.kernels
-! leanprover-community/mathlib commit 17ef379e997badd73e5eabb4d38f11919ab3c4b3
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Analysis.Normed.Group.SemiNormedGroupCat
import Mathlib.Analysis.Normed.Group.Quotient
import Mathlib.CategoryTheory.Limits.Shapes.Kernels
+#align_import analysis.normed.group.SemiNormedGroup.kernels from "leanprover-community/mathlib"@"17ef379e997badd73e5eabb4d38f11919ab3c4b3"
+
/-!
# Kernels and cokernels in SemiNormedGroupCat₁ and SemiNormedGroupCat
The unported dependencies are
algebra.order.module
init.core
algebra.order.monoid.cancel.defs
algebra.abs
algebra.group_power.lemmas
init.data.list.basic
algebra.order.monoid.cancel.basic
init.data.list.default
topology.subset_properties
init.logic
The following 1 dependencies have changed in mathlib3 since they were ported, which may complicate porting this file