analysis.normed.group.SemiNormedGroup.kernelsMathlib.Analysis.Normed.Group.SemiNormedGroupCat.Kernels

This file has been ported!

Changes since the initial port

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.

Changes in mathlib3

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(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)

Changes in mathlib3port

mathlib3
mathlib3port
Diff
@@ -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
 
Diff
@@ -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"
 
Diff
@@ -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
 
Diff
@@ -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
Diff
@@ -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
 
Diff
@@ -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
 
Diff
@@ -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π
 
Diff
@@ -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 :=
Diff
@@ -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
Diff
@@ -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 _ _
Diff
@@ -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
Diff
@@ -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π
 
Diff
@@ -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. -/
Diff
@@ -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
 

Changes in mathlib4

mathlib3
mathlib4
style: homogenise porting notes (#11145)

Homogenises porting notes via capitalisation and addition of whitespace.

It makes the following changes:

  • converts "--porting note" into "-- Porting note";
  • converts "porting note" into "Porting note".
Diff
@@ -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]
chore: prepare Lean version bump with explicit simp (#10999)

Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -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
chore: space after (#8178)

Co-authored-by: Moritz Firsching <firsching@google.com>

Diff
@@ -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
Revert "chore: revert #7703 (#7710)"

This reverts commit f3695eb2.

Diff
@@ -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
chore: revert #7703 (#7710)

This reverts commit 26eb2b0a.

Diff
@@ -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
chore: bump toolchain to v4.2.0-rc2 (#7703)

This includes all the changes from #7606.

Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -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
chore: script to replace headers with #align_import statements (#5979)

Open in Gitpod

Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -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
 
feat: port Analysis.Normed.Group.SemiNormedGroup.Kernels (#5085)

Co-authored-by: Kevin Buzzard <k.buzzard@imperial.ac.uk> Co-authored-by: Johan Commelin <johan@commelin.net>

Dependencies 10 + 692

693 files ported (98.6%)
294327 lines ported (98.2%)
Show graph

The unported dependencies are

The following 1 dependencies have changed in mathlib3 since they were ported, which may complicate porting this file