algebra.category.Module.productsMathlib.Algebra.Category.ModuleCat.Products

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)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(last sync)

Changes in mathlib3port

mathlib3
mathlib3port
Diff
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Scott Morrison
 -/
 import LinearAlgebra.Pi
-import Algebra.Category.Module.Basic
+import Algebra.Category.ModuleCat.Basic
 
 #align_import algebra.category.Module.products from "leanprover-community/mathlib"@"86d1873c01a723aba6788f0b9051ae3d23b4c1c3"
 
Diff
@@ -3,8 +3,8 @@ Copyright (c) 2022 Scott Morrison. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Scott Morrison
 -/
-import Mathbin.LinearAlgebra.Pi
-import Mathbin.Algebra.Category.Module.Basic
+import LinearAlgebra.Pi
+import Algebra.Category.Module.Basic
 
 #align_import algebra.category.Module.products from "leanprover-community/mathlib"@"86d1873c01a723aba6788f0b9051ae3d23b4c1c3"
 
Diff
@@ -2,15 +2,12 @@
 Copyright (c) 2022 Scott Morrison. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Scott Morrison
-
-! This file was ported from Lean 3 source module algebra.category.Module.products
-! leanprover-community/mathlib commit 86d1873c01a723aba6788f0b9051ae3d23b4c1c3
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathbin.LinearAlgebra.Pi
 import Mathbin.Algebra.Category.Module.Basic
 
+#align_import algebra.category.Module.products from "leanprover-community/mathlib"@"86d1873c01a723aba6788f0b9051ae3d23b4c1c3"
+
 /-!
 # The concrete products in the category of modules are products in the categorical sense.
 
Diff
@@ -44,7 +44,7 @@ def productConeIsLimit : IsLimit (productCone Z)
     where
   lift s := (LinearMap.pi fun j => s.π.app ⟨j⟩ : s.pt →ₗ[R] ∀ i : ι, Z i)
   fac s j := by cases j; tidy
-  uniq s m w := by ext (x i); exact LinearMap.congr_fun (w ⟨i⟩) x
+  uniq s m w := by ext x i; exact LinearMap.congr_fun (w ⟨i⟩) x
 #align Module.product_cone_is_limit ModuleCat.productConeIsLimit
 -/
 
Diff
@@ -31,11 +31,14 @@ variable {R : Type u} [Ring R]
 
 variable {ι : Type v} (Z : ι → ModuleCat.{max v w} R)
 
+#print ModuleCat.productCone /-
 /-- The product cone induced by the concrete product. -/
 def productCone : Fan Z :=
   Fan.mk (ModuleCat.of R (∀ i : ι, Z i)) fun i => (LinearMap.proj i : (∀ i : ι, Z i) →ₗ[R] Z i)
 #align Module.product_cone ModuleCat.productCone
+-/
 
+#print ModuleCat.productConeIsLimit /-
 /-- The concrete product cone is limiting. -/
 def productConeIsLimit : IsLimit (productCone Z)
     where
@@ -43,30 +46,37 @@ def productConeIsLimit : IsLimit (productCone Z)
   fac s j := by cases j; tidy
   uniq s m w := by ext (x i); exact LinearMap.congr_fun (w ⟨i⟩) x
 #align Module.product_cone_is_limit ModuleCat.productConeIsLimit
+-/
 
 -- While we could use this to construct a `has_products (Module R)` instance,
 -- we already have `has_limits (Module R)` in `algebra.category.Module.limits`.
 variable [HasProduct Z]
 
+#print ModuleCat.piIsoPi /-
 /-- The categorical product of a family of objects in `Module`
 agrees with the usual module-theoretical product.
 -/
 noncomputable def piIsoPi : ∏ Z ≅ ModuleCat.of R (∀ i, Z i) :=
   limit.isoLimitCone ⟨_, productConeIsLimit Z⟩
 #align Module.pi_iso_pi ModuleCat.piIsoPi
+-/
 
+#print ModuleCat.piIsoPi_inv_kernel_ι /-
 -- We now show this isomorphism commutes with the inclusion of the kernel into the source.
 @[simp, elementwise]
 theorem piIsoPi_inv_kernel_ι (i : ι) :
     (piIsoPi Z).inv ≫ Pi.π Z i = (LinearMap.proj i : (∀ i : ι, Z i) →ₗ[R] Z i) :=
   limit.isoLimitCone_inv_π _ _
 #align Module.pi_iso_pi_inv_kernel_ι ModuleCat.piIsoPi_inv_kernel_ι
+-/
 
+#print ModuleCat.piIsoPi_hom_ker_subtype /-
 @[simp, elementwise]
 theorem piIsoPi_hom_ker_subtype (i : ι) :
     (piIsoPi Z).hom ≫ (LinearMap.proj i : (∀ i : ι, Z i) →ₗ[R] Z i) = Pi.π Z i :=
   IsLimit.conePointUniqueUpToIso_inv_comp _ (limit.isLimit _) (Discrete.mk i)
 #align Module.pi_iso_pi_hom_ker_subtype ModuleCat.piIsoPi_hom_ker_subtype
+-/
 
 end ModuleCat
 
Diff
@@ -31,23 +31,11 @@ variable {R : Type u} [Ring R]
 
 variable {ι : Type v} (Z : ι → ModuleCat.{max v w} R)
 
-/- warning: Module.product_cone -> ModuleCat.productCone is a dubious translation:
-lean 3 declaration is
-  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{max v w, u} R _inst_1)), CategoryTheory.Limits.Fan.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z
-but is expected to have type
-  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{v, u} R _inst_1)), CategoryTheory.Limits.Fan.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z
-Case conversion may be inaccurate. Consider using '#align Module.product_cone ModuleCat.productConeₓ'. -/
 /-- The product cone induced by the concrete product. -/
 def productCone : Fan Z :=
   Fan.mk (ModuleCat.of R (∀ i : ι, Z i)) fun i => (LinearMap.proj i : (∀ i : ι, Z i) →ₗ[R] Z i)
 #align Module.product_cone ModuleCat.productCone
 
-/- warning: Module.product_cone_is_limit -> ModuleCat.productConeIsLimit is a dubious translation:
-lean 3 declaration is
-  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{max v w, u} R _inst_1)), CategoryTheory.Limits.IsLimit.{v, max v w, v, max u (succ (max v w))} (CategoryTheory.Discrete.{v} ι) (CategoryTheory.discreteCategory.{v} ι) (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) (CategoryTheory.Discrete.functor.{max v w, v, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) ι Z) (ModuleCat.productCone.{u, v, w} R _inst_1 ι Z)
-but is expected to have type
-  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{v, u} R _inst_1)), CategoryTheory.Limits.IsLimit.{v, v, v, max u (succ v)} (CategoryTheory.Discrete.{v} ι) (CategoryTheory.discreteCategory.{v} ι) (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) (CategoryTheory.Discrete.functor.{v, v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) ι Z) (ModuleCat.productCone.{u, v} R _inst_1 ι Z)
-Case conversion may be inaccurate. Consider using '#align Module.product_cone_is_limit ModuleCat.productConeIsLimitₓ'. -/
 /-- The concrete product cone is limiting. -/
 def productConeIsLimit : IsLimit (productCone Z)
     where
@@ -60,12 +48,6 @@ def productConeIsLimit : IsLimit (productCone Z)
 -- we already have `has_limits (Module R)` in `algebra.category.Module.limits`.
 variable [HasProduct Z]
 
-/- warning: Module.pi_iso_pi -> ModuleCat.piIsoPi is a dubious translation:
-lean 3 declaration is
-  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{max v w, u} R _inst_1)) [_inst_2 : CategoryTheory.Limits.HasProduct.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z], CategoryTheory.Iso.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) (CategoryTheory.Limits.piObj.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z _inst_2) (ModuleCat.of.{max v w, u} R _inst_1 (forall (i : ι), coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (Pi.addCommGroup.{v, max v w} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (Pi.module.{v, max v w, u} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{max v w} (coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{max v w, u} R _inst_1 (Z i))))
-but is expected to have type
-  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{v, u} R _inst_1)) [_inst_2 : CategoryTheory.Limits.HasProduct.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z], CategoryTheory.Iso.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) (CategoryTheory.Limits.piObj.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z _inst_2) (ModuleCat.of.{v, u} R _inst_1 (forall (i : ι), ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (Pi.addCommGroup.{v, v} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (Pi.module.{v, v, u} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{v} (ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{v, u} R _inst_1 (Z i))))
-Case conversion may be inaccurate. Consider using '#align Module.pi_iso_pi ModuleCat.piIsoPiₓ'. -/
 /-- The categorical product of a family of objects in `Module`
 agrees with the usual module-theoretical product.
 -/
@@ -73,12 +55,6 @@ noncomputable def piIsoPi : ∏ Z ≅ ModuleCat.of R (∀ i, Z i) :=
   limit.isoLimitCone ⟨_, productConeIsLimit Z⟩
 #align Module.pi_iso_pi ModuleCat.piIsoPi
 
-/- warning: Module.pi_iso_pi_inv_kernel_ι -> ModuleCat.piIsoPi_inv_kernel_ι is a dubious translation:
-lean 3 declaration is
-  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{max v w, u} R _inst_1)) [_inst_2 : CategoryTheory.Limits.HasProduct.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z] (i : ι), Eq.{succ (max v w)} (Quiver.Hom.{succ (max v w), max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (CategoryTheory.CategoryStruct.toQuiver.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (CategoryTheory.Category.toCategoryStruct.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1))) (ModuleCat.of.{max v w, u} R _inst_1 (forall (i : ι), coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (Pi.addCommGroup.{v, max v w} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (Pi.module.{v, max v w, u} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{max v w} (coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{max v w, u} R _inst_1 (Z i)))) (Z i)) (CategoryTheory.CategoryStruct.comp.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (CategoryTheory.Category.toCategoryStruct.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1)) (ModuleCat.of.{max v w, u} R _inst_1 (forall (i : ι), coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (Pi.addCommGroup.{v, max v w} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (Pi.module.{v, max v w, u} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{max v w} (coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{max v w, u} R _inst_1 (Z i)))) (CategoryTheory.Limits.piObj.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z _inst_2) (Z i) (CategoryTheory.Iso.inv.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) (CategoryTheory.Limits.piObj.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z _inst_2) (ModuleCat.of.{max v w, u} R _inst_1 (forall (i : ι), coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (Pi.addCommGroup.{v, max v w} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (Pi.module.{v, max v w, u} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{max v w} (coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{max v w, u} R _inst_1 (Z i)))) (ModuleCat.piIsoPi.{u, v, w} R _inst_1 ι Z _inst_2)) (CategoryTheory.Limits.Pi.π.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z _inst_2 i)) (LinearMap.proj.{u, v, max v w} R ι (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{max v w} (coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{max v w, u} R _inst_1 (Z i)) i)
-but is expected to have type
-  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{v, u} R _inst_1)) [_inst_2 : CategoryTheory.Limits.HasProduct.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z] (i : ι), Eq.{succ v} (Quiver.Hom.{succ v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (CategoryTheory.CategoryStruct.toQuiver.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (CategoryTheory.Category.toCategoryStruct.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1))) (ModuleCat.of.{v, u} R _inst_1 (forall (i : ι), ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (Pi.addCommGroup.{v, v} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (Pi.module.{v, v, u} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{v} (ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{v, u} R _inst_1 (Z i)))) (Z i)) (CategoryTheory.CategoryStruct.comp.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (CategoryTheory.Category.toCategoryStruct.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1)) (ModuleCat.of.{v, u} R _inst_1 (forall (i : ι), ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (Pi.addCommGroup.{v, v} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (Pi.module.{v, v, u} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{v} (ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{v, u} R _inst_1 (Z i)))) (CategoryTheory.Limits.piObj.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z _inst_2) (Z i) (CategoryTheory.Iso.inv.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) (CategoryTheory.Limits.piObj.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z _inst_2) (ModuleCat.of.{v, u} R _inst_1 (forall (i : ι), ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (Pi.addCommGroup.{v, v} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (Pi.module.{v, v, u} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{v} (ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{v, u} R _inst_1 (Z i)))) (ModuleCat.piIsoPi.{u, v} R _inst_1 ι Z _inst_2)) (CategoryTheory.Limits.Pi.π.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z _inst_2 i)) (LinearMap.proj.{u, v, v} R ι (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{v} (ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{v, u} R _inst_1 (Z i)) i)
-Case conversion may be inaccurate. Consider using '#align Module.pi_iso_pi_inv_kernel_ι ModuleCat.piIsoPi_inv_kernel_ιₓ'. -/
 -- We now show this isomorphism commutes with the inclusion of the kernel into the source.
 @[simp, elementwise]
 theorem piIsoPi_inv_kernel_ι (i : ι) :
@@ -86,12 +62,6 @@ theorem piIsoPi_inv_kernel_ι (i : ι) :
   limit.isoLimitCone_inv_π _ _
 #align Module.pi_iso_pi_inv_kernel_ι ModuleCat.piIsoPi_inv_kernel_ι
 
-/- warning: Module.pi_iso_pi_hom_ker_subtype -> ModuleCat.piIsoPi_hom_ker_subtype is a dubious translation:
-lean 3 declaration is
-  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{max v w, u} R _inst_1)) [_inst_2 : CategoryTheory.Limits.HasProduct.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z] (i : ι), Eq.{succ (max v w)} (Quiver.Hom.{succ (max v w), max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (CategoryTheory.CategoryStruct.toQuiver.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (CategoryTheory.Category.toCategoryStruct.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1))) (CategoryTheory.Limits.piObj.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z _inst_2) (Z i)) (CategoryTheory.CategoryStruct.comp.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (CategoryTheory.Category.toCategoryStruct.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1)) (CategoryTheory.Limits.piObj.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z _inst_2) (ModuleCat.of.{max v w, u} R _inst_1 (forall (i : ι), coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (Pi.addCommGroup.{v, max v w} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (Pi.module.{v, max v w, u} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{max v w} (coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{max v w, u} R _inst_1 (Z i)))) (Z i) (CategoryTheory.Iso.hom.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) (CategoryTheory.Limits.piObj.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z _inst_2) (ModuleCat.of.{max v w, u} R _inst_1 (forall (i : ι), coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (Pi.addCommGroup.{v, max v w} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (Pi.module.{v, max v w, u} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{max v w} (coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{max v w, u} R _inst_1 (Z i)))) (ModuleCat.piIsoPi.{u, v, w} R _inst_1 ι Z _inst_2)) (LinearMap.proj.{u, v, max v w} R ι (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{max v w} (coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{max v w, u} R _inst_1 (Z i)) i)) (CategoryTheory.Limits.Pi.π.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z _inst_2 i)
-but is expected to have type
-  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{v, u} R _inst_1)) [_inst_2 : CategoryTheory.Limits.HasProduct.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z] (i : ι), Eq.{succ v} (Quiver.Hom.{succ v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (CategoryTheory.CategoryStruct.toQuiver.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (CategoryTheory.Category.toCategoryStruct.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1))) (CategoryTheory.Limits.piObj.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z _inst_2) (Z i)) (CategoryTheory.CategoryStruct.comp.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (CategoryTheory.Category.toCategoryStruct.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1)) (CategoryTheory.Limits.piObj.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z _inst_2) (ModuleCat.of.{v, u} R _inst_1 (forall (i : ι), ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (Pi.addCommGroup.{v, v} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (Pi.module.{v, v, u} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{v} (ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{v, u} R _inst_1 (Z i)))) (Z i) (CategoryTheory.Iso.hom.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) (CategoryTheory.Limits.piObj.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z _inst_2) (ModuleCat.of.{v, u} R _inst_1 (forall (i : ι), ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (Pi.addCommGroup.{v, v} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (Pi.module.{v, v, u} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{v} (ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{v, u} R _inst_1 (Z i)))) (ModuleCat.piIsoPi.{u, v} R _inst_1 ι Z _inst_2)) (LinearMap.proj.{u, v, v} R ι (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{v} (ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{v, u} R _inst_1 (Z i)) i)) (CategoryTheory.Limits.Pi.π.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z _inst_2 i)
-Case conversion may be inaccurate. Consider using '#align Module.pi_iso_pi_hom_ker_subtype ModuleCat.piIsoPi_hom_ker_subtypeₓ'. -/
 @[simp, elementwise]
 theorem piIsoPi_hom_ker_subtype (i : ι) :
     (piIsoPi Z).hom ≫ (LinearMap.proj i : (∀ i : ι, Z i) →ₗ[R] Z i) = Pi.π Z i :=
Diff
@@ -52,12 +52,8 @@ Case conversion may be inaccurate. Consider using '#align Module.product_cone_is
 def productConeIsLimit : IsLimit (productCone Z)
     where
   lift s := (LinearMap.pi fun j => s.π.app ⟨j⟩ : s.pt →ₗ[R] ∀ i : ι, Z i)
-  fac s j := by
-    cases j
-    tidy
-  uniq s m w := by
-    ext (x i)
-    exact LinearMap.congr_fun (w ⟨i⟩) x
+  fac s j := by cases j; tidy
+  uniq s m w := by ext (x i); exact LinearMap.congr_fun (w ⟨i⟩) x
 #align Module.product_cone_is_limit ModuleCat.productConeIsLimit
 
 -- While we could use this to construct a `has_products (Module R)` instance,
Diff
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Scott Morrison
 
 ! This file was ported from Lean 3 source module algebra.category.Module.products
-! leanprover-community/mathlib commit 70fd9563a21e7b963887c9360bd29b2393e6225a
+! leanprover-community/mathlib commit 86d1873c01a723aba6788f0b9051ae3d23b4c1c3
 ! Please do not edit these lines, except to modify the commit id
 ! if you have ported upstream changes.
 -/
@@ -13,6 +13,9 @@ import Mathbin.Algebra.Category.Module.Basic
 
 /-!
 # The concrete products in the category of modules are products in the categorical sense.
+
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
 -/
 
 
Diff
@@ -28,11 +28,23 @@ variable {R : Type u} [Ring R]
 
 variable {ι : Type v} (Z : ι → ModuleCat.{max v w} R)
 
+/- warning: Module.product_cone -> ModuleCat.productCone is a dubious translation:
+lean 3 declaration is
+  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{max v w, u} R _inst_1)), CategoryTheory.Limits.Fan.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z
+but is expected to have type
+  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{v, u} R _inst_1)), CategoryTheory.Limits.Fan.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z
+Case conversion may be inaccurate. Consider using '#align Module.product_cone ModuleCat.productConeₓ'. -/
 /-- The product cone induced by the concrete product. -/
 def productCone : Fan Z :=
   Fan.mk (ModuleCat.of R (∀ i : ι, Z i)) fun i => (LinearMap.proj i : (∀ i : ι, Z i) →ₗ[R] Z i)
 #align Module.product_cone ModuleCat.productCone
 
+/- warning: Module.product_cone_is_limit -> ModuleCat.productConeIsLimit is a dubious translation:
+lean 3 declaration is
+  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{max v w, u} R _inst_1)), CategoryTheory.Limits.IsLimit.{v, max v w, v, max u (succ (max v w))} (CategoryTheory.Discrete.{v} ι) (CategoryTheory.discreteCategory.{v} ι) (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) (CategoryTheory.Discrete.functor.{max v w, v, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) ι Z) (ModuleCat.productCone.{u, v, w} R _inst_1 ι Z)
+but is expected to have type
+  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{v, u} R _inst_1)), CategoryTheory.Limits.IsLimit.{v, v, v, max u (succ v)} (CategoryTheory.Discrete.{v} ι) (CategoryTheory.discreteCategory.{v} ι) (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) (CategoryTheory.Discrete.functor.{v, v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) ι Z) (ModuleCat.productCone.{u, v} R _inst_1 ι Z)
+Case conversion may be inaccurate. Consider using '#align Module.product_cone_is_limit ModuleCat.productConeIsLimitₓ'. -/
 /-- The concrete product cone is limiting. -/
 def productConeIsLimit : IsLimit (productCone Z)
     where
@@ -49,6 +61,12 @@ def productConeIsLimit : IsLimit (productCone Z)
 -- we already have `has_limits (Module R)` in `algebra.category.Module.limits`.
 variable [HasProduct Z]
 
+/- warning: Module.pi_iso_pi -> ModuleCat.piIsoPi is a dubious translation:
+lean 3 declaration is
+  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{max v w, u} R _inst_1)) [_inst_2 : CategoryTheory.Limits.HasProduct.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z], CategoryTheory.Iso.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) (CategoryTheory.Limits.piObj.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z _inst_2) (ModuleCat.of.{max v w, u} R _inst_1 (forall (i : ι), coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (Pi.addCommGroup.{v, max v w} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (Pi.module.{v, max v w, u} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{max v w} (coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{max v w, u} R _inst_1 (Z i))))
+but is expected to have type
+  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{v, u} R _inst_1)) [_inst_2 : CategoryTheory.Limits.HasProduct.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z], CategoryTheory.Iso.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) (CategoryTheory.Limits.piObj.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z _inst_2) (ModuleCat.of.{v, u} R _inst_1 (forall (i : ι), ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (Pi.addCommGroup.{v, v} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (Pi.module.{v, v, u} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{v} (ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{v, u} R _inst_1 (Z i))))
+Case conversion may be inaccurate. Consider using '#align Module.pi_iso_pi ModuleCat.piIsoPiₓ'. -/
 /-- The categorical product of a family of objects in `Module`
 agrees with the usual module-theoretical product.
 -/
@@ -56,6 +74,12 @@ noncomputable def piIsoPi : ∏ Z ≅ ModuleCat.of R (∀ i, Z i) :=
   limit.isoLimitCone ⟨_, productConeIsLimit Z⟩
 #align Module.pi_iso_pi ModuleCat.piIsoPi
 
+/- warning: Module.pi_iso_pi_inv_kernel_ι -> ModuleCat.piIsoPi_inv_kernel_ι is a dubious translation:
+lean 3 declaration is
+  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{max v w, u} R _inst_1)) [_inst_2 : CategoryTheory.Limits.HasProduct.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z] (i : ι), Eq.{succ (max v w)} (Quiver.Hom.{succ (max v w), max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (CategoryTheory.CategoryStruct.toQuiver.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (CategoryTheory.Category.toCategoryStruct.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1))) (ModuleCat.of.{max v w, u} R _inst_1 (forall (i : ι), coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (Pi.addCommGroup.{v, max v w} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (Pi.module.{v, max v w, u} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{max v w} (coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{max v w, u} R _inst_1 (Z i)))) (Z i)) (CategoryTheory.CategoryStruct.comp.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (CategoryTheory.Category.toCategoryStruct.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1)) (ModuleCat.of.{max v w, u} R _inst_1 (forall (i : ι), coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (Pi.addCommGroup.{v, max v w} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (Pi.module.{v, max v w, u} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{max v w} (coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{max v w, u} R _inst_1 (Z i)))) (CategoryTheory.Limits.piObj.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z _inst_2) (Z i) (CategoryTheory.Iso.inv.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) (CategoryTheory.Limits.piObj.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z _inst_2) (ModuleCat.of.{max v w, u} R _inst_1 (forall (i : ι), coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (Pi.addCommGroup.{v, max v w} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (Pi.module.{v, max v w, u} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{max v w} (coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{max v w, u} R _inst_1 (Z i)))) (ModuleCat.piIsoPi.{u, v, w} R _inst_1 ι Z _inst_2)) (CategoryTheory.Limits.Pi.π.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z _inst_2 i)) (LinearMap.proj.{u, v, max v w} R ι (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{max v w} (coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{max v w, u} R _inst_1 (Z i)) i)
+but is expected to have type
+  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{v, u} R _inst_1)) [_inst_2 : CategoryTheory.Limits.HasProduct.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z] (i : ι), Eq.{succ v} (Quiver.Hom.{succ v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (CategoryTheory.CategoryStruct.toQuiver.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (CategoryTheory.Category.toCategoryStruct.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1))) (ModuleCat.of.{v, u} R _inst_1 (forall (i : ι), ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (Pi.addCommGroup.{v, v} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (Pi.module.{v, v, u} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{v} (ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{v, u} R _inst_1 (Z i)))) (Z i)) (CategoryTheory.CategoryStruct.comp.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (CategoryTheory.Category.toCategoryStruct.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1)) (ModuleCat.of.{v, u} R _inst_1 (forall (i : ι), ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (Pi.addCommGroup.{v, v} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (Pi.module.{v, v, u} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{v} (ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{v, u} R _inst_1 (Z i)))) (CategoryTheory.Limits.piObj.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z _inst_2) (Z i) (CategoryTheory.Iso.inv.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) (CategoryTheory.Limits.piObj.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z _inst_2) (ModuleCat.of.{v, u} R _inst_1 (forall (i : ι), ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (Pi.addCommGroup.{v, v} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (Pi.module.{v, v, u} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{v} (ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{v, u} R _inst_1 (Z i)))) (ModuleCat.piIsoPi.{u, v} R _inst_1 ι Z _inst_2)) (CategoryTheory.Limits.Pi.π.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z _inst_2 i)) (LinearMap.proj.{u, v, v} R ι (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{v} (ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{v, u} R _inst_1 (Z i)) i)
+Case conversion may be inaccurate. Consider using '#align Module.pi_iso_pi_inv_kernel_ι ModuleCat.piIsoPi_inv_kernel_ιₓ'. -/
 -- We now show this isomorphism commutes with the inclusion of the kernel into the source.
 @[simp, elementwise]
 theorem piIsoPi_inv_kernel_ι (i : ι) :
@@ -63,6 +87,12 @@ theorem piIsoPi_inv_kernel_ι (i : ι) :
   limit.isoLimitCone_inv_π _ _
 #align Module.pi_iso_pi_inv_kernel_ι ModuleCat.piIsoPi_inv_kernel_ι
 
+/- warning: Module.pi_iso_pi_hom_ker_subtype -> ModuleCat.piIsoPi_hom_ker_subtype is a dubious translation:
+lean 3 declaration is
+  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{max v w, u} R _inst_1)) [_inst_2 : CategoryTheory.Limits.HasProduct.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z] (i : ι), Eq.{succ (max v w)} (Quiver.Hom.{succ (max v w), max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (CategoryTheory.CategoryStruct.toQuiver.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (CategoryTheory.Category.toCategoryStruct.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1))) (CategoryTheory.Limits.piObj.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z _inst_2) (Z i)) (CategoryTheory.CategoryStruct.comp.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (CategoryTheory.Category.toCategoryStruct.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1)) (CategoryTheory.Limits.piObj.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z _inst_2) (ModuleCat.of.{max v w, u} R _inst_1 (forall (i : ι), coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (Pi.addCommGroup.{v, max v w} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (Pi.module.{v, max v w, u} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{max v w} (coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{max v w, u} R _inst_1 (Z i)))) (Z i) (CategoryTheory.Iso.hom.{max v w, max u (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) (CategoryTheory.Limits.piObj.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z _inst_2) (ModuleCat.of.{max v w, u} R _inst_1 (forall (i : ι), coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (Pi.addCommGroup.{v, max v w} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (Pi.module.{v, max v w, u} ι (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{max v w} (coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{max v w, u} R _inst_1 (Z i)))) (ModuleCat.piIsoPi.{u, v, w} R _inst_1 ι Z _inst_2)) (LinearMap.proj.{u, v, max v w} R ι (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{max v w} (coeSort.{max (succ u) (succ (succ (max v w))), succ (succ (max v w))} (ModuleCat.{max v w, u} R _inst_1) Type.{max v w} (ModuleCat.hasCoeToSort.{max v w, u} R _inst_1) (Z i)) (ModuleCat.isAddCommGroup.{max v w, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{max v w, u} R _inst_1 (Z i)) i)) (CategoryTheory.Limits.Pi.π.{v, max v w, max u (succ (max v w))} ι (ModuleCat.{max v w, u} R _inst_1) (ModuleCat.moduleCategory.{max v w, u} R _inst_1) Z _inst_2 i)
+but is expected to have type
+  forall {R : Type.{u}} [_inst_1 : Ring.{u} R] {ι : Type.{v}} (Z : ι -> (ModuleCat.{v, u} R _inst_1)) [_inst_2 : CategoryTheory.Limits.HasProduct.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z] (i : ι), Eq.{succ v} (Quiver.Hom.{succ v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (CategoryTheory.CategoryStruct.toQuiver.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (CategoryTheory.Category.toCategoryStruct.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1))) (CategoryTheory.Limits.piObj.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z _inst_2) (Z i)) (CategoryTheory.CategoryStruct.comp.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (CategoryTheory.Category.toCategoryStruct.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1)) (CategoryTheory.Limits.piObj.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z _inst_2) (ModuleCat.of.{v, u} R _inst_1 (forall (i : ι), ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (Pi.addCommGroup.{v, v} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (Pi.module.{v, v, u} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{v} (ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{v, u} R _inst_1 (Z i)))) (Z i) (CategoryTheory.Iso.hom.{v, max u (succ v)} (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) (CategoryTheory.Limits.piObj.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z _inst_2) (ModuleCat.of.{v, u} R _inst_1 (forall (i : ι), ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (Pi.addCommGroup.{v, v} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (fun (i : ι) => ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (Pi.module.{v, v, u} ι (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) R (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{v} (ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{v, u} R _inst_1 (Z i)))) (ModuleCat.piIsoPi.{u, v} R _inst_1 ι Z _inst_2)) (LinearMap.proj.{u, v, v} R ι (Ring.toSemiring.{u} R _inst_1) (fun (i : ι) => ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (fun (i : ι) => AddCommGroup.toAddCommMonoid.{v} (ModuleCat.carrier.{v, u} R _inst_1 (Z i)) (ModuleCat.isAddCommGroup.{v, u} R _inst_1 (Z i))) (fun (i : ι) => ModuleCat.isModule.{v, u} R _inst_1 (Z i)) i)) (CategoryTheory.Limits.Pi.π.{v, v, max u (succ v)} ι (ModuleCat.{v, u} R _inst_1) (ModuleCat.moduleCategory.{v, u} R _inst_1) Z _inst_2 i)
+Case conversion may be inaccurate. Consider using '#align Module.pi_iso_pi_hom_ker_subtype ModuleCat.piIsoPi_hom_ker_subtypeₓ'. -/
 @[simp, elementwise]
 theorem piIsoPi_hom_ker_subtype (i : ι) :
     (piIsoPi Z).hom ≫ (LinearMap.proj i : (∀ i : ι, Z i) →ₗ[R] Z i) = Pi.π Z i :=
Diff
@@ -36,7 +36,7 @@ def productCone : Fan Z :=
 /-- The concrete product cone is limiting. -/
 def productConeIsLimit : IsLimit (productCone Z)
     where
-  lift s := (LinearMap.pi fun j => s.π.app ⟨j⟩ : s.x →ₗ[R] ∀ i : ι, Z i)
+  lift s := (LinearMap.pi fun j => s.π.app ⟨j⟩ : s.pt →ₗ[R] ∀ i : ι, Z i)
   fac s j := by
     cases j
     tidy
Diff
@@ -37,10 +37,10 @@ def productCone : Fan Z :=
 def productConeIsLimit : IsLimit (productCone Z)
     where
   lift s := (LinearMap.pi fun j => s.π.app ⟨j⟩ : s.x →ₗ[R] ∀ i : ι, Z i)
-  fac' s j := by
+  fac s j := by
     cases j
     tidy
-  uniq' s m w := by
+  uniq s m w := by
     ext (x i)
     exact LinearMap.congr_fun (w ⟨i⟩) x
 #align Module.product_cone_is_limit ModuleCat.productConeIsLimit

Changes in mathlib4

mathlib3
mathlib4
chore(*): remove empty lines between variable statements (#11418)

Empty lines were removed by executing the following Python script twice

import os
import re


# Loop through each file in the repository
for dir_path, dirs, files in os.walk('.'):
  for filename in files:
    if filename.endswith('.lean'):
      file_path = os.path.join(dir_path, filename)

      # Open the file and read its contents
      with open(file_path, 'r') as file:
        content = file.read()

      # Use a regular expression to replace sequences of "variable" lines separated by empty lines
      # with sequences without empty lines
      modified_content = re.sub(r'(variable.*\n)\n(variable(?! .* in))', r'\1\2', content)

      # Write the modified content back to the file
      with open(file_path, 'w') as file:
        file.write(modified_content)
Diff
@@ -23,7 +23,6 @@ universe u v w
 namespace ModuleCat
 
 variable {R : Type u} [Ring R]
-
 variable {ι : Type v} (Z : ι → ModuleCatMax.{v, w} R)
 
 set_option linter.uppercaseLean3 false
chore: redistribute some of the results in LinearAlgebra.Basic (#7801)

This reduces the file from ~2600 lines to ~1600 lines.

Co-authored-by: Vierkantor <vierkantor@vierkantor.com> Co-authored-by: Floris van Doorn <fpvdoorn@gmail.com>

Diff
@@ -3,8 +3,9 @@ Copyright (c) 2022 Scott Morrison. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Scott Morrison
 -/
-import Mathlib.LinearAlgebra.Pi
 import Mathlib.Algebra.Category.ModuleCat.Basic
+import Mathlib.LinearAlgebra.Pi
+import Mathlib.Tactic.CategoryTheory.Elementwise
 
 #align_import algebra.category.Module.products from "leanprover-community/mathlib"@"70fd9563a21e7b963887c9360bd29b2393e6225a"
 
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,15 +2,12 @@
 Copyright (c) 2022 Scott Morrison. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Scott Morrison
-
-! This file was ported from Lean 3 source module algebra.category.Module.products
-! leanprover-community/mathlib commit 70fd9563a21e7b963887c9360bd29b2393e6225a
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathlib.LinearAlgebra.Pi
 import Mathlib.Algebra.Category.ModuleCat.Basic
 
+#align_import algebra.category.Module.products from "leanprover-community/mathlib"@"70fd9563a21e7b963887c9360bd29b2393e6225a"
+
 /-!
 # The concrete products in the category of modules are products in the categorical sense.
 -/
feat: port Algebra.Category.FGModuleCat.Limits (#5519)

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

Diff
@@ -26,7 +26,7 @@ namespace ModuleCat
 
 variable {R : Type u} [Ring R]
 
-variable {ι : Type v} (Z : ι → ModuleCat.{v} R)
+variable {ι : Type v} (Z : ι → ModuleCatMax.{v, w} R)
 
 set_option linter.uppercaseLean3 false
 
feat: port Algebra.Category.ModuleCat.Products (#3515)

Dependencies 8 + 446

447 files ported (98.2%)
177448 lines ported (98.3%)
Show graph

The unported dependencies are