category_theory.is_connectedMathlib.CategoryTheory.IsConnected

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)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(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
@@ -336,8 +336,8 @@ theorem zigzag_obj_of_zigzag (F : J ⥤ K) {j₁ j₂ : J} (h : Zigzag j₁ j₂
 
 #print CategoryTheory.zag_of_zag_obj /-
 -- TODO: figure out the right way to generalise this to `zigzag`.
-theorem zag_of_zag_obj (F : J ⥤ K) [Full F] {j₁ j₂ : J} (h : Zag (F.obj j₁) (F.obj j₂)) :
-    Zag j₁ j₂ :=
+theorem zag_of_zag_obj (F : J ⥤ K) [CategoryTheory.Functor.Full F] {j₁ j₂ : J}
+    (h : Zag (F.obj j₁) (F.obj j₂)) : Zag j₁ j₂ :=
   Or.imp (Nonempty.map F.Preimage) (Nonempty.map F.Preimage) h
 #align category_theory.zag_of_zag_obj CategoryTheory.zag_of_zag_obj
 -/
@@ -432,7 +432,7 @@ theorem nat_trans_from_is_connected [IsPreconnected J] {X Y : C}
 #align category_theory.nat_trans_from_is_connected CategoryTheory.nat_trans_from_is_connected
 -/
 
-instance [IsConnected J] : Full (Functor.const J : C ⥤ J ⥤ C)
+instance [IsConnected J] : CategoryTheory.Functor.Full (Functor.const J : C ⥤ J ⥤ C)
     where
   Preimage X Y f := f.app (Classical.arbitrary J)
   witness' X Y f := by
Diff
@@ -4,9 +4,9 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Bhavik Mehta, Jakob von Raumer
 -/
 import Data.List.Chain
-import CategoryTheory.Punit
+import CategoryTheory.PUnit
 import CategoryTheory.Groupoid
-import CategoryTheory.Category.Ulift
+import CategoryTheory.Category.ULift
 
 #align_import category_theory.is_connected from "leanprover-community/mathlib"@"69c6a5a12d8a2b159f20933e60115a4f2de62b58"
 
Diff
@@ -183,7 +183,7 @@ theorem IsConnected.of_induct [Nonempty J] {j₀ : J}
   IsConnected.of_constant_of_preserves_morphisms fun α F a =>
     by
     have w := h {j | F j = F j₀} rfl fun _ _ f => by simp [a f]
-    dsimp at w 
+    dsimp at w
     intro j j'
     rw [w j, w j']
 #align category_theory.is_connected.of_induct CategoryTheory.IsConnected.of_induct
@@ -428,7 +428,7 @@ theorem nat_trans_from_is_connected [IsPreconnected J] {X Y : C}
     (α : (Functor.const J).obj X ⟶ (Functor.const J).obj Y) :
     ∀ j j' : J, α.app j = (α.app j' : X ⟶ Y) :=
   @constant_of_preserves_morphisms _ _ _ (X ⟶ Y) (fun j => α.app j) fun _ _ f => by
-    have := α.naturality f; erw [id_comp, comp_id] at this ; exact this.symm
+    have := α.naturality f; erw [id_comp, comp_id] at this; exact this.symm
 #align category_theory.nat_trans_from_is_connected CategoryTheory.nat_trans_from_is_connected
 -/
 
Diff
@@ -354,12 +354,12 @@ theorem equiv_relation [IsConnected J] (r : J → J → Prop) (hr : Equivalence
 #align category_theory.equiv_relation CategoryTheory.equiv_relation
 -/
 
-#print CategoryTheory.isConnected_zigzag /-
+#print CategoryTheory.isPreconnected_zigzag /-
 /-- In a connected category, any two objects are related by `zigzag`. -/
-theorem isConnected_zigzag [IsConnected J] (j₁ j₂ : J) : Zigzag j₁ j₂ :=
+theorem isPreconnected_zigzag [IsConnected J] (j₁ j₂ : J) : Zigzag j₁ j₂ :=
   equiv_relation _ zigzag_equivalence
     (fun _ _ f => Relation.ReflTransGen.single (Or.inl (Nonempty.intro f))) _ _
-#align category_theory.is_connected_zigzag CategoryTheory.isConnected_zigzag
+#align category_theory.is_connected_zigzag CategoryTheory.isPreconnected_zigzag
 -/
 
 #print CategoryTheory.zigzag_isConnected /-
@@ -385,7 +385,7 @@ theorem zigzag_isConnected [Nonempty J] (h : ∀ j₁ j₂ : J, Zigzag j₁ j₂
 #print CategoryTheory.exists_zigzag' /-
 theorem exists_zigzag' [IsConnected J] (j₁ j₂ : J) :
     ∃ l, List.Chain Zag j₁ l ∧ List.getLast (j₁ :: l) (List.cons_ne_nil _ _) = j₂ :=
-  List.exists_chain_of_relationReflTransGen (isConnected_zigzag _ _)
+  List.exists_chain_of_relationReflTransGen (isPreconnected_zigzag _ _)
 #align category_theory.exists_zigzag' CategoryTheory.exists_zigzag'
 -/
 
@@ -439,14 +439,14 @@ instance [IsConnected J] : Full (Functor.const J : C ⥤ J ⥤ C)
     ext j
     apply nat_trans_from_is_connected f (Classical.arbitrary J) j
 
-#print CategoryTheory.nonempty_hom_of_connected_groupoid /-
-instance nonempty_hom_of_connected_groupoid {G} [Groupoid G] [IsConnected G] :
+#print CategoryTheory.nonempty_hom_of_preconnected_groupoid /-
+instance nonempty_hom_of_preconnected_groupoid {G} [Groupoid G] [IsConnected G] :
     ∀ x y : G, Nonempty (x ⟶ y) :=
   by
   refine' equiv_relation _ _ fun j₁ j₂ => Nonempty.intro
   exact
     ⟨fun j => ⟨𝟙 _⟩, fun j₁ j₂ => Nonempty.map fun f => inv f, fun _ _ _ => Nonempty.map2 (· ≫ ·)⟩
-#align category_theory.nonempty_hom_of_connected_groupoid CategoryTheory.nonempty_hom_of_connected_groupoid
+#align category_theory.nonempty_hom_of_connected_groupoid CategoryTheory.nonempty_hom_of_preconnected_groupoid
 -/
 
 end CategoryTheory
Diff
@@ -3,10 +3,10 @@ Copyright (c) 2020 Bhavik Mehta. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Bhavik Mehta, Jakob von Raumer
 -/
-import Mathbin.Data.List.Chain
-import Mathbin.CategoryTheory.Punit
-import Mathbin.CategoryTheory.Groupoid
-import Mathbin.CategoryTheory.Category.Ulift
+import Data.List.Chain
+import CategoryTheory.Punit
+import CategoryTheory.Groupoid
+import CategoryTheory.Category.Ulift
 
 #align_import category_theory.is_connected from "leanprover-community/mathlib"@"69c6a5a12d8a2b159f20933e60115a4f2de62b58"
 
Diff
@@ -2,17 +2,14 @@
 Copyright (c) 2020 Bhavik Mehta. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Bhavik Mehta, Jakob von Raumer
-
-! This file was ported from Lean 3 source module category_theory.is_connected
-! leanprover-community/mathlib commit 69c6a5a12d8a2b159f20933e60115a4f2de62b58
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathbin.Data.List.Chain
 import Mathbin.CategoryTheory.Punit
 import Mathbin.CategoryTheory.Groupoid
 import Mathbin.CategoryTheory.Category.Ulift
 
+#align_import category_theory.is_connected from "leanprover-community/mathlib"@"69c6a5a12d8a2b159f20933e60115a4f2de62b58"
+
 /-!
 # Connected category
 
Diff
@@ -92,6 +92,7 @@ variable {J : Type u₁} [Category.{v₁} J]
 
 variable {K : Type u₂} [Category.{v₂} K]
 
+#print CategoryTheory.isoConstant /-
 /-- If `J` is connected, any functor `F : J ⥤ discrete α` is isomorphic to
 the constant functor with value `F.obj j` (for any choice of `j`).
 -/
@@ -99,14 +100,18 @@ def isoConstant [IsPreconnected J] {α : Type u₁} (F : J ⥤ Discrete α) (j :
     F ≅ (Functor.const J).obj (F.obj j) :=
   (IsPreconnected.iso_constant F j).some
 #align category_theory.iso_constant CategoryTheory.isoConstant
+-/
 
+#print CategoryTheory.any_functor_const_on_obj /-
 /-- If J is connected, any functor to a discrete category is constant on objects.
 The converse is given in `is_connected.of_any_functor_const_on_obj`.
 -/
 theorem any_functor_const_on_obj [IsPreconnected J] {α : Type u₁} (F : J ⥤ Discrete α) (j j' : J) :
     F.obj j = F.obj j' := by ext; exact ((iso_constant F j').Hom.app j).down.1
 #align category_theory.any_functor_const_on_obj CategoryTheory.any_functor_const_on_obj
+-/
 
+#print CategoryTheory.IsConnected.of_any_functor_const_on_obj /-
 /-- If any functor to a discrete category is constant on objects, J is connected.
 The converse of `any_functor_const_on_obj`.
 -/
@@ -116,6 +121,7 @@ theorem IsConnected.of_any_functor_const_on_obj [Nonempty J]
     iso_constant := fun α F j' =>
       ⟨NatIso.ofComponents (fun j => eqToIso (h F j j')) fun _ _ _ => Subsingleton.elim _ _⟩ }
 #align category_theory.is_connected.of_any_functor_const_on_obj CategoryTheory.IsConnected.of_any_functor_const_on_obj
+-/
 
 #print CategoryTheory.constant_of_preserves_morphisms /-
 /-- If `J` is connected, then given any function `F` such that the presence of a
@@ -198,6 +204,7 @@ instance [hc : IsConnected J] : IsConnected (ULiftHom.{v₂} (ULift.{u₂} J)) :
     induct_on_objects (fun j : J => p { down := j }) hj₀' fun _ _ f =>
       h ((ulift_hom_ulift_category.equiv J).Functor.map f)
 
+#print CategoryTheory.isPreconnected_induction /-
 /-- Another induction principle for `is_preconnected J`:
 given a type family `Z : J → Sort*` and
 a rule for transporting in *both* directions along a morphism in `J`,
@@ -210,7 +217,9 @@ theorem isPreconnected_induction [IsPreconnected J] (Z : J → Sort _)
       (fun j₁ j₂ f => ⟨by rintro ⟨y⟩; exact ⟨h₁ f y⟩, by rintro ⟨y⟩; exact ⟨h₂ f y⟩⟩) j :
     _)
 #align category_theory.is_preconnected_induction CategoryTheory.isPreconnected_induction
+-/
 
+#print CategoryTheory.isPreconnected_of_equivalent /-
 /-- If `J` and `K` are equivalent, then if `J` is preconnected then `K` is as well. -/
 theorem isPreconnected_of_equivalent {K : Type u₁} [Category.{v₂} K] [IsPreconnected J]
     (e : J ≌ K) : IsPreconnected K :=
@@ -225,13 +234,16 @@ theorem isPreconnected_of_equivalent {K : Type u₁} [Category.{v₂} K] [IsPrec
           _ ≅ (Functor.const K).obj (F.obj k) :=
             NatIso.ofComponents (fun X => Iso.refl _) (by simp)⟩ }
 #align category_theory.is_preconnected_of_equivalent CategoryTheory.isPreconnected_of_equivalent
+-/
 
+#print CategoryTheory.isConnected_of_equivalent /-
 /-- If `J` and `K` are equivalent, then if `J` is connected then `K` is as well. -/
 theorem isConnected_of_equivalent {K : Type u₁} [Category.{v₂} K] (e : J ≌ K) [IsConnected J] :
     IsConnected K :=
   { is_nonempty := Nonempty.map e.Functor.obj (by infer_instance)
     to_isPreconnected := isPreconnected_of_equivalent e }
 #align category_theory.is_connected_of_equivalent CategoryTheory.isConnected_of_equivalent
+-/
 
 #print CategoryTheory.isPreconnected_op /-
 /-- If `J` is preconnected, then `Jᵒᵖ` is preconnected as well. -/
@@ -315,6 +327,7 @@ def Zigzag.setoid (J : Type u₂) [Category.{v₁} J] : Setoid J
 #align category_theory.zigzag.setoid CategoryTheory.Zigzag.setoid
 -/
 
+#print CategoryTheory.zigzag_obj_of_zigzag /-
 /-- If there is a zigzag from `j₁` to `j₂`, then there is a zigzag from `F j₁` to
 `F j₂` as long as `F` is a functor.
 -/
@@ -322,12 +335,15 @@ theorem zigzag_obj_of_zigzag (F : J ⥤ K) {j₁ j₂ : J} (h : Zigzag j₁ j₂
     Zigzag (F.obj j₁) (F.obj j₂) :=
   h.lift _ fun j k => Or.imp (Nonempty.map fun f => F.map f) (Nonempty.map fun f => F.map f)
 #align category_theory.zigzag_obj_of_zigzag CategoryTheory.zigzag_obj_of_zigzag
+-/
 
+#print CategoryTheory.zag_of_zag_obj /-
 -- TODO: figure out the right way to generalise this to `zigzag`.
 theorem zag_of_zag_obj (F : J ⥤ K) [Full F] {j₁ j₂ : J} (h : Zag (F.obj j₁) (F.obj j₂)) :
     Zag j₁ j₂ :=
   Or.imp (Nonempty.map F.Preimage) (Nonempty.map F.Preimage) h
 #align category_theory.zag_of_zag_obj CategoryTheory.zag_of_zag_obj
+-/
 
 #print CategoryTheory.equiv_relation /-
 /-- Any equivalence relation containing (⟶) holds for all pairs of a connected category. -/
@@ -406,6 +422,7 @@ def discreteIsConnectedEquivPUnit {α : Type u₁} [IsConnected (Discrete α)] :
 
 variable {C : Type u₂} [Category.{u₁} C]
 
+#print CategoryTheory.nat_trans_from_is_connected /-
 /-- For objects `X Y : C`, any natural transformation `α : const X ⟶ const Y` from a connected
 category must be constant.
 This is the key property of connected categories which we use to establish properties about limits.
@@ -416,6 +433,7 @@ theorem nat_trans_from_is_connected [IsPreconnected J] {X Y : C}
   @constant_of_preserves_morphisms _ _ _ (X ⟶ Y) (fun j => α.app j) fun _ _ f => by
     have := α.naturality f; erw [id_comp, comp_id] at this ; exact this.symm
 #align category_theory.nat_trans_from_is_connected CategoryTheory.nat_trans_from_is_connected
+-/
 
 instance [IsConnected J] : Full (Functor.const J : C ⥤ J ⥤ C)
     where
Diff
@@ -393,15 +393,15 @@ theorem isConnected_of_zigzag [Nonempty J]
 #align category_theory.is_connected_of_zigzag CategoryTheory.isConnected_of_zigzag
 -/
 
-#print CategoryTheory.discreteIsConnectedEquivPunit /-
+#print CategoryTheory.discreteIsConnectedEquivPUnit /-
 /-- If `discrete α` is connected, then `α` is (type-)equivalent to `punit`. -/
-def discreteIsConnectedEquivPunit {α : Type u₁} [IsConnected (Discrete α)] : α ≃ PUnit :=
+def discreteIsConnectedEquivPUnit {α : Type u₁} [IsConnected (Discrete α)] : α ≃ PUnit :=
   Discrete.equivOfEquivalence.{u₁, u₁}
     { Functor := Functor.star (Discrete α)
       inverse := Discrete.functor fun _ => Classical.arbitrary _
       unitIso := iso_constant _ (Classical.arbitrary _)
-      counitIso := Functor.pUnitExt _ _ }
-#align category_theory.discrete_is_connected_equiv_punit CategoryTheory.discreteIsConnectedEquivPunit
+      counitIso := Functor.punitExt _ _ }
+#align category_theory.discrete_is_connected_equiv_punit CategoryTheory.discreteIsConnectedEquivPUnit
 -/
 
 variable {C : Type u₂} [Category.{u₁} C]
Diff
@@ -222,8 +222,8 @@ theorem isPreconnected_of_equivalent {K : Type u₁} [Category.{v₂} K] [IsPrec
             (isoWhiskerLeft e.inverse (isoConstant (e.Functor ⋙ F) (e.inverse.obj k)))
           _ ≅ e.inverse ⋙ (Functor.const J).obj (F.obj k) :=
             (isoWhiskerLeft _ ((F ⋙ Functor.const J).mapIso (e.counitIso.app k)))
-          _ ≅ (Functor.const K).obj (F.obj k) := NatIso.ofComponents (fun X => Iso.refl _) (by simp)
-          ⟩ }
+          _ ≅ (Functor.const K).obj (F.obj k) :=
+            NatIso.ofComponents (fun X => Iso.refl _) (by simp)⟩ }
 #align category_theory.is_preconnected_of_equivalent CategoryTheory.isPreconnected_of_equivalent
 
 /-- If `J` and `K` are equivalent, then if `J` is connected then `K` is as well. -/
Diff
@@ -179,7 +179,7 @@ theorem IsConnected.of_induct [Nonempty J] {j₀ : J}
     IsConnected J :=
   IsConnected.of_constant_of_preserves_morphisms fun α F a =>
     by
-    have w := h { j | F j = F j₀ } rfl fun _ _ f => by simp [a f]
+    have w := h {j | F j = F j₀} rfl fun _ _ f => by simp [a f]
     dsimp at w 
     intro j j'
     rw [w j, w j']
@@ -206,7 +206,7 @@ we can transport an `x : Z j₀` to a point in `Z j` for any `j`.
 theorem isPreconnected_induction [IsPreconnected J] (Z : J → Sort _)
     (h₁ : ∀ {j₁ j₂ : J} (f : j₁ ⟶ j₂), Z j₁ → Z j₂) (h₂ : ∀ {j₁ j₂ : J} (f : j₁ ⟶ j₂), Z j₂ → Z j₁)
     {j₀ : J} (x : Z j₀) (j : J) : Nonempty (Z j) :=
-  (induct_on_objects { j | Nonempty (Z j) } ⟨x⟩
+  (induct_on_objects {j | Nonempty (Z j)} ⟨x⟩
       (fun j₁ j₂ f => ⟨by rintro ⟨y⟩; exact ⟨h₁ f y⟩, by rintro ⟨y⟩; exact ⟨h₂ f y⟩⟩) j :
     _)
 #align category_theory.is_preconnected_induction CategoryTheory.isPreconnected_induction
Diff
@@ -180,7 +180,7 @@ theorem IsConnected.of_induct [Nonempty J] {j₀ : J}
   IsConnected.of_constant_of_preserves_morphisms fun α F a =>
     by
     have w := h { j | F j = F j₀ } rfl fun _ _ f => by simp [a f]
-    dsimp at w
+    dsimp at w 
     intro j j'
     rw [w j, w j']
 #align category_theory.is_connected.of_induct CategoryTheory.IsConnected.of_induct
@@ -337,7 +337,7 @@ theorem equiv_relation [IsConnected J] (r : J → J → Prop) (hr : Equivalence
   have z : ∀ j : J, r (Classical.arbitrary J) j :=
     induct_on_objects (fun k => r (Classical.arbitrary J) k) (hr.1 (Classical.arbitrary J))
       fun _ _ f => ⟨fun t => hr.2.2 t (h f), fun t => hr.2.2 t (hr.2.1 (h f))⟩
-  intros ; apply hr.2.2 (hr.2.1 (z _)) (z _)
+  intros; apply hr.2.2 (hr.2.1 (z _)) (z _)
 #align category_theory.equiv_relation CategoryTheory.equiv_relation
 -/
 
@@ -414,7 +414,7 @@ theorem nat_trans_from_is_connected [IsPreconnected J] {X Y : C}
     (α : (Functor.const J).obj X ⟶ (Functor.const J).obj Y) :
     ∀ j j' : J, α.app j = (α.app j' : X ⟶ Y) :=
   @constant_of_preserves_morphisms _ _ _ (X ⟶ Y) (fun j => α.app j) fun _ _ f => by
-    have := α.naturality f; erw [id_comp, comp_id] at this; exact this.symm
+    have := α.naturality f; erw [id_comp, comp_id] at this ; exact this.symm
 #align category_theory.nat_trans_from_is_connected CategoryTheory.nat_trans_from_is_connected
 
 instance [IsConnected J] : Full (Functor.const J : C ⥤ J ⥤ C)
Diff
@@ -92,12 +92,6 @@ variable {J : Type u₁} [Category.{v₁} J]
 
 variable {K : Type u₂} [Category.{v₂} K]
 
-/- warning: category_theory.iso_constant -> CategoryTheory.isoConstant is a dubious translation:
-lean 3 declaration is
-  forall {J : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} J] [_inst_3 : CategoryTheory.IsPreconnected.{u1, u2} J _inst_1] {α : Type.{u2}} (F : CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (j : J), CategoryTheory.Iso.{u2, max u1 u2} (CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.Functor.category.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) F (CategoryTheory.Functor.obj.{u2, u2, u2, max u1 u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) (CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.Functor.category.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.Functor.const.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.Functor.obj.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F j))
-but is expected to have type
-  forall {J : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} J] [_inst_3 : CategoryTheory.IsPreconnected.{u1, u2} J _inst_1] {α : Type.{u2}} (F : CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (j : J), CategoryTheory.Iso.{u2, max u2 u1} (CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.Functor.category.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) F (Prefunctor.obj.{succ u2, succ u2, u2, max u2 u1} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.CategoryStruct.toQuiver.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.Category.toCategoryStruct.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α))) (CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.CategoryStruct.toQuiver.{u2, max u2 u1} (CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.Category.toCategoryStruct.{u2, max u2 u1} (CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.Functor.category.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)))) (CategoryTheory.Functor.toPrefunctor.{u2, u2, u2, max u2 u1} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) (CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.Functor.category.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.Functor.const.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α))) (Prefunctor.obj.{succ u1, succ u2, u2, u2} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_1)) (CategoryTheory.Discrete.{u2} α) (CategoryTheory.CategoryStruct.toQuiver.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.Category.toCategoryStruct.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α))) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F) j))
-Case conversion may be inaccurate. Consider using '#align category_theory.iso_constant CategoryTheory.isoConstantₓ'. -/
 /-- If `J` is connected, any functor `F : J ⥤ discrete α` is isomorphic to
 the constant functor with value `F.obj j` (for any choice of `j`).
 -/
@@ -106,12 +100,6 @@ def isoConstant [IsPreconnected J] {α : Type u₁} (F : J ⥤ Discrete α) (j :
   (IsPreconnected.iso_constant F j).some
 #align category_theory.iso_constant CategoryTheory.isoConstant
 
-/- warning: category_theory.any_functor_const_on_obj -> CategoryTheory.any_functor_const_on_obj is a dubious translation:
-lean 3 declaration is
-  forall {J : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} J] [_inst_3 : CategoryTheory.IsPreconnected.{u1, u2} J _inst_1] {α : Type.{u2}} (F : CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (j : J) (j' : J), Eq.{succ u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.Functor.obj.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F j) (CategoryTheory.Functor.obj.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F j')
-but is expected to have type
-  forall {J : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} J] [_inst_3 : CategoryTheory.IsPreconnected.{u1, u2} J _inst_1] {α : Type.{u2}} (F : CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (j : J) (j' : J), Eq.{succ u2} (CategoryTheory.Discrete.{u2} α) (Prefunctor.obj.{succ u1, succ u2, u2, u2} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_1)) (CategoryTheory.Discrete.{u2} α) (CategoryTheory.CategoryStruct.toQuiver.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.Category.toCategoryStruct.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α))) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F) j) (Prefunctor.obj.{succ u1, succ u2, u2, u2} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_1)) (CategoryTheory.Discrete.{u2} α) (CategoryTheory.CategoryStruct.toQuiver.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.Category.toCategoryStruct.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α))) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F) j')
-Case conversion may be inaccurate. Consider using '#align category_theory.any_functor_const_on_obj CategoryTheory.any_functor_const_on_objₓ'. -/
 /-- If J is connected, any functor to a discrete category is constant on objects.
 The converse is given in `is_connected.of_any_functor_const_on_obj`.
 -/
@@ -119,12 +107,6 @@ theorem any_functor_const_on_obj [IsPreconnected J] {α : Type u₁} (F : J ⥤
     F.obj j = F.obj j' := by ext; exact ((iso_constant F j').Hom.app j).down.1
 #align category_theory.any_functor_const_on_obj CategoryTheory.any_functor_const_on_obj
 
-/- warning: category_theory.is_connected.of_any_functor_const_on_obj -> CategoryTheory.IsConnected.of_any_functor_const_on_obj is a dubious translation:
-lean 3 declaration is
-  forall {J : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} J] [_inst_3 : Nonempty.{succ u2} J], (forall {α : Type.{u2}} (F : CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (j : J) (j' : J), Eq.{succ u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.Functor.obj.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F j) (CategoryTheory.Functor.obj.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F j')) -> (CategoryTheory.IsConnected.{u1, u2} J _inst_1)
-but is expected to have type
-  forall {J : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} J] [_inst_3 : Nonempty.{succ u2} J], (forall {α : Type.{u2}} (F : CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (j : J) (j' : J), Eq.{succ u2} (CategoryTheory.Discrete.{u2} α) (Prefunctor.obj.{succ u1, succ u2, u2, u2} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_1)) (CategoryTheory.Discrete.{u2} α) (CategoryTheory.CategoryStruct.toQuiver.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.Category.toCategoryStruct.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α))) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F) j) (Prefunctor.obj.{succ u1, succ u2, u2, u2} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_1)) (CategoryTheory.Discrete.{u2} α) (CategoryTheory.CategoryStruct.toQuiver.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.Category.toCategoryStruct.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α))) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F) j')) -> (CategoryTheory.IsConnected.{u1, u2} J _inst_1)
-Case conversion may be inaccurate. Consider using '#align category_theory.is_connected.of_any_functor_const_on_obj CategoryTheory.IsConnected.of_any_functor_const_on_objₓ'. -/
 /-- If any functor to a discrete category is constant on objects, J is connected.
 The converse of `any_functor_const_on_obj`.
 -/
@@ -216,12 +198,6 @@ instance [hc : IsConnected J] : IsConnected (ULiftHom.{v₂} (ULift.{u₂} J)) :
     induct_on_objects (fun j : J => p { down := j }) hj₀' fun _ _ f =>
       h ((ulift_hom_ulift_category.equiv J).Functor.map f)
 
-/- warning: category_theory.is_preconnected_induction -> CategoryTheory.isPreconnected_induction is a dubious translation:
-lean 3 declaration is
-  forall {J : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} J] [_inst_3 : CategoryTheory.IsPreconnected.{u1, u2} J _inst_1] (Z : J -> Sort.{u3}), (forall {j₁ : J} {j₂ : J}, (Quiver.Hom.{succ u1, u2} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_1)) j₁ j₂) -> (Z j₁) -> (Z j₂)) -> (forall {j₁ : J} {j₂ : J}, (Quiver.Hom.{succ u1, u2} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_1)) j₁ j₂) -> (Z j₂) -> (Z j₁)) -> (forall {j₀ : J}, (Z j₀) -> (forall (j : J), Nonempty.{u3} (Z j)))
-but is expected to have type
-  forall {J : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u2, u3} J] [_inst_3 : CategoryTheory.IsPreconnected.{u2, u3} J _inst_1] (Z : J -> Sort.{u1}), (forall {j₁ : J} {j₂ : J}, (Quiver.Hom.{succ u2, u3} J (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} J (CategoryTheory.Category.toCategoryStruct.{u2, u3} J _inst_1)) j₁ j₂) -> (Z j₁) -> (Z j₂)) -> (forall {j₁ : J} {j₂ : J}, (Quiver.Hom.{succ u2, u3} J (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} J (CategoryTheory.Category.toCategoryStruct.{u2, u3} J _inst_1)) j₁ j₂) -> (Z j₂) -> (Z j₁)) -> (forall {j₀ : J}, (Z j₀) -> (forall (j : J), Nonempty.{u1} (Z j)))
-Case conversion may be inaccurate. Consider using '#align category_theory.is_preconnected_induction CategoryTheory.isPreconnected_inductionₓ'. -/
 /-- Another induction principle for `is_preconnected J`:
 given a type family `Z : J → Sort*` and
 a rule for transporting in *both* directions along a morphism in `J`,
@@ -235,12 +211,6 @@ theorem isPreconnected_induction [IsPreconnected J] (Z : J → Sort _)
     _)
 #align category_theory.is_preconnected_induction CategoryTheory.isPreconnected_induction
 
-/- warning: category_theory.is_preconnected_of_equivalent -> CategoryTheory.isPreconnected_of_equivalent is a dubious translation:
-lean 3 declaration is
-  forall {J : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} J] {K : Type.{u3}} [_inst_3 : CategoryTheory.Category.{u2, u3} K] [_inst_4 : CategoryTheory.IsPreconnected.{u1, u3} J _inst_1], (CategoryTheory.Equivalence.{u1, u2, u3, u3} J _inst_1 K _inst_3) -> (CategoryTheory.IsPreconnected.{u2, u3} K _inst_3)
-but is expected to have type
-  forall {J : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} J] {K : Type.{u3}} [_inst_3 : CategoryTheory.Category.{u2, u3} K] [_inst_4 : CategoryTheory.IsPreconnected.{u1, u3} J _inst_1], (CategoryTheory.Equivalence.{u1, u2, u3, u3} J K _inst_1 _inst_3) -> (CategoryTheory.IsPreconnected.{u2, u3} K _inst_3)
-Case conversion may be inaccurate. Consider using '#align category_theory.is_preconnected_of_equivalent CategoryTheory.isPreconnected_of_equivalentₓ'. -/
 /-- If `J` and `K` are equivalent, then if `J` is preconnected then `K` is as well. -/
 theorem isPreconnected_of_equivalent {K : Type u₁} [Category.{v₂} K] [IsPreconnected J]
     (e : J ≌ K) : IsPreconnected K :=
@@ -256,12 +226,6 @@ theorem isPreconnected_of_equivalent {K : Type u₁} [Category.{v₂} K] [IsPrec
           ⟩ }
 #align category_theory.is_preconnected_of_equivalent CategoryTheory.isPreconnected_of_equivalent
 
-/- warning: category_theory.is_connected_of_equivalent -> CategoryTheory.isConnected_of_equivalent is a dubious translation:
-lean 3 declaration is
-  forall {J : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} J] {K : Type.{u3}} [_inst_3 : CategoryTheory.Category.{u2, u3} K], (CategoryTheory.Equivalence.{u1, u2, u3, u3} J _inst_1 K _inst_3) -> (forall [_inst_4 : CategoryTheory.IsConnected.{u1, u3} J _inst_1], CategoryTheory.IsConnected.{u2, u3} K _inst_3)
-but is expected to have type
-  forall {J : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} J] {K : Type.{u3}} [_inst_3 : CategoryTheory.Category.{u2, u3} K], (CategoryTheory.Equivalence.{u1, u2, u3, u3} J K _inst_1 _inst_3) -> (forall [_inst_4 : CategoryTheory.IsConnected.{u1, u3} J _inst_1], CategoryTheory.IsConnected.{u2, u3} K _inst_3)
-Case conversion may be inaccurate. Consider using '#align category_theory.is_connected_of_equivalent CategoryTheory.isConnected_of_equivalentₓ'. -/
 /-- If `J` and `K` are equivalent, then if `J` is connected then `K` is as well. -/
 theorem isConnected_of_equivalent {K : Type u₁} [Category.{v₂} K] (e : J ≌ K) [IsConnected J] :
     IsConnected K :=
@@ -351,12 +315,6 @@ def Zigzag.setoid (J : Type u₂) [Category.{v₁} J] : Setoid J
 #align category_theory.zigzag.setoid CategoryTheory.Zigzag.setoid
 -/
 
-/- warning: category_theory.zigzag_obj_of_zigzag -> CategoryTheory.zigzag_obj_of_zigzag is a dubious translation:
-lean 3 declaration is
-  forall {J : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} J] {K : Type.{u4}} [_inst_2 : CategoryTheory.Category.{u2, u4} K] (F : CategoryTheory.Functor.{u1, u2, u3, u4} J _inst_1 K _inst_2) {j₁ : J} {j₂ : J}, (CategoryTheory.Zigzag.{u1, u3} J _inst_1 j₁ j₂) -> (CategoryTheory.Zigzag.{u2, u4} K _inst_2 (CategoryTheory.Functor.obj.{u1, u2, u3, u4} J _inst_1 K _inst_2 F j₁) (CategoryTheory.Functor.obj.{u1, u2, u3, u4} J _inst_1 K _inst_2 F j₂))
-but is expected to have type
-  forall {J : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} J] {K : Type.{u4}} [_inst_2 : CategoryTheory.Category.{u2, u4} K] (F : CategoryTheory.Functor.{u1, u2, u3, u4} J _inst_1 K _inst_2) {j₁ : J} {j₂ : J}, (CategoryTheory.Zigzag.{u1, u3} J _inst_1 j₁ j₂) -> (CategoryTheory.Zigzag.{u2, u4} K _inst_2 (Prefunctor.obj.{succ u1, succ u2, u3, u4} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u3} J (CategoryTheory.Category.toCategoryStruct.{u1, u3} J _inst_1)) K (CategoryTheory.CategoryStruct.toQuiver.{u2, u4} K (CategoryTheory.Category.toCategoryStruct.{u2, u4} K _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u3, u4} J _inst_1 K _inst_2 F) j₁) (Prefunctor.obj.{succ u1, succ u2, u3, u4} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u3} J (CategoryTheory.Category.toCategoryStruct.{u1, u3} J _inst_1)) K (CategoryTheory.CategoryStruct.toQuiver.{u2, u4} K (CategoryTheory.Category.toCategoryStruct.{u2, u4} K _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u3, u4} J _inst_1 K _inst_2 F) j₂))
-Case conversion may be inaccurate. Consider using '#align category_theory.zigzag_obj_of_zigzag CategoryTheory.zigzag_obj_of_zigzagₓ'. -/
 /-- If there is a zigzag from `j₁` to `j₂`, then there is a zigzag from `F j₁` to
 `F j₂` as long as `F` is a functor.
 -/
@@ -365,12 +323,6 @@ theorem zigzag_obj_of_zigzag (F : J ⥤ K) {j₁ j₂ : J} (h : Zigzag j₁ j₂
   h.lift _ fun j k => Or.imp (Nonempty.map fun f => F.map f) (Nonempty.map fun f => F.map f)
 #align category_theory.zigzag_obj_of_zigzag CategoryTheory.zigzag_obj_of_zigzag
 
-/- warning: category_theory.zag_of_zag_obj -> CategoryTheory.zag_of_zag_obj is a dubious translation:
-lean 3 declaration is
-  forall {J : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} J] {K : Type.{u4}} [_inst_2 : CategoryTheory.Category.{u2, u4} K] (F : CategoryTheory.Functor.{u1, u2, u3, u4} J _inst_1 K _inst_2) [_inst_3 : CategoryTheory.Full.{u1, u2, u3, u4} J _inst_1 K _inst_2 F] {j₁ : J} {j₂ : J}, (CategoryTheory.Zag.{u2, u4} K _inst_2 (CategoryTheory.Functor.obj.{u1, u2, u3, u4} J _inst_1 K _inst_2 F j₁) (CategoryTheory.Functor.obj.{u1, u2, u3, u4} J _inst_1 K _inst_2 F j₂)) -> (CategoryTheory.Zag.{u1, u3} J _inst_1 j₁ j₂)
-but is expected to have type
-  forall {J : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} J] {K : Type.{u4}} [_inst_2 : CategoryTheory.Category.{u2, u4} K] (F : CategoryTheory.Functor.{u1, u2, u3, u4} J _inst_1 K _inst_2) [_inst_3 : CategoryTheory.Full.{u1, u2, u3, u4} J _inst_1 K _inst_2 F] {j₁ : J} {j₂ : J}, (CategoryTheory.Zag.{u2, u4} K _inst_2 (Prefunctor.obj.{succ u1, succ u2, u3, u4} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u3} J (CategoryTheory.Category.toCategoryStruct.{u1, u3} J _inst_1)) K (CategoryTheory.CategoryStruct.toQuiver.{u2, u4} K (CategoryTheory.Category.toCategoryStruct.{u2, u4} K _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u3, u4} J _inst_1 K _inst_2 F) j₁) (Prefunctor.obj.{succ u1, succ u2, u3, u4} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u3} J (CategoryTheory.Category.toCategoryStruct.{u1, u3} J _inst_1)) K (CategoryTheory.CategoryStruct.toQuiver.{u2, u4} K (CategoryTheory.Category.toCategoryStruct.{u2, u4} K _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u3, u4} J _inst_1 K _inst_2 F) j₂)) -> (CategoryTheory.Zag.{u1, u3} J _inst_1 j₁ j₂)
-Case conversion may be inaccurate. Consider using '#align category_theory.zag_of_zag_obj CategoryTheory.zag_of_zag_objₓ'. -/
 -- TODO: figure out the right way to generalise this to `zigzag`.
 theorem zag_of_zag_obj (F : J ⥤ K) [Full F] {j₁ j₂ : J} (h : Zag (F.obj j₁) (F.obj j₂)) :
     Zag j₁ j₂ :=
@@ -454,9 +406,6 @@ def discreteIsConnectedEquivPunit {α : Type u₁} [IsConnected (Discrete α)] :
 
 variable {C : Type u₂} [Category.{u₁} C]
 
-/- warning: category_theory.nat_trans_from_is_connected -> CategoryTheory.nat_trans_from_is_connected is a dubious translation:
-<too large>
-Case conversion may be inaccurate. Consider using '#align category_theory.nat_trans_from_is_connected CategoryTheory.nat_trans_from_is_connectedₓ'. -/
 /-- For objects `X Y : C`, any natural transformation `α : const X ⟶ const Y` from a connected
 category must be constant.
 This is the key property of connected categories which we use to establish properties about limits.
Diff
@@ -116,9 +116,7 @@ Case conversion may be inaccurate. Consider using '#align category_theory.any_fu
 The converse is given in `is_connected.of_any_functor_const_on_obj`.
 -/
 theorem any_functor_const_on_obj [IsPreconnected J] {α : Type u₁} (F : J ⥤ Discrete α) (j j' : J) :
-    F.obj j = F.obj j' := by
-  ext
-  exact ((iso_constant F j').Hom.app j).down.1
+    F.obj j = F.obj j' := by ext; exact ((iso_constant F j').Hom.app j).down.1
 #align category_theory.any_functor_const_on_obj CategoryTheory.any_functor_const_on_obj
 
 /- warning: category_theory.is_connected.of_any_functor_const_on_obj -> CategoryTheory.IsConnected.of_any_functor_const_on_obj is a dubious translation:
@@ -149,12 +147,7 @@ theorem constant_of_preserves_morphisms [IsPreconnected J] {α : Type u₁} (F :
   simpa using
     any_functor_const_on_obj
       { obj := discrete.mk ∘ F
-        map := fun _ _ f =>
-          eq_to_hom
-            (by
-              ext
-              exact h _ _ f) }
-      j j'
+        map := fun _ _ f => eq_to_hom (by ext; exact h _ _ f) } j j'
 #align category_theory.constant_of_preserves_morphisms CategoryTheory.constant_of_preserves_morphisms
 -/
 
@@ -171,9 +164,7 @@ theorem IsConnected.of_constant_of_preserves_morphisms [Nonempty J]
         (∀ {j₁ j₂ : J} (f : j₁ ⟶ j₂), F j₁ = F j₂) → ∀ j j' : J, F j = F j') :
     IsConnected J :=
   IsConnected.of_any_functor_const_on_obj fun _ F =>
-    h F.obj fun _ _ f => by
-      ext
-      exact discrete.eq_of_hom (F.map f)
+    h F.obj fun _ _ f => by ext; exact discrete.eq_of_hom (F.map f)
 #align category_theory.is_connected.of_constant_of_preserves_morphisms CategoryTheory.IsConnected.of_constant_of_preserves_morphisms
 -/
 
@@ -220,10 +211,7 @@ instance [hc : IsConnected J] : IsConnected (ULiftHom.{v₂} (ULift.{u₂} J)) :
   apply is_connected.of_induct
   rintro p hj₀ h ⟨j⟩
   let p' : Set J := (fun j : J => p { down := j } : Set J)
-  have hj₀' : Classical.choice hc.is_nonempty ∈ p' :=
-    by
-    simp only [p']
-    exact hj₀
+  have hj₀' : Classical.choice hc.is_nonempty ∈ p' := by simp only [p']; exact hj₀
   apply
     induct_on_objects (fun j : J => p { down := j }) hj₀' fun _ _ f =>
       h ((ulift_hom_ulift_category.equiv J).Functor.map f)
@@ -243,13 +231,7 @@ theorem isPreconnected_induction [IsPreconnected J] (Z : J → Sort _)
     (h₁ : ∀ {j₁ j₂ : J} (f : j₁ ⟶ j₂), Z j₁ → Z j₂) (h₂ : ∀ {j₁ j₂ : J} (f : j₁ ⟶ j₂), Z j₂ → Z j₁)
     {j₀ : J} (x : Z j₀) (j : J) : Nonempty (Z j) :=
   (induct_on_objects { j | Nonempty (Z j) } ⟨x⟩
-      (fun j₁ j₂ f =>
-        ⟨by
-          rintro ⟨y⟩
-          exact ⟨h₁ f y⟩, by
-          rintro ⟨y⟩
-          exact ⟨h₂ f y⟩⟩)
-      j :
+      (fun j₁ j₂ f => ⟨by rintro ⟨y⟩; exact ⟨h₁ f y⟩, by rintro ⟨y⟩; exact ⟨h₂ f y⟩⟩) j :
     _)
 #align category_theory.is_preconnected_induction CategoryTheory.isPreconnected_induction
 
@@ -482,11 +464,8 @@ This is the key property of connected categories which we use to establish prope
 theorem nat_trans_from_is_connected [IsPreconnected J] {X Y : C}
     (α : (Functor.const J).obj X ⟶ (Functor.const J).obj Y) :
     ∀ j j' : J, α.app j = (α.app j' : X ⟶ Y) :=
-  @constant_of_preserves_morphisms _ _ _ (X ⟶ Y) (fun j => α.app j) fun _ _ f =>
-    by
-    have := α.naturality f
-    erw [id_comp, comp_id] at this
-    exact this.symm
+  @constant_of_preserves_morphisms _ _ _ (X ⟶ Y) (fun j => α.app j) fun _ _ f => by
+    have := α.naturality f; erw [id_comp, comp_id] at this; exact this.symm
 #align category_theory.nat_trans_from_is_connected CategoryTheory.nat_trans_from_is_connected
 
 instance [IsConnected J] : Full (Functor.const J : C ⥤ J ⥤ C)
Diff
@@ -473,10 +473,7 @@ def discreteIsConnectedEquivPunit {α : Type u₁} [IsConnected (Discrete α)] :
 variable {C : Type u₂} [Category.{u₁} C]
 
 /- warning: category_theory.nat_trans_from_is_connected -> CategoryTheory.nat_trans_from_is_connected is a dubious translation:
-lean 3 declaration is
-  forall {J : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} J] {C : Type.{u3}} [_inst_3 : CategoryTheory.Category.{u2, u3} C] [_inst_4 : CategoryTheory.IsPreconnected.{u1, u2} J _inst_1] {X : C} {Y : C} (α : Quiver.Hom.{succ u2, max u1 u2 u3} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max u1 u2 u3} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max u1 u2 u3} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (CategoryTheory.Functor.obj.{u2, u2, u3, max u1 u2 u3} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3) X) (CategoryTheory.Functor.obj.{u2, u2, u3, max u1 u2 u3} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3) Y)) (j : J) (j' : J), Eq.{succ u2} (Quiver.Hom.{succ u2, u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.obj.{u1, u2, u2, u3} J _inst_1 C _inst_3 (CategoryTheory.Functor.obj.{u2, u2, u3, max u1 u2 u3} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3) X) j) (CategoryTheory.Functor.obj.{u1, u2, u2, u3} J _inst_1 C _inst_3 (CategoryTheory.Functor.obj.{u2, u2, u3, max u1 u2 u3} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3) Y) j)) (CategoryTheory.NatTrans.app.{u1, u2, u2, u3} J _inst_1 C _inst_3 (CategoryTheory.Functor.obj.{u2, u2, u3, max u1 u2 u3} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3) X) (CategoryTheory.Functor.obj.{u2, u2, u3, max u1 u2 u3} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3) Y) α j) (CategoryTheory.NatTrans.app.{u1, u2, u2, u3} J _inst_1 C _inst_3 (CategoryTheory.Functor.obj.{u2, u2, u3, max u1 u2 u3} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3) X) (CategoryTheory.Functor.obj.{u2, u2, u3, max u1 u2 u3} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3) Y) α j')
-but is expected to have type
-  forall {J : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} J] {C : Type.{u3}} [_inst_3 : CategoryTheory.Category.{u2, u3} C] [_inst_4 : CategoryTheory.IsPreconnected.{u1, u2} J _inst_1] {X : C} {Y : C} (α : Quiver.Hom.{succ u2, max (max u2 u1) u3} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max (max u2 u3) u1} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max (max u2 u3) u1} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (Prefunctor.obj.{succ u2, succ u2, u3, max (max u2 u1) u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u2, u2, u3, max (max (max u2 u1) u3) u2} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3)) X) (Prefunctor.obj.{succ u2, succ u2, u3, max (max u2 u1) u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u2, u2, u3, max (max (max u2 u1) u3) u2} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3)) Y)) (j : J) (j' : J), Eq.{succ u2} (Quiver.Hom.{succ u2, u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (Prefunctor.obj.{succ u1, succ u2, u2, u3} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_1)) C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u2, u3} J _inst_1 C _inst_3 (Prefunctor.obj.{succ u2, succ u2, u3, max (max u2 u1) u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u2, u2, u3, max (max (max u2 u1) u3) u2} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3)) X)) j) (Prefunctor.obj.{succ u1, succ u2, u2, u3} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_1)) C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u2, u3} J _inst_1 C _inst_3 (Prefunctor.obj.{succ u2, succ u2, u3, max (max u2 u1) u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u2, u2, u3, max (max (max u2 u1) u3) u2} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3)) Y)) j)) (CategoryTheory.NatTrans.app.{u1, u2, u2, u3} J _inst_1 C _inst_3 (Prefunctor.obj.{succ u2, succ u2, u3, max (max u2 u1) u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u2, u2, u3, max (max (max u2 u1) u3) u2} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3)) X) (Prefunctor.obj.{succ u2, succ u2, u3, max (max u2 u1) u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u2, u2, u3, max (max (max u2 u1) u3) u2} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3)) Y) α j) (CategoryTheory.NatTrans.app.{u1, u2, u2, u3} J _inst_1 C _inst_3 (Prefunctor.obj.{succ u2, succ u2, u3, max (max u2 u1) u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u2, u2, u3, max (max (max u2 u1) u3) u2} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3)) X) (Prefunctor.obj.{succ u2, succ u2, u3, max (max u2 u1) u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u2, u2, u3, max (max (max u2 u1) u3) u2} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3)) Y) α j')
+<too large>
 Case conversion may be inaccurate. Consider using '#align category_theory.nat_trans_from_is_connected CategoryTheory.nat_trans_from_is_connectedₓ'. -/
 /-- For objects `X Y : C`, any natural transformation `α : const X ⟶ const Y` from a connected
 category must be constant.
Diff
@@ -86,7 +86,7 @@ class IsConnected (J : Type u₁) [Category.{v₁} J] extends IsPreconnected J :
 #align category_theory.is_connected CategoryTheory.IsConnected
 -/
 
-attribute [instance] is_connected.is_nonempty
+attribute [instance 100] is_connected.is_nonempty
 
 variable {J : Type u₁} [Category.{v₁} J]
 
Diff
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Bhavik Mehta, Jakob von Raumer
 
 ! This file was ported from Lean 3 source module category_theory.is_connected
-! leanprover-community/mathlib commit 024a4231815538ac739f52d08dd20a55da0d6b23
+! leanprover-community/mathlib commit 69c6a5a12d8a2b159f20933e60115a4f2de62b58
 ! Please do not edit these lines, except to modify the commit id
 ! if you have ported upstream changes.
 -/
@@ -16,6 +16,9 @@ import Mathbin.CategoryTheory.Category.Ulift
 /-!
 # Connected category
 
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
 Define a connected category as a _nonempty_ category for which every functor
 to a discrete category is isomorphic to the constant functor.
 
Diff
@@ -57,13 +57,16 @@ open Opposite
 
 namespace CategoryTheory
 
+#print CategoryTheory.IsPreconnected /-
 /-- A possibly empty category for which every functor to a discrete category is constant.
 -/
 class IsPreconnected (J : Type u₁) [Category.{v₁} J] : Prop where
   iso_constant :
     ∀ {α : Type u₁} (F : J ⥤ Discrete α) (j : J), Nonempty (F ≅ (Functor.const J).obj (F.obj j))
 #align category_theory.is_preconnected CategoryTheory.IsPreconnected
+-/
 
+#print CategoryTheory.IsConnected /-
 /-- We define a connected category as a _nonempty_ category for which every
 functor to a discrete category is constant.
 
@@ -78,6 +81,7 @@ See <https://stacks.math.columbia.edu/tag/002S>
 class IsConnected (J : Type u₁) [Category.{v₁} J] extends IsPreconnected J : Prop where
   [is_nonempty : Nonempty J]
 #align category_theory.is_connected CategoryTheory.IsConnected
+-/
 
 attribute [instance] is_connected.is_nonempty
 
@@ -85,6 +89,12 @@ variable {J : Type u₁} [Category.{v₁} J]
 
 variable {K : Type u₂} [Category.{v₂} K]
 
+/- warning: category_theory.iso_constant -> CategoryTheory.isoConstant is a dubious translation:
+lean 3 declaration is
+  forall {J : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} J] [_inst_3 : CategoryTheory.IsPreconnected.{u1, u2} J _inst_1] {α : Type.{u2}} (F : CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (j : J), CategoryTheory.Iso.{u2, max u1 u2} (CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.Functor.category.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) F (CategoryTheory.Functor.obj.{u2, u2, u2, max u1 u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) (CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.Functor.category.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.Functor.const.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.Functor.obj.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F j))
+but is expected to have type
+  forall {J : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} J] [_inst_3 : CategoryTheory.IsPreconnected.{u1, u2} J _inst_1] {α : Type.{u2}} (F : CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (j : J), CategoryTheory.Iso.{u2, max u2 u1} (CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.Functor.category.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) F (Prefunctor.obj.{succ u2, succ u2, u2, max u2 u1} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.CategoryStruct.toQuiver.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.Category.toCategoryStruct.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α))) (CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.CategoryStruct.toQuiver.{u2, max u2 u1} (CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.Category.toCategoryStruct.{u2, max u2 u1} (CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.Functor.category.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)))) (CategoryTheory.Functor.toPrefunctor.{u2, u2, u2, max u2 u1} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) (CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.Functor.category.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (CategoryTheory.Functor.const.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α))) (Prefunctor.obj.{succ u1, succ u2, u2, u2} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_1)) (CategoryTheory.Discrete.{u2} α) (CategoryTheory.CategoryStruct.toQuiver.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.Category.toCategoryStruct.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α))) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F) j))
+Case conversion may be inaccurate. Consider using '#align category_theory.iso_constant CategoryTheory.isoConstantₓ'. -/
 /-- If `J` is connected, any functor `F : J ⥤ discrete α` is isomorphic to
 the constant functor with value `F.obj j` (for any choice of `j`).
 -/
@@ -93,6 +103,12 @@ def isoConstant [IsPreconnected J] {α : Type u₁} (F : J ⥤ Discrete α) (j :
   (IsPreconnected.iso_constant F j).some
 #align category_theory.iso_constant CategoryTheory.isoConstant
 
+/- warning: category_theory.any_functor_const_on_obj -> CategoryTheory.any_functor_const_on_obj is a dubious translation:
+lean 3 declaration is
+  forall {J : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} J] [_inst_3 : CategoryTheory.IsPreconnected.{u1, u2} J _inst_1] {α : Type.{u2}} (F : CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (j : J) (j' : J), Eq.{succ u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.Functor.obj.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F j) (CategoryTheory.Functor.obj.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F j')
+but is expected to have type
+  forall {J : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} J] [_inst_3 : CategoryTheory.IsPreconnected.{u1, u2} J _inst_1] {α : Type.{u2}} (F : CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (j : J) (j' : J), Eq.{succ u2} (CategoryTheory.Discrete.{u2} α) (Prefunctor.obj.{succ u1, succ u2, u2, u2} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_1)) (CategoryTheory.Discrete.{u2} α) (CategoryTheory.CategoryStruct.toQuiver.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.Category.toCategoryStruct.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α))) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F) j) (Prefunctor.obj.{succ u1, succ u2, u2, u2} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_1)) (CategoryTheory.Discrete.{u2} α) (CategoryTheory.CategoryStruct.toQuiver.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.Category.toCategoryStruct.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α))) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F) j')
+Case conversion may be inaccurate. Consider using '#align category_theory.any_functor_const_on_obj CategoryTheory.any_functor_const_on_objₓ'. -/
 /-- If J is connected, any functor to a discrete category is constant on objects.
 The converse is given in `is_connected.of_any_functor_const_on_obj`.
 -/
@@ -102,6 +118,12 @@ theorem any_functor_const_on_obj [IsPreconnected J] {α : Type u₁} (F : J ⥤
   exact ((iso_constant F j').Hom.app j).down.1
 #align category_theory.any_functor_const_on_obj CategoryTheory.any_functor_const_on_obj
 
+/- warning: category_theory.is_connected.of_any_functor_const_on_obj -> CategoryTheory.IsConnected.of_any_functor_const_on_obj is a dubious translation:
+lean 3 declaration is
+  forall {J : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} J] [_inst_3 : Nonempty.{succ u2} J], (forall {α : Type.{u2}} (F : CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (j : J) (j' : J), Eq.{succ u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.Functor.obj.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F j) (CategoryTheory.Functor.obj.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F j')) -> (CategoryTheory.IsConnected.{u1, u2} J _inst_1)
+but is expected to have type
+  forall {J : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} J] [_inst_3 : Nonempty.{succ u2} J], (forall {α : Type.{u2}} (F : CategoryTheory.Functor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α)) (j : J) (j' : J), Eq.{succ u2} (CategoryTheory.Discrete.{u2} α) (Prefunctor.obj.{succ u1, succ u2, u2, u2} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_1)) (CategoryTheory.Discrete.{u2} α) (CategoryTheory.CategoryStruct.toQuiver.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.Category.toCategoryStruct.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α))) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F) j) (Prefunctor.obj.{succ u1, succ u2, u2, u2} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_1)) (CategoryTheory.Discrete.{u2} α) (CategoryTheory.CategoryStruct.toQuiver.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.Category.toCategoryStruct.{u2, u2} (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α))) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u2, u2} J _inst_1 (CategoryTheory.Discrete.{u2} α) (CategoryTheory.discreteCategory.{u2} α) F) j')) -> (CategoryTheory.IsConnected.{u1, u2} J _inst_1)
+Case conversion may be inaccurate. Consider using '#align category_theory.is_connected.of_any_functor_const_on_obj CategoryTheory.IsConnected.of_any_functor_const_on_objₓ'. -/
 /-- If any functor to a discrete category is constant on objects, J is connected.
 The converse of `any_functor_const_on_obj`.
 -/
@@ -112,6 +134,7 @@ theorem IsConnected.of_any_functor_const_on_obj [Nonempty J]
       ⟨NatIso.ofComponents (fun j => eqToIso (h F j j')) fun _ _ _ => Subsingleton.elim _ _⟩ }
 #align category_theory.is_connected.of_any_functor_const_on_obj CategoryTheory.IsConnected.of_any_functor_const_on_obj
 
+#print CategoryTheory.constant_of_preserves_morphisms /-
 /-- If `J` is connected, then given any function `F` such that the presence of a
 morphism `j₁ ⟶ j₂` implies `F j₁ = F j₂`, we have that `F` is constant.
 This can be thought of as a local-to-global property.
@@ -130,7 +153,9 @@ theorem constant_of_preserves_morphisms [IsPreconnected J] {α : Type u₁} (F :
               exact h _ _ f) }
       j j'
 #align category_theory.constant_of_preserves_morphisms CategoryTheory.constant_of_preserves_morphisms
+-/
 
+#print CategoryTheory.IsConnected.of_constant_of_preserves_morphisms /-
 /-- `J` is connected if: given any function `F : J → α` which is constant for any
 `j₁, j₂` for which there is a morphism `j₁ ⟶ j₂`, then `F` is constant.
 This can be thought of as a local-to-global property.
@@ -147,7 +172,9 @@ theorem IsConnected.of_constant_of_preserves_morphisms [Nonempty J]
       ext
       exact discrete.eq_of_hom (F.map f)
 #align category_theory.is_connected.of_constant_of_preserves_morphisms CategoryTheory.IsConnected.of_constant_of_preserves_morphisms
+-/
 
+#print CategoryTheory.induct_on_objects /-
 /-- An inductive-like property for the objects of a connected category.
 If the set `p` is nonempty, and `p` is closed under morphisms of `J`,
 then `p` contains all of `J`.
@@ -163,7 +190,9 @@ theorem induct_on_objects [IsPreconnected J] (p : Set J) {j₀ : J} (h0 : j₀ 
   dsimp
   exact congr_arg ULift.up (propext (h1 f))
 #align category_theory.induct_on_objects CategoryTheory.induct_on_objects
+-/
 
+#print CategoryTheory.IsConnected.of_induct /-
 /--
 If any maximal connected component containing some element j₀ of J is all of J, then J is connected.
 
@@ -179,6 +208,7 @@ theorem IsConnected.of_induct [Nonempty J] {j₀ : J}
     intro j j'
     rw [w j, w j']
 #align category_theory.is_connected.of_induct CategoryTheory.IsConnected.of_induct
+-/
 
 /-- Lifting the universe level of morphisms and objects preserves connectedness. -/
 instance [hc : IsConnected J] : IsConnected (ULiftHom.{v₂} (ULift.{u₂} J)) :=
@@ -195,6 +225,12 @@ instance [hc : IsConnected J] : IsConnected (ULiftHom.{v₂} (ULift.{u₂} J)) :
     induct_on_objects (fun j : J => p { down := j }) hj₀' fun _ _ f =>
       h ((ulift_hom_ulift_category.equiv J).Functor.map f)
 
+/- warning: category_theory.is_preconnected_induction -> CategoryTheory.isPreconnected_induction is a dubious translation:
+lean 3 declaration is
+  forall {J : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} J] [_inst_3 : CategoryTheory.IsPreconnected.{u1, u2} J _inst_1] (Z : J -> Sort.{u3}), (forall {j₁ : J} {j₂ : J}, (Quiver.Hom.{succ u1, u2} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_1)) j₁ j₂) -> (Z j₁) -> (Z j₂)) -> (forall {j₁ : J} {j₂ : J}, (Quiver.Hom.{succ u1, u2} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_1)) j₁ j₂) -> (Z j₂) -> (Z j₁)) -> (forall {j₀ : J}, (Z j₀) -> (forall (j : J), Nonempty.{u3} (Z j)))
+but is expected to have type
+  forall {J : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u2, u3} J] [_inst_3 : CategoryTheory.IsPreconnected.{u2, u3} J _inst_1] (Z : J -> Sort.{u1}), (forall {j₁ : J} {j₂ : J}, (Quiver.Hom.{succ u2, u3} J (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} J (CategoryTheory.Category.toCategoryStruct.{u2, u3} J _inst_1)) j₁ j₂) -> (Z j₁) -> (Z j₂)) -> (forall {j₁ : J} {j₂ : J}, (Quiver.Hom.{succ u2, u3} J (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} J (CategoryTheory.Category.toCategoryStruct.{u2, u3} J _inst_1)) j₁ j₂) -> (Z j₂) -> (Z j₁)) -> (forall {j₀ : J}, (Z j₀) -> (forall (j : J), Nonempty.{u1} (Z j)))
+Case conversion may be inaccurate. Consider using '#align category_theory.is_preconnected_induction CategoryTheory.isPreconnected_inductionₓ'. -/
 /-- Another induction principle for `is_preconnected J`:
 given a type family `Z : J → Sort*` and
 a rule for transporting in *both* directions along a morphism in `J`,
@@ -214,6 +250,12 @@ theorem isPreconnected_induction [IsPreconnected J] (Z : J → Sort _)
     _)
 #align category_theory.is_preconnected_induction CategoryTheory.isPreconnected_induction
 
+/- warning: category_theory.is_preconnected_of_equivalent -> CategoryTheory.isPreconnected_of_equivalent is a dubious translation:
+lean 3 declaration is
+  forall {J : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} J] {K : Type.{u3}} [_inst_3 : CategoryTheory.Category.{u2, u3} K] [_inst_4 : CategoryTheory.IsPreconnected.{u1, u3} J _inst_1], (CategoryTheory.Equivalence.{u1, u2, u3, u3} J _inst_1 K _inst_3) -> (CategoryTheory.IsPreconnected.{u2, u3} K _inst_3)
+but is expected to have type
+  forall {J : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} J] {K : Type.{u3}} [_inst_3 : CategoryTheory.Category.{u2, u3} K] [_inst_4 : CategoryTheory.IsPreconnected.{u1, u3} J _inst_1], (CategoryTheory.Equivalence.{u1, u2, u3, u3} J K _inst_1 _inst_3) -> (CategoryTheory.IsPreconnected.{u2, u3} K _inst_3)
+Case conversion may be inaccurate. Consider using '#align category_theory.is_preconnected_of_equivalent CategoryTheory.isPreconnected_of_equivalentₓ'. -/
 /-- If `J` and `K` are equivalent, then if `J` is preconnected then `K` is as well. -/
 theorem isPreconnected_of_equivalent {K : Type u₁} [Category.{v₂} K] [IsPreconnected J]
     (e : J ≌ K) : IsPreconnected K :=
@@ -229,6 +271,12 @@ theorem isPreconnected_of_equivalent {K : Type u₁} [Category.{v₂} K] [IsPrec
           ⟩ }
 #align category_theory.is_preconnected_of_equivalent CategoryTheory.isPreconnected_of_equivalent
 
+/- warning: category_theory.is_connected_of_equivalent -> CategoryTheory.isConnected_of_equivalent is a dubious translation:
+lean 3 declaration is
+  forall {J : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} J] {K : Type.{u3}} [_inst_3 : CategoryTheory.Category.{u2, u3} K], (CategoryTheory.Equivalence.{u1, u2, u3, u3} J _inst_1 K _inst_3) -> (forall [_inst_4 : CategoryTheory.IsConnected.{u1, u3} J _inst_1], CategoryTheory.IsConnected.{u2, u3} K _inst_3)
+but is expected to have type
+  forall {J : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} J] {K : Type.{u3}} [_inst_3 : CategoryTheory.Category.{u2, u3} K], (CategoryTheory.Equivalence.{u1, u2, u3, u3} J K _inst_1 _inst_3) -> (forall [_inst_4 : CategoryTheory.IsConnected.{u1, u3} J _inst_1], CategoryTheory.IsConnected.{u2, u3} K _inst_3)
+Case conversion may be inaccurate. Consider using '#align category_theory.is_connected_of_equivalent CategoryTheory.isConnected_of_equivalentₓ'. -/
 /-- If `J` and `K` are equivalent, then if `J` is connected then `K` is as well. -/
 theorem isConnected_of_equivalent {K : Type u₁} [Category.{v₂} K] (e : J ≌ K) [IsConnected J] :
     IsConnected K :=
@@ -236,6 +284,7 @@ theorem isConnected_of_equivalent {K : Type u₁} [Category.{v₂} K] (e : J ≌
     to_isPreconnected := isPreconnected_of_equivalent e }
 #align category_theory.is_connected_of_equivalent CategoryTheory.isConnected_of_equivalent
 
+#print CategoryTheory.isPreconnected_op /-
 /-- If `J` is preconnected, then `Jᵒᵖ` is preconnected as well. -/
 instance isPreconnected_op [IsPreconnected J] : IsPreconnected Jᵒᵖ
     where iso_constant α F X :=
@@ -250,29 +299,41 @@ instance isPreconnected_op [IsPreconnected J] : IsPreconnected Jᵒᵖ
                     (unop Y)).Hom)))
         fun Y Z f => Subsingleton.elim _ _⟩
 #align category_theory.is_preconnected_op CategoryTheory.isPreconnected_op
+-/
 
+#print CategoryTheory.isConnected_op /-
 /-- If `J` is connected, then `Jᵒᵖ` is connected as well. -/
 instance isConnected_op [IsConnected J] : IsConnected Jᵒᵖ
     where is_nonempty := Nonempty.intro (op (Classical.arbitrary J))
 #align category_theory.is_connected_op CategoryTheory.isConnected_op
+-/
 
+#print CategoryTheory.isPreconnected_of_isPreconnected_op /-
 theorem isPreconnected_of_isPreconnected_op [IsPreconnected Jᵒᵖ] : IsPreconnected J :=
   isPreconnected_of_equivalent (opOpEquivalence J)
 #align category_theory.is_preconnected_of_is_preconnected_op CategoryTheory.isPreconnected_of_isPreconnected_op
+-/
 
+#print CategoryTheory.isConnected_of_isConnected_op /-
 theorem isConnected_of_isConnected_op [IsConnected Jᵒᵖ] : IsConnected J :=
   isConnected_of_equivalent (opOpEquivalence J)
 #align category_theory.is_connected_of_is_connected_op CategoryTheory.isConnected_of_isConnected_op
+-/
 
+#print CategoryTheory.Zag /-
 /-- j₁ and j₂ are related by `zag` if there is a morphism between them. -/
 @[reducible]
 def Zag (j₁ j₂ : J) : Prop :=
   Nonempty (j₁ ⟶ j₂) ∨ Nonempty (j₂ ⟶ j₁)
 #align category_theory.zag CategoryTheory.Zag
+-/
 
+#print CategoryTheory.zag_symmetric /-
 theorem zag_symmetric : Symmetric (@Zag J _) := fun j₂ j₁ h => h.symm
 #align category_theory.zag_symmetric CategoryTheory.zag_symmetric
+-/
 
+#print CategoryTheory.Zigzag /-
 /-- `j₁` and `j₂` are related by `zigzag` if there is a chain of
 morphisms from `j₁` to `j₂`, with backward morphisms allowed.
 -/
@@ -280,15 +341,21 @@ morphisms from `j₁` to `j₂`, with backward morphisms allowed.
 def Zigzag : J → J → Prop :=
   Relation.ReflTransGen Zag
 #align category_theory.zigzag CategoryTheory.Zigzag
+-/
 
+#print CategoryTheory.zigzag_symmetric /-
 theorem zigzag_symmetric : Symmetric (@Zigzag J _) :=
   Relation.ReflTransGen.symmetric zag_symmetric
 #align category_theory.zigzag_symmetric CategoryTheory.zigzag_symmetric
+-/
 
+#print CategoryTheory.zigzag_equivalence /-
 theorem zigzag_equivalence : Equivalence (@Zigzag J _) :=
   Equivalence.mk _ Relation.reflexive_reflTransGen zigzag_symmetric Relation.transitive_reflTransGen
 #align category_theory.zigzag_equivalence CategoryTheory.zigzag_equivalence
+-/
 
+#print CategoryTheory.Zigzag.setoid /-
 /-- The setoid given by the equivalence relation `zigzag`. A quotient for this
 setoid is a connected component of the category.
 -/
@@ -297,7 +364,14 @@ def Zigzag.setoid (J : Type u₂) [Category.{v₁} J] : Setoid J
   R := Zigzag
   iseqv := zigzag_equivalence
 #align category_theory.zigzag.setoid CategoryTheory.Zigzag.setoid
+-/
 
+/- warning: category_theory.zigzag_obj_of_zigzag -> CategoryTheory.zigzag_obj_of_zigzag is a dubious translation:
+lean 3 declaration is
+  forall {J : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} J] {K : Type.{u4}} [_inst_2 : CategoryTheory.Category.{u2, u4} K] (F : CategoryTheory.Functor.{u1, u2, u3, u4} J _inst_1 K _inst_2) {j₁ : J} {j₂ : J}, (CategoryTheory.Zigzag.{u1, u3} J _inst_1 j₁ j₂) -> (CategoryTheory.Zigzag.{u2, u4} K _inst_2 (CategoryTheory.Functor.obj.{u1, u2, u3, u4} J _inst_1 K _inst_2 F j₁) (CategoryTheory.Functor.obj.{u1, u2, u3, u4} J _inst_1 K _inst_2 F j₂))
+but is expected to have type
+  forall {J : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} J] {K : Type.{u4}} [_inst_2 : CategoryTheory.Category.{u2, u4} K] (F : CategoryTheory.Functor.{u1, u2, u3, u4} J _inst_1 K _inst_2) {j₁ : J} {j₂ : J}, (CategoryTheory.Zigzag.{u1, u3} J _inst_1 j₁ j₂) -> (CategoryTheory.Zigzag.{u2, u4} K _inst_2 (Prefunctor.obj.{succ u1, succ u2, u3, u4} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u3} J (CategoryTheory.Category.toCategoryStruct.{u1, u3} J _inst_1)) K (CategoryTheory.CategoryStruct.toQuiver.{u2, u4} K (CategoryTheory.Category.toCategoryStruct.{u2, u4} K _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u3, u4} J _inst_1 K _inst_2 F) j₁) (Prefunctor.obj.{succ u1, succ u2, u3, u4} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u3} J (CategoryTheory.Category.toCategoryStruct.{u1, u3} J _inst_1)) K (CategoryTheory.CategoryStruct.toQuiver.{u2, u4} K (CategoryTheory.Category.toCategoryStruct.{u2, u4} K _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u3, u4} J _inst_1 K _inst_2 F) j₂))
+Case conversion may be inaccurate. Consider using '#align category_theory.zigzag_obj_of_zigzag CategoryTheory.zigzag_obj_of_zigzagₓ'. -/
 /-- If there is a zigzag from `j₁` to `j₂`, then there is a zigzag from `F j₁` to
 `F j₂` as long as `F` is a functor.
 -/
@@ -306,12 +380,19 @@ theorem zigzag_obj_of_zigzag (F : J ⥤ K) {j₁ j₂ : J} (h : Zigzag j₁ j₂
   h.lift _ fun j k => Or.imp (Nonempty.map fun f => F.map f) (Nonempty.map fun f => F.map f)
 #align category_theory.zigzag_obj_of_zigzag CategoryTheory.zigzag_obj_of_zigzag
 
+/- warning: category_theory.zag_of_zag_obj -> CategoryTheory.zag_of_zag_obj is a dubious translation:
+lean 3 declaration is
+  forall {J : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} J] {K : Type.{u4}} [_inst_2 : CategoryTheory.Category.{u2, u4} K] (F : CategoryTheory.Functor.{u1, u2, u3, u4} J _inst_1 K _inst_2) [_inst_3 : CategoryTheory.Full.{u1, u2, u3, u4} J _inst_1 K _inst_2 F] {j₁ : J} {j₂ : J}, (CategoryTheory.Zag.{u2, u4} K _inst_2 (CategoryTheory.Functor.obj.{u1, u2, u3, u4} J _inst_1 K _inst_2 F j₁) (CategoryTheory.Functor.obj.{u1, u2, u3, u4} J _inst_1 K _inst_2 F j₂)) -> (CategoryTheory.Zag.{u1, u3} J _inst_1 j₁ j₂)
+but is expected to have type
+  forall {J : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} J] {K : Type.{u4}} [_inst_2 : CategoryTheory.Category.{u2, u4} K] (F : CategoryTheory.Functor.{u1, u2, u3, u4} J _inst_1 K _inst_2) [_inst_3 : CategoryTheory.Full.{u1, u2, u3, u4} J _inst_1 K _inst_2 F] {j₁ : J} {j₂ : J}, (CategoryTheory.Zag.{u2, u4} K _inst_2 (Prefunctor.obj.{succ u1, succ u2, u3, u4} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u3} J (CategoryTheory.Category.toCategoryStruct.{u1, u3} J _inst_1)) K (CategoryTheory.CategoryStruct.toQuiver.{u2, u4} K (CategoryTheory.Category.toCategoryStruct.{u2, u4} K _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u3, u4} J _inst_1 K _inst_2 F) j₁) (Prefunctor.obj.{succ u1, succ u2, u3, u4} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u3} J (CategoryTheory.Category.toCategoryStruct.{u1, u3} J _inst_1)) K (CategoryTheory.CategoryStruct.toQuiver.{u2, u4} K (CategoryTheory.Category.toCategoryStruct.{u2, u4} K _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u3, u4} J _inst_1 K _inst_2 F) j₂)) -> (CategoryTheory.Zag.{u1, u3} J _inst_1 j₁ j₂)
+Case conversion may be inaccurate. Consider using '#align category_theory.zag_of_zag_obj CategoryTheory.zag_of_zag_objₓ'. -/
 -- TODO: figure out the right way to generalise this to `zigzag`.
 theorem zag_of_zag_obj (F : J ⥤ K) [Full F] {j₁ j₂ : J} (h : Zag (F.obj j₁) (F.obj j₂)) :
     Zag j₁ j₂ :=
   Or.imp (Nonempty.map F.Preimage) (Nonempty.map F.Preimage) h
 #align category_theory.zag_of_zag_obj CategoryTheory.zag_of_zag_obj
 
+#print CategoryTheory.equiv_relation /-
 /-- Any equivalence relation containing (⟶) holds for all pairs of a connected category. -/
 theorem equiv_relation [IsConnected J] (r : J → J → Prop) (hr : Equivalence r)
     (h : ∀ {j₁ j₂ : J} (f : j₁ ⟶ j₂), r j₁ j₂) : ∀ j₁ j₂ : J, r j₁ j₂ :=
@@ -321,13 +402,17 @@ theorem equiv_relation [IsConnected J] (r : J → J → Prop) (hr : Equivalence
       fun _ _ f => ⟨fun t => hr.2.2 t (h f), fun t => hr.2.2 t (hr.2.1 (h f))⟩
   intros ; apply hr.2.2 (hr.2.1 (z _)) (z _)
 #align category_theory.equiv_relation CategoryTheory.equiv_relation
+-/
 
+#print CategoryTheory.isConnected_zigzag /-
 /-- In a connected category, any two objects are related by `zigzag`. -/
 theorem isConnected_zigzag [IsConnected J] (j₁ j₂ : J) : Zigzag j₁ j₂ :=
   equiv_relation _ zigzag_equivalence
     (fun _ _ f => Relation.ReflTransGen.single (Or.inl (Nonempty.intro f))) _ _
 #align category_theory.is_connected_zigzag CategoryTheory.isConnected_zigzag
+-/
 
+#print CategoryTheory.zigzag_isConnected /-
 /-- If any two objects in an nonempty category are related by `zigzag`, the category is connected.
 -/
 theorem zigzag_isConnected [Nonempty J] (h : ∀ j₁ j₂ : J, Zigzag j₁ j₂) : IsConnected J :=
@@ -345,12 +430,16 @@ theorem zigzag_isConnected [Nonempty J] (h : ∀ j₁ j₂ : J, Zigzag j₁ j₂
       apply (hjp zag).symm
   rwa [this j (Classical.arbitrary J) (h _ _)]
 #align category_theory.zigzag_is_connected CategoryTheory.zigzag_isConnected
+-/
 
+#print CategoryTheory.exists_zigzag' /-
 theorem exists_zigzag' [IsConnected J] (j₁ j₂ : J) :
     ∃ l, List.Chain Zag j₁ l ∧ List.getLast (j₁ :: l) (List.cons_ne_nil _ _) = j₂ :=
   List.exists_chain_of_relationReflTransGen (isConnected_zigzag _ _)
 #align category_theory.exists_zigzag' CategoryTheory.exists_zigzag'
+-/
 
+#print CategoryTheory.isConnected_of_zigzag /-
 /-- If any two objects in an nonempty category are linked by a sequence of (potentially reversed)
 morphisms, then J is connected.
 
@@ -365,7 +454,9 @@ theorem isConnected_of_zigzag [Nonempty J]
   rcases h j₁ j₂ with ⟨l, hl₁, hl₂⟩
   apply List.relationReflTransGen_of_exists_chain l hl₁ hl₂
 #align category_theory.is_connected_of_zigzag CategoryTheory.isConnected_of_zigzag
+-/
 
+#print CategoryTheory.discreteIsConnectedEquivPunit /-
 /-- If `discrete α` is connected, then `α` is (type-)equivalent to `punit`. -/
 def discreteIsConnectedEquivPunit {α : Type u₁} [IsConnected (Discrete α)] : α ≃ PUnit :=
   Discrete.equivOfEquivalence.{u₁, u₁}
@@ -374,9 +465,16 @@ def discreteIsConnectedEquivPunit {α : Type u₁} [IsConnected (Discrete α)] :
       unitIso := iso_constant _ (Classical.arbitrary _)
       counitIso := Functor.pUnitExt _ _ }
 #align category_theory.discrete_is_connected_equiv_punit CategoryTheory.discreteIsConnectedEquivPunit
+-/
 
 variable {C : Type u₂} [Category.{u₁} C]
 
+/- warning: category_theory.nat_trans_from_is_connected -> CategoryTheory.nat_trans_from_is_connected is a dubious translation:
+lean 3 declaration is
+  forall {J : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} J] {C : Type.{u3}} [_inst_3 : CategoryTheory.Category.{u2, u3} C] [_inst_4 : CategoryTheory.IsPreconnected.{u1, u2} J _inst_1] {X : C} {Y : C} (α : Quiver.Hom.{succ u2, max u1 u2 u3} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max u1 u2 u3} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max u1 u2 u3} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (CategoryTheory.Functor.obj.{u2, u2, u3, max u1 u2 u3} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3) X) (CategoryTheory.Functor.obj.{u2, u2, u3, max u1 u2 u3} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3) Y)) (j : J) (j' : J), Eq.{succ u2} (Quiver.Hom.{succ u2, u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.obj.{u1, u2, u2, u3} J _inst_1 C _inst_3 (CategoryTheory.Functor.obj.{u2, u2, u3, max u1 u2 u3} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3) X) j) (CategoryTheory.Functor.obj.{u1, u2, u2, u3} J _inst_1 C _inst_3 (CategoryTheory.Functor.obj.{u2, u2, u3, max u1 u2 u3} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3) Y) j)) (CategoryTheory.NatTrans.app.{u1, u2, u2, u3} J _inst_1 C _inst_3 (CategoryTheory.Functor.obj.{u2, u2, u3, max u1 u2 u3} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3) X) (CategoryTheory.Functor.obj.{u2, u2, u3, max u1 u2 u3} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3) Y) α j) (CategoryTheory.NatTrans.app.{u1, u2, u2, u3} J _inst_1 C _inst_3 (CategoryTheory.Functor.obj.{u2, u2, u3, max u1 u2 u3} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3) X) (CategoryTheory.Functor.obj.{u2, u2, u3, max u1 u2 u3} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3) Y) α j')
+but is expected to have type
+  forall {J : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} J] {C : Type.{u3}} [_inst_3 : CategoryTheory.Category.{u2, u3} C] [_inst_4 : CategoryTheory.IsPreconnected.{u1, u2} J _inst_1] {X : C} {Y : C} (α : Quiver.Hom.{succ u2, max (max u2 u1) u3} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max (max u2 u3) u1} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max (max u2 u3) u1} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (Prefunctor.obj.{succ u2, succ u2, u3, max (max u2 u1) u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u2, u2, u3, max (max (max u2 u1) u3) u2} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3)) X) (Prefunctor.obj.{succ u2, succ u2, u3, max (max u2 u1) u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u2, u2, u3, max (max (max u2 u1) u3) u2} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3)) Y)) (j : J) (j' : J), Eq.{succ u2} (Quiver.Hom.{succ u2, u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (Prefunctor.obj.{succ u1, succ u2, u2, u3} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_1)) C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u2, u3} J _inst_1 C _inst_3 (Prefunctor.obj.{succ u2, succ u2, u3, max (max u2 u1) u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u2, u2, u3, max (max (max u2 u1) u3) u2} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3)) X)) j) (Prefunctor.obj.{succ u1, succ u2, u2, u3} J (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} J (CategoryTheory.Category.toCategoryStruct.{u1, u2} J _inst_1)) C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.toPrefunctor.{u1, u2, u2, u3} J _inst_1 C _inst_3 (Prefunctor.obj.{succ u2, succ u2, u3, max (max u2 u1) u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u2, u2, u3, max (max (max u2 u1) u3) u2} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3)) Y)) j)) (CategoryTheory.NatTrans.app.{u1, u2, u2, u3} J _inst_1 C _inst_3 (Prefunctor.obj.{succ u2, succ u2, u3, max (max u2 u1) u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u2, u2, u3, max (max (max u2 u1) u3) u2} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3)) X) (Prefunctor.obj.{succ u2, succ u2, u3, max (max u2 u1) u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u2, u2, u3, max (max (max u2 u1) u3) u2} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3)) Y) α j) (CategoryTheory.NatTrans.app.{u1, u2, u2, u3} J _inst_1 C _inst_3 (Prefunctor.obj.{succ u2, succ u2, u3, max (max u2 u1) u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u2, u2, u3, max (max (max u2 u1) u3) u2} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3)) X) (Prefunctor.obj.{succ u2, succ u2, u3, max (max u2 u1) u3} C (CategoryTheory.CategoryStruct.toQuiver.{u2, u3} C (CategoryTheory.Category.toCategoryStruct.{u2, u3} C _inst_3)) (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.CategoryStruct.toQuiver.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Category.toCategoryStruct.{u2, max (max (max u2 u1) u3) u2} (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3))) (CategoryTheory.Functor.toPrefunctor.{u2, u2, u3, max (max (max u2 u1) u3) u2} C _inst_3 (CategoryTheory.Functor.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.category.{u1, u2, u2, u3} J _inst_1 C _inst_3) (CategoryTheory.Functor.const.{u1, u2, u2, u3} J _inst_1 C _inst_3)) Y) α j')
+Case conversion may be inaccurate. Consider using '#align category_theory.nat_trans_from_is_connected CategoryTheory.nat_trans_from_is_connectedₓ'. -/
 /-- For objects `X Y : C`, any natural transformation `α : const X ⟶ const Y` from a connected
 category must be constant.
 This is the key property of connected categories which we use to establish properties about limits.
@@ -398,6 +496,7 @@ instance [IsConnected J] : Full (Functor.const J : C ⥤ J ⥤ C)
     ext j
     apply nat_trans_from_is_connected f (Classical.arbitrary J) j
 
+#print CategoryTheory.nonempty_hom_of_connected_groupoid /-
 instance nonempty_hom_of_connected_groupoid {G} [Groupoid G] [IsConnected G] :
     ∀ x y : G, Nonempty (x ⟶ y) :=
   by
@@ -405,6 +504,7 @@ instance nonempty_hom_of_connected_groupoid {G} [Groupoid G] [IsConnected G] :
   exact
     ⟨fun j => ⟨𝟙 _⟩, fun j₁ j₂ => Nonempty.map fun f => inv f, fun _ _ _ => Nonempty.map2 (· ≫ ·)⟩
 #align category_theory.nonempty_hom_of_connected_groupoid CategoryTheory.nonempty_hom_of_connected_groupoid
+-/
 
 end CategoryTheory
 
Diff
@@ -222,9 +222,9 @@ theorem isPreconnected_of_equivalent {K : Type u₁} [Category.{v₂} K] [IsPrec
       ⟨calc
           F ≅ e.inverse ⋙ e.Functor ⋙ F := (e.invFunIdAssoc F).symm
           _ ≅ e.inverse ⋙ (Functor.const J).obj ((e.Functor ⋙ F).obj (e.inverse.obj k)) :=
-            isoWhiskerLeft e.inverse (isoConstant (e.Functor ⋙ F) (e.inverse.obj k))
+            (isoWhiskerLeft e.inverse (isoConstant (e.Functor ⋙ F) (e.inverse.obj k)))
           _ ≅ e.inverse ⋙ (Functor.const J).obj (F.obj k) :=
-            isoWhiskerLeft _ ((F ⋙ Functor.const J).mapIso (e.counitIso.app k))
+            (isoWhiskerLeft _ ((F ⋙ Functor.const J).mapIso (e.counitIso.app k)))
           _ ≅ (Functor.const K).obj (F.obj k) := NatIso.ofComponents (fun X => Iso.refl _) (by simp)
           ⟩ }
 #align category_theory.is_preconnected_of_equivalent CategoryTheory.isPreconnected_of_equivalent
Diff
@@ -372,7 +372,7 @@ def discreteIsConnectedEquivPunit {α : Type u₁} [IsConnected (Discrete α)] :
     { Functor := Functor.star (Discrete α)
       inverse := Discrete.functor fun _ => Classical.arbitrary _
       unitIso := iso_constant _ (Classical.arbitrary _)
-      counitIso := Functor.punitExt _ _ }
+      counitIso := Functor.pUnitExt _ _ }
 #align category_theory.discrete_is_connected_equiv_punit CategoryTheory.discreteIsConnectedEquivPunit
 
 variable {C : Type u₂} [Category.{u₁} C]

Changes in mathlib4

mathlib3
mathlib4
chore: adapt to multiple goal linter 1 (#12338)

A PR accompanying #12339.

Zulip discussion

Diff
@@ -210,13 +210,13 @@ theorem IsConnected.of_induct [Nonempty J] {j₀ : J}
 instance [hc : IsConnected J] : IsConnected (ULiftHom.{v₂} (ULift.{u₂} J)) := by
   have : Nonempty (ULiftHom.{v₂} (ULift.{u₂} J)) := by simp [ULiftHom, hc.is_nonempty]
   apply IsConnected.of_induct
-  rintro p hj₀ h ⟨j⟩
-  let p' : Set J := {j : J | p ⟨j⟩}
-  have hj₀' : Classical.choice hc.is_nonempty ∈ p' := by
-    simp only [p', (eq_self p')]
-    exact hj₀
-  apply induct_on_objects p' hj₀' @fun _ _ f =>
-    h ((ULiftHomULiftCategory.equiv J).functor.map f)
+  · rintro p hj₀ h ⟨j⟩
+    let p' : Set J := {j : J | p ⟨j⟩}
+    have hj₀' : Classical.choice hc.is_nonempty ∈ p' := by
+      simp only [p', (eq_self p')]
+      exact hj₀
+    apply induct_on_objects p' hj₀' @fun _ _ f =>
+      h ((ULiftHomULiftCategory.equiv J).functor.map f)
 
 /-- Another induction principle for `IsPreconnected J`:
 given a type family `Z : J → Sort*` and
chore(CategoryTheory): make Functor.Full a Prop (#12449)

Before this PR, Functor.Full contained the data of the preimage of maps by a full functor F. This PR makes Functor.Full a proposition. This is to prevent any diamond to appear.

The lemma Functor.image_preimage is also renamed Functor.map_preimage.

Co-authored-by: Joël Riou <37772949+joelriou@users.noreply.github.com>

Diff
@@ -461,10 +461,9 @@ theorem nat_trans_from_is_connected [IsPreconnected J] {X Y : C}
 #align category_theory.nat_trans_from_is_connected CategoryTheory.nat_trans_from_is_connected
 
 instance [IsConnected J] : (Functor.const J : C ⥤ J ⥤ C).Full where
-  preimage f := f.app (Classical.arbitrary J)
-  witness f := by
+  map_surjective f := ⟨f.app (Classical.arbitrary J), by
     ext j
-    apply nat_trans_from_is_connected f (Classical.arbitrary J) j
+    apply nat_trans_from_is_connected f (Classical.arbitrary J) j⟩
 
 theorem nonempty_hom_of_preconnected_groupoid {G} [Groupoid G] [IsPreconnected G] :
     ∀ x y : G, Nonempty (x ⟶ y) := by
chore(CategoryTheory): move Full, Faithful, EssSurj, IsEquivalence and ReflectsIsomorphisms to the Functor namespace (#11985)

These notions on functors are now Functor.Full, Functor.Faithful, Functor.EssSurj, Functor.IsEquivalence, Functor.ReflectsIsomorphisms. Deprecated aliases are introduced for the previous names.

Diff
@@ -367,7 +367,7 @@ theorem zigzag_obj_of_zigzag (F : J ⥤ K) {j₁ j₂ : J} (h : Zigzag j₁ j₂
 #align category_theory.zigzag_obj_of_zigzag CategoryTheory.zigzag_obj_of_zigzag
 
 -- TODO: figure out the right way to generalise this to `Zigzag`.
-theorem zag_of_zag_obj (F : J ⥤ K) [Full F] {j₁ j₂ : J} (h : Zag (F.obj j₁) (F.obj j₂)) :
+theorem zag_of_zag_obj (F : J ⥤ K) [F.Full] {j₁ j₂ : J} (h : Zag (F.obj j₁) (F.obj j₂)) :
     Zag j₁ j₂ :=
   Or.imp (Nonempty.map F.preimage) (Nonempty.map F.preimage) h
 #align category_theory.zag_of_zag_obj CategoryTheory.zag_of_zag_obj
@@ -460,7 +460,7 @@ theorem nat_trans_from_is_connected [IsPreconnected J] {X Y : C}
     exact this.symm
 #align category_theory.nat_trans_from_is_connected CategoryTheory.nat_trans_from_is_connected
 
-instance [IsConnected J] : Full (Functor.const J : C ⥤ J ⥤ C) where
+instance [IsConnected J] : (Functor.const J : C ⥤ J ⥤ C).Full where
   preimage f := f.app (Classical.arbitrary J)
   witness f := by
     ext j
chore: Remove Init.Propext (#10709)

These lemmas can easily go to Logic.Basic

Diff
@@ -185,7 +185,7 @@ The converse is given in `IsConnected.of_induct`.
 -/
 theorem induct_on_objects [IsPreconnected J] (p : Set J) {j₀ : J} (h0 : j₀ ∈ p)
     (h1 : ∀ {j₁ j₂ : J} (_ : j₁ ⟶ j₂), j₁ ∈ p ↔ j₂ ∈ p) (j : J) : j ∈ p := by
-  let aux (j₁ j₂ : J) (f : j₁ ⟶ j₂) := congrArg ULift.up <| (h1 f).to_eq
+  let aux (j₁ j₂ : J) (f : j₁ ⟶ j₂) := congrArg ULift.up <| (h1 f).eq
   injection constant_of_preserves_morphisms (fun k => ULift.up.{u₁} (k ∈ p)) aux j j₀ with i
   rwa [i]
 #align category_theory.induct_on_objects CategoryTheory.induct_on_objects
feat(CategoryTheory/Sites): add some API for regular sheaves and the equalizer condition (#10420)

This PR gives an equivalent condition to regularTopology.EqualizerCondition (previously called regularCoverage.EqualizerCondition), phrased in more categorical language. We use this new condition to show that EqualizerCondition respects natural isomorphisms.

Co-authored-by: faenuccio <filippo.nuccio@univ-st-etienne.fr> Co-authored-by: Joël Riou <joel.riou@universite-paris-saclay.fr>

Diff
@@ -319,6 +319,10 @@ theorem zigzag_equivalence : _root_.Equivalence (@Zigzag J _) :=
   (fun h g => Relation.transitive_reflTransGen h g)
 #align category_theory.zigzag_equivalence CategoryTheory.zigzag_equivalence
 
+theorem Zigzag.refl (X : J) : Zigzag X X := zigzag_equivalence.refl _
+
+theorem Zigzag.symm {j₁ j₂ : J} (h : Zigzag j₁ j₂) : Zigzag j₂ j₁ := zigzag_symmetric h
+
 theorem Zigzag.trans {j₁ j₂ j₃ : J} (h₁ : Zigzag j₁ j₂) (h₂ : Zigzag j₂ j₃) : Zigzag j₁ j₃ :=
   zigzag_equivalence.trans h₁ h₂
 
chore(CategoryTheory): add some trivial API lemmas for Zag and Zigzag (#11696)
Diff
@@ -288,18 +288,24 @@ theorem isConnected_of_isConnected_op [IsConnected Jᵒᵖ] : IsConnected J :=
 #align category_theory.is_connected_of_is_connected_op CategoryTheory.isConnected_of_isConnected_op
 
 /-- j₁ and j₂ are related by `Zag` if there is a morphism between them. -/
-@[reducible]
 def Zag (j₁ j₂ : J) : Prop :=
   Nonempty (j₁ ⟶ j₂) ∨ Nonempty (j₂ ⟶ j₁)
 #align category_theory.zag CategoryTheory.Zag
 
+theorem Zag.refl (X : J) : Zag X X := Or.inl ⟨𝟙 _⟩
+
 theorem zag_symmetric : Symmetric (@Zag J _) := fun _ _ h => h.symm
 #align category_theory.zag_symmetric CategoryTheory.zag_symmetric
 
+theorem Zag.symm {j₁ j₂ : J} (h : Zag j₁ j₂) : Zag j₂ j₁ := zag_symmetric h
+
+theorem Zag.of_hom {j₁ j₂ : J} (f : j₁ ⟶ j₂) : Zag j₁ j₂ := Or.inl ⟨f⟩
+
+theorem Zag.of_inv {j₁ j₂ : J} (f : j₂ ⟶ j₁) : Zag j₁ j₂ := Or.inr ⟨f⟩
+
 /-- `j₁` and `j₂` are related by `Zigzag` if there is a chain of
 morphisms from `j₁` to `j₂`, with backward morphisms allowed.
 -/
-@[reducible]
 def Zigzag : J → J → Prop :=
   Relation.ReflTransGen Zag
 #align category_theory.zigzag CategoryTheory.Zigzag
@@ -313,6 +319,33 @@ theorem zigzag_equivalence : _root_.Equivalence (@Zigzag J _) :=
   (fun h g => Relation.transitive_reflTransGen h g)
 #align category_theory.zigzag_equivalence CategoryTheory.zigzag_equivalence
 
+theorem Zigzag.trans {j₁ j₂ j₃ : J} (h₁ : Zigzag j₁ j₂) (h₂ : Zigzag j₂ j₃) : Zigzag j₁ j₃ :=
+  zigzag_equivalence.trans h₁ h₂
+
+theorem Zigzag.of_zag {j₁ j₂ : J} (h : Zag j₁ j₂) : Zigzag j₁ j₂ :=
+  Relation.ReflTransGen.single h
+
+theorem Zigzag.of_hom {j₁ j₂ : J} (f : j₁ ⟶ j₂) : Zigzag j₁ j₂ :=
+  of_zag (Zag.of_hom f)
+
+theorem Zigzag.of_inv {j₁ j₂ : J} (f : j₂ ⟶ j₁) : Zigzag j₁ j₂ :=
+  of_zag (Zag.of_inv f)
+
+theorem Zigzag.of_zag_trans {j₁ j₂ j₃ : J} (h₁ : Zag j₁ j₂) (h₂ : Zag j₂ j₃) : Zigzag j₁ j₃ :=
+  trans (of_zag h₁) (of_zag h₂)
+
+theorem Zigzag.of_hom_hom {j₁ j₂ j₃ : J} (f₁₂ : j₁ ⟶ j₂) (f₂₃ : j₂ ⟶ j₃) : Zigzag j₁ j₃ :=
+  (of_hom f₁₂).trans (of_hom f₂₃)
+
+theorem Zigzag.of_hom_inv {j₁ j₂ j₃ : J} (f₁₂ : j₁ ⟶ j₂) (f₃₂ : j₃ ⟶ j₂) : Zigzag j₁ j₃ :=
+  (of_hom f₁₂).trans (of_inv f₃₂)
+
+theorem Zigzag.of_inv_hom {j₁ j₂ j₃ : J} (f₂₁ : j₂ ⟶ j₁) (f₂₃ : j₂ ⟶ j₃) : Zigzag j₁ j₃ :=
+  (of_inv f₂₁).trans (of_hom f₂₃)
+
+theorem Zigzag.of_inv_inv {j₁ j₂ j₃ : J} (f₂₁ : j₂ ⟶ j₁) (f₃₂ : j₃ ⟶ j₂) : Zigzag j₁ j₃ :=
+  (of_inv f₂₁).trans (of_inv f₃₂)
+
 /-- The setoid given by the equivalence relation `Zigzag`. A quotient for this
 setoid is a connected component of the category.
 -/
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
@@ -81,7 +81,6 @@ class IsConnected (J : Type u₁) [Category.{v₁} J] extends IsPreconnected J :
 attribute [instance 100] IsConnected.is_nonempty
 
 variable {J : Type u₁} [Category.{v₁} J]
-
 variable {K : Type u₂} [Category.{v₂} K]
 
 namespace IsPreconnected.IsoConstantAux
chore: prepare Lean version bump with explicit simp (#10999)

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

Diff
@@ -214,7 +214,7 @@ instance [hc : IsConnected J] : IsConnected (ULiftHom.{v₂} (ULift.{u₂} J)) :
   rintro p hj₀ h ⟨j⟩
   let p' : Set J := {j : J | p ⟨j⟩}
   have hj₀' : Classical.choice hc.is_nonempty ∈ p' := by
-    simp only [(eq_self p')]
+    simp only [p', (eq_self p')]
     exact hj₀
   apply induct_on_objects p' hj₀' @fun _ _ f =>
     h ((ULiftHomULiftCategory.equiv J).functor.map f)
chore: generalize theorems from IsConnected to IsPreconnected (#10713)
Diff
@@ -118,12 +118,19 @@ theorem any_functor_const_on_obj [IsPreconnected J] {α : Type u₂} (F : J ⥤
   ext; exact ((isoConstant F j').hom.app j).down.1
 #align category_theory.any_functor_const_on_obj CategoryTheory.any_functor_const_on_obj
 
+/-- If any functor to a discrete category is constant on objects, J is connected.
+The converse of `any_functor_const_on_obj`.
+-/
+theorem IsPreconnected.of_any_functor_const_on_obj (h : ∀ {α : Type u₁} (F : J ⥤ Discrete α),
+    ∀ j j' : J, F.obj j = F.obj j') : IsPreconnected J where
+  iso_constant := fun F j' => ⟨NatIso.ofComponents fun j => eqToIso (h F j j')⟩
+
 /-- If any functor to a discrete category is constant on objects, J is connected.
 The converse of `any_functor_const_on_obj`.
 -/
 theorem IsConnected.of_any_functor_const_on_obj [Nonempty J]
     (h : ∀ {α : Type u₁} (F : J ⥤ Discrete α), ∀ j j' : J, F.obj j = F.obj j') : IsConnected J :=
-  { iso_constant := fun F j' => ⟨NatIso.ofComponents fun j => eqToIso (h F j j')⟩ }
+  { IsPreconnected.of_any_functor_const_on_obj h with }
 #align category_theory.is_connected.of_any_functor_const_on_obj CategoryTheory.IsConnected.of_any_functor_const_on_obj
 
 /-- If `J` is connected, then given any function `F` such that the presence of a
@@ -149,14 +156,26 @@ theorem constant_of_preserves_morphisms [IsPreconnected J] {α : Type u₂} (F :
 `j₁, j₂` for which there is a morphism `j₁ ⟶ j₂`, then `F` is constant.
 This can be thought of as a local-to-global property.
 
+The converse of `constant_of_preserves_morphisms`.
+-/
+theorem IsPreconnected.of_constant_of_preserves_morphisms
+    (h : ∀ {α : Type u₁} (F : J → α),
+      (∀ {j₁ j₂ : J} (_ : j₁ ⟶ j₂), F j₁ = F j₂) → ∀ j j' : J, F j = F j') :
+    IsPreconnected J :=
+  IsPreconnected.of_any_functor_const_on_obj @fun _ F =>
+    h F.obj fun f => by ext; exact Discrete.eq_of_hom (F.map f)
+
+/-- `J` is connected if: given any function `F : J → α` which is constant for any
+`j₁, j₂` for which there is a morphism `j₁ ⟶ j₂`, then `F` is constant.
+This can be thought of as a local-to-global property.
+
 The converse of `constant_of_preserves_morphisms`.
 -/
 theorem IsConnected.of_constant_of_preserves_morphisms [Nonempty J]
     (h : ∀ {α : Type u₁} (F : J → α),
       (∀ {j₁ j₂ : J} (_ : j₁ ⟶ j₂), F j₁ = F j₂) → ∀ j j' : J, F j = F j') :
     IsConnected J :=
-  IsConnected.of_any_functor_const_on_obj @fun _ F =>
-    h F.obj fun f => by ext; exact Discrete.eq_of_hom (F.map f)
+  { IsPreconnected.of_constant_of_preserves_morphisms h with }
 #align category_theory.is_connected.of_constant_of_preserves_morphisms CategoryTheory.IsConnected.of_constant_of_preserves_morphisms
 
 /-- An inductive-like property for the objects of a connected category.
@@ -318,40 +337,43 @@ theorem zag_of_zag_obj (F : J ⥤ K) [Full F] {j₁ j₂ : J} (h : Zag (F.obj j
 #align category_theory.zag_of_zag_obj CategoryTheory.zag_of_zag_obj
 
 /-- Any equivalence relation containing (⟶) holds for all pairs of a connected category. -/
-theorem equiv_relation [IsConnected J] (r : J → J → Prop) (hr : _root_.Equivalence r)
+theorem equiv_relation [IsPreconnected J] (r : J → J → Prop) (hr : _root_.Equivalence r)
     (h : ∀ {j₁ j₂ : J} (_ : j₁ ⟶ j₂), r j₁ j₂) : ∀ j₁ j₂ : J, r j₁ j₂ := by
-  have z : ∀ j : J, r (Classical.arbitrary J) j :=
-    induct_on_objects {k | r (Classical.arbitrary J) k} (hr.1 (Classical.arbitrary J))
+  intros j₁ j₂
+  have z : ∀ j : J, r j₁ j :=
+    induct_on_objects {k | r j₁ k} (hr.1 j₁)
       fun f => ⟨fun t => hr.3 t (h f), fun t => hr.3 t (hr.2 (h f))⟩
-  intros
-  apply hr.3 (hr.2 (z _)) (z _)
+  exact z j₂
 #align category_theory.equiv_relation CategoryTheory.equiv_relation
 
 /-- In a connected category, any two objects are related by `Zigzag`. -/
-theorem isConnected_zigzag [IsConnected J] (j₁ j₂ : J) : Zigzag j₁ j₂ :=
+theorem isPreconnected_zigzag [IsPreconnected J] (j₁ j₂ : J) : Zigzag j₁ j₂ :=
   equiv_relation _ zigzag_equivalence
     (@fun _ _ f => Relation.ReflTransGen.single (Or.inl (Nonempty.intro f))) _ _
-#align category_theory.is_connected_zigzag CategoryTheory.isConnected_zigzag
+#align category_theory.is_connected_zigzag CategoryTheory.isPreconnected_zigzag
+
+-- deprecated on 2024-02-19
+@[deprecated] alias isConnected_zigzag := isPreconnected_zigzag
+
+theorem zigzag_isPreconnected (h : ∀ j₁ j₂ : J, Zigzag j₁ j₂) : IsPreconnected J := by
+  apply IsPreconnected.of_constant_of_preserves_morphisms
+  intro α F hF j j'
+  specialize h j j'
+  induction' h with j₁ j₂ _ hj ih
+  · rfl
+  · rw [ih]
+    rcases hj with (⟨⟨hj⟩⟩|⟨⟨hj⟩⟩)
+    exacts [hF hj, (hF hj).symm]
 
 /-- If any two objects in a nonempty category are related by `Zigzag`, the category is connected.
 -/
-theorem zigzag_isConnected [Nonempty J] (h : ∀ j₁ j₂ : J, Zigzag j₁ j₂) : IsConnected J := by
-  apply IsConnected.of_induct
-  intro p hp hjp j
-  have : ∀ j₁ j₂ : J, Zigzag j₁ j₂ → (j₁ ∈ p ↔ j₂ ∈ p) := by
-    introv k
-    induction' k with _ _ _ zag k_ih
-    · rfl
-    · rw [k_ih]
-      cases' zag with zag zag
-      apply hjp (Nonempty.some zag)
-      exact (hjp (Nonempty.some zag)).symm
-  rwa [this j (Classical.arbitrary J) (h _ _)]
+theorem zigzag_isConnected [Nonempty J] (h : ∀ j₁ j₂ : J, Zigzag j₁ j₂) : IsConnected J :=
+  { zigzag_isPreconnected h with }
 #align category_theory.zigzag_is_connected CategoryTheory.zigzag_isConnected
 
 theorem exists_zigzag' [IsConnected J] (j₁ j₂ : J) :
     ∃ l, List.Chain Zag j₁ l ∧ List.getLast (j₁ :: l) (List.cons_ne_nil _ _) = j₂ :=
-  List.exists_chain_of_relationReflTransGen (isConnected_zigzag _ _)
+  List.exists_chain_of_relationReflTransGen (isPreconnected_zigzag _ _)
 #align category_theory.exists_zigzag' CategoryTheory.exists_zigzag'
 
 /-- If any two objects in a nonempty category are linked by a sequence of (potentially reversed)
@@ -359,13 +381,23 @@ morphisms, then J is connected.
 
 The converse of `exists_zigzag'`.
 -/
-theorem isConnected_of_zigzag [Nonempty J] (h : ∀ j₁ j₂ : J, ∃ l,
+theorem isPreconnected_of_zigzag (h : ∀ j₁ j₂ : J, ∃ l,
     List.Chain Zag j₁ l ∧ List.getLast (j₁ :: l) (List.cons_ne_nil _ _) = j₂) :
-    IsConnected J := by
-  apply zigzag_isConnected
+    IsPreconnected J := by
+  apply zigzag_isPreconnected
   intro j₁ j₂
   rcases h j₁ j₂ with ⟨l, hl₁, hl₂⟩
   apply List.relationReflTransGen_of_exists_chain l hl₁ hl₂
+
+/-- If any two objects in a nonempty category are linked by a sequence of (potentially reversed)
+morphisms, then J is connected.
+
+The converse of `exists_zigzag'`.
+-/
+theorem isConnected_of_zigzag [Nonempty J] (h : ∀ j₁ j₂ : J, ∃ l,
+    List.Chain Zag j₁ l ∧ List.getLast (j₁ :: l) (List.cons_ne_nil _ _) = j₂) :
+    IsConnected J :=
+  { isPreconnected_of_zigzag h with }
 #align category_theory.is_connected_of_zigzag CategoryTheory.isConnected_of_zigzag
 
 /-- If `Discrete α` is connected, then `α` is (type-)equivalent to `PUnit`. -/
@@ -398,11 +430,16 @@ instance [IsConnected J] : Full (Functor.const J : C ⥤ J ⥤ C) where
     ext j
     apply nat_trans_from_is_connected f (Classical.arbitrary J) j
 
-instance nonempty_hom_of_connected_groupoid {G} [Groupoid G] [IsConnected G] :
+theorem nonempty_hom_of_preconnected_groupoid {G} [Groupoid G] [IsPreconnected G] :
     ∀ x y : G, Nonempty (x ⟶ y) := by
   refine' equiv_relation _ _ @fun j₁ j₂ => Nonempty.intro
   exact
     ⟨fun j => ⟨𝟙 _⟩, @fun j₁ j₂ => Nonempty.map fun f => inv f, @fun _ _ _ => Nonempty.map2 (· ≫ ·)⟩
-#align category_theory.nonempty_hom_of_connected_groupoid CategoryTheory.nonempty_hom_of_connected_groupoid
+#align category_theory.nonempty_hom_of_connected_groupoid CategoryTheory.nonempty_hom_of_preconnected_groupoid
+
+attribute [instance] nonempty_hom_of_preconnected_groupoid
+
+-- deprecated on 2024-02-19
+@[deprecated] alias nonempty_hom_of_connected_groupoid := nonempty_hom_of_preconnected_groupoid
 
 end CategoryTheory
feat(CategoryTheory): Guitart exact squares (#10270)

This PR defines the categorical notion of 2-exact square in the sense of Guitart. It is introduced in order to prepare for future applications to derived functors.

Co-authored-by: Joël Riou <37772949+joelriou@users.noreply.github.com>

Diff
@@ -232,6 +232,10 @@ theorem isPreconnected_of_equivalent {K : Type u₂} [Category.{v₂} K] [IsPrec
         _ ≅ (Functor.const K).obj (F.obj k) := NatIso.ofComponents fun X => Iso.refl _⟩
 #align category_theory.is_preconnected_of_equivalent CategoryTheory.isPreconnected_of_equivalent
 
+lemma isPreconnected_iff_of_equivalence {K : Type u₂} [Category.{v₂} K] (e : J ≌ K) :
+    IsPreconnected J ↔ IsPreconnected K :=
+  ⟨fun _ => isPreconnected_of_equivalent e, fun _ => isPreconnected_of_equivalent e.symm⟩
+
 /-- If `J` and `K` are equivalent, then if `J` is connected then `K` is as well. -/
 theorem isConnected_of_equivalent {K : Type u₂} [Category.{v₂} K] (e : J ≌ K) [IsConnected J] :
     IsConnected K :=
@@ -239,6 +243,10 @@ theorem isConnected_of_equivalent {K : Type u₂} [Category.{v₂} K] (e : J ≌
     toIsPreconnected := isPreconnected_of_equivalent e }
 #align category_theory.is_connected_of_equivalent CategoryTheory.isConnected_of_equivalent
 
+lemma isConnected_iff_of_equivalence {K : Type u₂} [Category.{v₂} K] (e : J ≌ K) :
+    IsConnected J ↔ IsConnected K :=
+  ⟨fun _ => isConnected_of_equivalent e, fun _ => isConnected_of_equivalent e.symm⟩
+
 /-- If `J` is preconnected, then `Jᵒᵖ` is preconnected as well. -/
 instance isPreconnected_op [IsPreconnected J] : IsPreconnected Jᵒᵖ where
   iso_constant := fun {α} F X =>
style: fix wrapping of where (#7149)
Diff
@@ -249,8 +249,8 @@ instance isPreconnected_op [IsPreconnected J] : IsPreconnected Jᵒᵖ where
 #align category_theory.is_preconnected_op CategoryTheory.isPreconnected_op
 
 /-- If `J` is connected, then `Jᵒᵖ` is connected as well. -/
-instance isConnected_op [IsConnected J] : IsConnected Jᵒᵖ
-    where is_nonempty := Nonempty.intro (op (Classical.arbitrary J))
+instance isConnected_op [IsConnected J] : IsConnected Jᵒᵖ where
+  is_nonempty := Nonempty.intro (op (Classical.arbitrary J))
 #align category_theory.is_connected_op CategoryTheory.isConnected_op
 
 theorem isPreconnected_of_isPreconnected_op [IsPreconnected Jᵒᵖ] : IsPreconnected J :=
chore: remove unused simps (#6632)

Co-authored-by: Eric Wieser <wieser.eric@gmail.com>

Diff
@@ -184,7 +184,6 @@ theorem IsConnected.of_induct [Nonempty J] {j₀ : J}
     have w := h { j | F j = F j₀ } rfl (fun {j₁} {j₂} f => by
       change F j₁ = F j₀ ↔ F j₂ = F j₀
       simp [a f];)
-    dsimp at w
     intro j j'
     rw [w j, w j']
 #align category_theory.is_connected.of_induct CategoryTheory.IsConnected.of_induct
chore: banish Type _ and Sort _ (#6499)

We remove all possible occurences of Type _ and Sort _ in favor of Type* and Sort*.

This has nice performance benefits.

Diff
@@ -206,7 +206,7 @@ given a type family `Z : J → Sort*` and
 a rule for transporting in *both* directions along a morphism in `J`,
 we can transport an `x : Z j₀` to a point in `Z j` for any `j`.
 -/
-theorem isPreconnected_induction [IsPreconnected J] (Z : J → Sort _)
+theorem isPreconnected_induction [IsPreconnected J] (Z : J → Sort*)
     (h₁ : ∀ {j₁ j₂ : J} (_ : j₁ ⟶ j₂), Z j₁ → Z j₂) (h₂ : ∀ {j₁ j₂ : J} (_ : j₁ ⟶ j₂), Z j₂ → Z j₁)
     {j₀ : J} (x : Z j₀) (j : J) : Nonempty (Z j) :=
   (induct_on_objects { j | Nonempty (Z j) } ⟨x⟩
feat: generalize universes for connected categories (#6237)
Diff
@@ -84,18 +84,36 @@ variable {J : Type u₁} [Category.{v₁} J]
 
 variable {K : Type u₂} [Category.{v₂} K]
 
+namespace IsPreconnected.IsoConstantAux
+
+/-- Implementation detail of `isoConstant`. -/
+private def liftToDiscrete {α : Type u₂} (F : J ⥤ Discrete α) : J ⥤ Discrete J where
+  obj j := have := Nonempty.intro j
+    Discrete.mk (Function.invFun F.obj (F.obj j))
+  map {j _} f := have := Nonempty.intro j
+    ⟨⟨congr_arg (Function.invFun F.obj) (Discrete.ext _ _ (Discrete.eq_of_hom (F.map f)))⟩⟩
+
+/-- Implementation detail of `isoConstant`. -/
+private def factorThroughDiscrete {α : Type u₂} (F : J ⥤ Discrete α) :
+    liftToDiscrete F ⋙ Discrete.functor F.obj ≅ F :=
+  NatIso.ofComponents (fun j => eqToIso Function.apply_invFun_apply) (by aesop_cat)
+
+end IsPreconnected.IsoConstantAux
+
 /-- If `J` is connected, any functor `F : J ⥤ Discrete α` is isomorphic to
 the constant functor with value `F.obj j` (for any choice of `j`).
 -/
-def isoConstant [IsPreconnected J] {α : Type u₁} (F : J ⥤ Discrete α) (j : J) :
+def isoConstant [IsPreconnected J] {α : Type u₂} (F : J ⥤ Discrete α) (j : J) :
     F ≅ (Functor.const J).obj (F.obj j) :=
-  (IsPreconnected.iso_constant F j).some
+  (IsPreconnected.IsoConstantAux.factorThroughDiscrete F).symm
+    ≪≫ isoWhiskerRight (IsPreconnected.iso_constant _ j).some _
+    ≪≫ NatIso.ofComponents (fun j' => eqToIso Function.apply_invFun_apply) (by aesop_cat)
 #align category_theory.iso_constant CategoryTheory.isoConstant
 
-/-- If J is connected, any functor to a discrete category is constant on objects.
+/-- If `J` is connected, any functor to a discrete category is constant on objects.
 The converse is given in `IsConnected.of_any_functor_const_on_obj`.
 -/
-theorem any_functor_const_on_obj [IsPreconnected J] {α : Type u₁} (F : J ⥤ Discrete α) (j j' : J) :
+theorem any_functor_const_on_obj [IsPreconnected J] {α : Type u₂} (F : J ⥤ Discrete α) (j j' : J) :
     F.obj j = F.obj j' := by
   ext; exact ((isoConstant F j').hom.app j).down.1
 #align category_theory.any_functor_const_on_obj CategoryTheory.any_functor_const_on_obj
@@ -114,7 +132,7 @@ This can be thought of as a local-to-global property.
 
 The converse is shown in `IsConnected.of_constant_of_preserves_morphisms`
 -/
-theorem constant_of_preserves_morphisms [IsPreconnected J] {α : Type u₁} (F : J → α)
+theorem constant_of_preserves_morphisms [IsPreconnected J] {α : Type u₂} (F : J → α)
     (h : ∀ (j₁ j₂ : J) (_ : j₁ ⟶ j₂), F j₁ = F j₂) (j j' : J) : F j = F j' := by
   simpa using
     any_functor_const_on_obj
@@ -150,7 +168,7 @@ The converse is given in `IsConnected.of_induct`.
 theorem induct_on_objects [IsPreconnected J] (p : Set J) {j₀ : J} (h0 : j₀ ∈ p)
     (h1 : ∀ {j₁ j₂ : J} (_ : j₁ ⟶ j₂), j₁ ∈ p ↔ j₂ ∈ p) (j : J) : j ∈ p := by
   let aux (j₁ j₂ : J) (f : j₁ ⟶ j₂) := congrArg ULift.up <| (h1 f).to_eq
-  injection constant_of_preserves_morphisms (fun k => ULift.up (k ∈ p)) aux j j₀ with i
+  injection constant_of_preserves_morphisms (fun k => ULift.up.{u₁} (k ∈ p)) aux j j₀ with i
   rwa [i]
 #align category_theory.induct_on_objects CategoryTheory.induct_on_objects
 
@@ -203,7 +221,7 @@ theorem isPreconnected_induction [IsPreconnected J] (Z : J → Sort _)
 #align category_theory.is_preconnected_induction CategoryTheory.isPreconnected_induction
 
 /-- If `J` and `K` are equivalent, then if `J` is preconnected then `K` is as well. -/
-theorem isPreconnected_of_equivalent {K : Type u₁} [Category.{v₂} K] [IsPreconnected J]
+theorem isPreconnected_of_equivalent {K : Type u₂} [Category.{v₂} K] [IsPreconnected J]
     (e : J ≌ K) : IsPreconnected K where
   iso_constant F k :=
     ⟨calc
@@ -216,7 +234,7 @@ theorem isPreconnected_of_equivalent {K : Type u₁} [Category.{v₂} K] [IsPrec
 #align category_theory.is_preconnected_of_equivalent CategoryTheory.isPreconnected_of_equivalent
 
 /-- If `J` and `K` are equivalent, then if `J` is connected then `K` is as well. -/
-theorem isConnected_of_equivalent {K : Type u₁} [Category.{v₂} K] (e : J ≌ K) [IsConnected J] :
+theorem isConnected_of_equivalent {K : Type u₂} [Category.{v₂} K] (e : J ≌ K) [IsConnected J] :
     IsConnected K :=
   { is_nonempty := Nonempty.map e.functor.obj (by infer_instance)
     toIsPreconnected := isPreconnected_of_equivalent e }
chore: fix some Set defeq abuse, golf (#6114)
  • Use {x | p x} instead of fun x ↦ p x to define a set here and there.
  • Golf some proofs.
  • Replace Con.ker_apply_eq_preimage with Con.ker_apply. The old version used to abuse definitional equality between Set M and M → Prop.
  • Fix Submonoid.mk* lemmas to use ⟨_, _⟩, not ⟨⟨_, _⟩, _⟩.
Diff
@@ -176,13 +176,12 @@ instance [hc : IsConnected J] : IsConnected (ULiftHom.{v₂} (ULift.{u₂} J)) :
   have : Nonempty (ULiftHom.{v₂} (ULift.{u₂} J)) := by simp [ULiftHom, hc.is_nonempty]
   apply IsConnected.of_induct
   rintro p hj₀ h ⟨j⟩
-  let p' : Set J := (fun j : J => p { down := j } : Set J)
+  let p' : Set J := {j : J | p ⟨j⟩}
   have hj₀' : Classical.choice hc.is_nonempty ∈ p' := by
     simp only [(eq_self p')]
     exact hj₀
-  apply
-    induct_on_objects (fun j : J => p { down := j }) hj₀' @fun _ _ f =>
-      h ((ULiftHomULiftCategory.equiv J).functor.map f)
+  apply induct_on_objects p' hj₀' @fun _ _ f =>
+    h ((ULiftHomULiftCategory.equiv J).functor.map f)
 
 /-- Another induction principle for `IsPreconnected J`:
 given a type family `Z : J → Sort*` and
@@ -297,7 +296,7 @@ theorem zag_of_zag_obj (F : J ⥤ K) [Full F] {j₁ j₂ : J} (h : Zag (F.obj j
 theorem equiv_relation [IsConnected J] (r : J → J → Prop) (hr : _root_.Equivalence r)
     (h : ∀ {j₁ j₂ : J} (_ : j₁ ⟶ j₂), r j₁ j₂) : ∀ j₁ j₂ : J, r j₁ j₂ := by
   have z : ∀ j : J, r (Classical.arbitrary J) j :=
-    induct_on_objects (fun k => r (Classical.arbitrary J) k) (hr.1 (Classical.arbitrary J))
+    induct_on_objects {k | r (Classical.arbitrary J) k} (hr.1 (Classical.arbitrary J))
       fun f => ⟨fun t => hr.3 t (h f), fun t => hr.3 t (hr.2 (h f))⟩
   intros
   apply hr.3 (hr.2 (z _)) (z _)
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,17 +2,14 @@
 Copyright (c) 2020 Bhavik Mehta. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Bhavik Mehta, Jakob von Raumer
-
-! This file was ported from Lean 3 source module category_theory.is_connected
-! leanprover-community/mathlib commit 024a4231815538ac739f52d08dd20a55da0d6b23
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathlib.Data.List.Chain
 import Mathlib.CategoryTheory.PUnit
 import Mathlib.CategoryTheory.Groupoid
 import Mathlib.CategoryTheory.Category.ULift
 
+#align_import category_theory.is_connected from "leanprover-community/mathlib"@"024a4231815538ac739f52d08dd20a55da0d6b23"
+
 /-!
 # Connected category
 
chore: cleanup whitespace (#5988)

Grepping for [^ .:{-] [^ :] and reviewing the results. Once I started I couldn't stop. :-)

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

Diff
@@ -108,7 +108,7 @@ The converse of `any_functor_const_on_obj`.
 -/
 theorem IsConnected.of_any_functor_const_on_obj [Nonempty J]
     (h : ∀ {α : Type u₁} (F : J ⥤ Discrete α), ∀ j j' : J, F.obj j = F.obj j') : IsConnected J :=
-  { iso_constant := fun  F j' => ⟨NatIso.ofComponents fun j => eqToIso (h F j j')⟩ }
+  { iso_constant := fun F j' => ⟨NatIso.ofComponents fun j => eqToIso (h F j j')⟩ }
 #align category_theory.is_connected.of_any_functor_const_on_obj CategoryTheory.IsConnected.of_any_functor_const_on_obj
 
 /-- If `J` is connected, then given any function `F` such that the presence of a
@@ -152,7 +152,7 @@ The converse is given in `IsConnected.of_induct`.
 -/
 theorem induct_on_objects [IsPreconnected J] (p : Set J) {j₀ : J} (h0 : j₀ ∈ p)
     (h1 : ∀ {j₁ j₂ : J} (_ : j₁ ⟶ j₂), j₁ ∈ p ↔ j₂ ∈ p) (j : J) : j ∈ p := by
-  let aux (j₁ j₂ : J) (f : j₁ ⟶  j₂) := congrArg ULift.up <| (h1 f).to_eq
+  let aux (j₁ j₂ : J) (f : j₁ ⟶ j₂) := congrArg ULift.up <| (h1 f).to_eq
   injection constant_of_preserves_morphisms (fun k => ULift.up (k ∈ p)) aux j j₀ with i
   rwa [i]
 #align category_theory.induct_on_objects CategoryTheory.induct_on_objects
chore: tidy various files (#4997)
Diff
@@ -306,13 +306,13 @@ theorem equiv_relation [IsConnected J] (r : J → J → Prop) (hr : _root_.Equiv
   apply hr.3 (hr.2 (z _)) (z _)
 #align category_theory.equiv_relation CategoryTheory.equiv_relation
 
-/-- In a connected category, any two objects are related by `zigzag`. -/
+/-- In a connected category, any two objects are related by `Zigzag`. -/
 theorem isConnected_zigzag [IsConnected J] (j₁ j₂ : J) : Zigzag j₁ j₂ :=
   equiv_relation _ zigzag_equivalence
     (@fun _ _ f => Relation.ReflTransGen.single (Or.inl (Nonempty.intro f))) _ _
 #align category_theory.is_connected_zigzag CategoryTheory.isConnected_zigzag
 
-/-- If any two objects in a nonempty category are related by `zigzag`, the category is connected.
+/-- If any two objects in a nonempty category are related by `Zigzag`, the category is connected.
 -/
 theorem zigzag_isConnected [Nonempty J] (h : ∀ j₁ j₂ : J, Zigzag j₁ j₂) : IsConnected J := by
   apply IsConnected.of_induct
@@ -348,13 +348,13 @@ theorem isConnected_of_zigzag [Nonempty J] (h : ∀ j₁ j₂ : J, ∃ l,
 #align category_theory.is_connected_of_zigzag CategoryTheory.isConnected_of_zigzag
 
 /-- If `Discrete α` is connected, then `α` is (type-)equivalent to `PUnit`. -/
-def discreteIsConnectedEquivPunit {α : Type u₁} [IsConnected (Discrete α)] : α ≃ PUnit :=
+def discreteIsConnectedEquivPUnit {α : Type u₁} [IsConnected (Discrete α)] : α ≃ PUnit :=
   Discrete.equivOfEquivalence.{u₁, u₁}
     { functor := Functor.star (Discrete α)
       inverse := Discrete.functor fun _ => Classical.arbitrary _
       unitIso := isoConstant _ (Classical.arbitrary _)
-      counitIso := Functor.pUnitExt _ _ }
-#align category_theory.discrete_is_connected_equiv_punit CategoryTheory.discreteIsConnectedEquivPunit
+      counitIso := Functor.punitExt _ _ }
+#align category_theory.discrete_is_connected_equiv_punit CategoryTheory.discreteIsConnectedEquivPUnit
 
 variable {C : Type u₂} [Category.{u₁} C]
 
chore: review of automation in category theory (#4793)

Clean up of automation in the category theory library. Leaving out unnecessary proof steps, or fields done by aesop_cat, and making more use of available autoparameters.

Co-authored-by: Scott Morrison <scott.morrison@anu.edu.au>

Diff
@@ -108,8 +108,7 @@ The converse of `any_functor_const_on_obj`.
 -/
 theorem IsConnected.of_any_functor_const_on_obj [Nonempty J]
     (h : ∀ {α : Type u₁} (F : J ⥤ Discrete α), ∀ j j' : J, F.obj j = F.obj j') : IsConnected J :=
-  { iso_constant := fun  F j' =>
-      ⟨NatIso.ofComponents (fun j => eqToIso (h F j j')) fun _ => Subsingleton.elim _ _⟩ }
+  { iso_constant := fun  F j' => ⟨NatIso.ofComponents fun j => eqToIso (h F j j')⟩ }
 #align category_theory.is_connected.of_any_functor_const_on_obj CategoryTheory.IsConnected.of_any_functor_const_on_obj
 
 /-- If `J` is connected, then given any function `F` such that the presence of a
@@ -211,14 +210,13 @@ theorem isPreconnected_induction [IsPreconnected J] (Z : J → Sort _)
 theorem isPreconnected_of_equivalent {K : Type u₁} [Category.{v₂} K] [IsPreconnected J]
     (e : J ≌ K) : IsPreconnected K where
   iso_constant F k :=
-      ⟨calc
-          F ≅ e.inverse ⋙ e.functor ⋙ F := (e.invFunIdAssoc F).symm
-          _ ≅ e.inverse ⋙ (Functor.const J).obj ((e.functor ⋙ F).obj (e.inverse.obj k)) :=
-            isoWhiskerLeft e.inverse (isoConstant (e.functor ⋙ F) (e.inverse.obj k))
-          _ ≅ e.inverse ⋙ (Functor.const J).obj (F.obj k) :=
-            isoWhiskerLeft _ ((F ⋙ Functor.const J).mapIso (e.counitIso.app k))
-          _ ≅ (Functor.const K).obj (F.obj k) := NatIso.ofComponents (fun X => Iso.refl _) (by simp)
-          ⟩
+    ⟨calc
+        F ≅ e.inverse ⋙ e.functor ⋙ F := (e.invFunIdAssoc F).symm
+        _ ≅ e.inverse ⋙ (Functor.const J).obj ((e.functor ⋙ F).obj (e.inverse.obj k)) :=
+          isoWhiskerLeft e.inverse (isoConstant (e.functor ⋙ F) (e.inverse.obj k))
+        _ ≅ e.inverse ⋙ (Functor.const J).obj (F.obj k) :=
+          isoWhiskerLeft _ ((F ⋙ Functor.const J).mapIso (e.counitIso.app k))
+        _ ≅ (Functor.const K).obj (F.obj k) := NatIso.ofComponents fun X => Iso.refl _⟩
 #align category_theory.is_preconnected_of_equivalent CategoryTheory.isPreconnected_of_equivalent
 
 /-- If `J` and `K` are equivalent, then if `J` is connected then `K` is as well. -/
@@ -231,13 +229,10 @@ theorem isConnected_of_equivalent {K : Type u₁} [Category.{v₂} K] (e : J ≌
 /-- If `J` is preconnected, then `Jᵒᵖ` is preconnected as well. -/
 instance isPreconnected_op [IsPreconnected J] : IsPreconnected Jᵒᵖ where
   iso_constant := fun {α} F X =>
-    ⟨NatIso.ofComponents (fun Y =>
-          eqToIso (Discrete.ext _ _
-              (Discrete.eq_of_hom
-                ((Nonempty.some
-                 (IsPreconnected.iso_constant (F.rightOp ⋙ (Discrete.opposite α).functor)
-                          (unop X))).app
-                    (unop Y)).hom))) fun _ => Subsingleton.elim _ _⟩
+    ⟨NatIso.ofComponents fun Y =>
+      eqToIso (Discrete.ext _ _ (Discrete.eq_of_hom ((Nonempty.some
+        (IsPreconnected.iso_constant (F.rightOp ⋙ (Discrete.opposite α).functor) (unop X))).app
+          (unop Y)).hom))⟩
 #align category_theory.is_preconnected_op CategoryTheory.isPreconnected_op
 
 /-- If `J` is connected, then `Jᵒᵖ` is connected as well. -/
chore: bump to nightly-2023-05-31 (#4530)

Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Mario Carneiro <di.gama@gmail.com> Co-authored-by: Floris van Doorn <fpvdoorn@gmail.com> Co-authored-by: Jeremy Tan Jie Rui <reddeloostw@gmail.com> Co-authored-by: Alex J Best <alex.j.best@gmail.com>

Diff
@@ -317,7 +317,7 @@ theorem isConnected_zigzag [IsConnected J] (j₁ j₂ : J) : Zigzag j₁ j₂ :=
     (@fun _ _ f => Relation.ReflTransGen.single (Or.inl (Nonempty.intro f))) _ _
 #align category_theory.is_connected_zigzag CategoryTheory.isConnected_zigzag
 
-/-- If any two objects in an nonempty category are related by `zigzag`, the category is connected.
+/-- If any two objects in a nonempty category are related by `zigzag`, the category is connected.
 -/
 theorem zigzag_isConnected [Nonempty J] (h : ∀ j₁ j₂ : J, Zigzag j₁ j₂) : IsConnected J := by
   apply IsConnected.of_induct
@@ -338,7 +338,7 @@ theorem exists_zigzag' [IsConnected J] (j₁ j₂ : J) :
   List.exists_chain_of_relationReflTransGen (isConnected_zigzag _ _)
 #align category_theory.exists_zigzag' CategoryTheory.exists_zigzag'
 
-/-- If any two objects in an nonempty category are linked by a sequence of (potentially reversed)
+/-- If any two objects in a nonempty category are linked by a sequence of (potentially reversed)
 morphisms, then J is connected.
 
 The converse of `exists_zigzag'`.
chore: port missing instance priorities (#3613)

See discussion at https://leanprover.zulipchat.com/#narrow/stream/287929-mathlib4/topic/mathport.20drops.20priorities.20in.20.60attribute.20.5Binstance.5D.60. mathport has been dropping the priorities on instances when using the attribute command.

This PR adds back all the priorities, except for local attribute, and instances involving coercions, which I didn't want to mess with.

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

Diff
@@ -81,7 +81,7 @@ class IsConnected (J : Type u₁) [Category.{v₁} J] extends IsPreconnected J :
   [is_nonempty : Nonempty J]
 #align category_theory.is_connected CategoryTheory.IsConnected
 
-attribute [instance] IsConnected.is_nonempty
+attribute [instance 100] IsConnected.is_nonempty
 
 variable {J : Type u₁} [Category.{v₁} J]
 
chore: tidy various files (#3408)
Diff
@@ -87,7 +87,7 @@ variable {J : Type u₁} [Category.{v₁} J]
 
 variable {K : Type u₂} [Category.{v₂} K]
 
-/-- If `J` is connected, any functor `F : J ⥤ discrete α` is isomorphic to
+/-- If `J` is connected, any functor `F : J ⥤ Discrete α` is isomorphic to
 the constant functor with value `F.obj j` (for any choice of `j`).
 -/
 def isoConstant [IsPreconnected J] {α : Type u₁} (F : J ⥤ Discrete α) (j : J) :
@@ -149,7 +149,7 @@ theorem IsConnected.of_constant_of_preserves_morphisms [Nonempty J]
 If the set `p` is nonempty, and `p` is closed under morphisms of `J`,
 then `p` contains all of `J`.
 
-The converse is given in `is_connected.of_induct`.
+The converse is given in `IsConnected.of_induct`.
 -/
 theorem induct_on_objects [IsPreconnected J] (p : Set J) {j₀ : J} (h0 : j₀ ∈ p)
     (h1 : ∀ {j₁ j₂ : J} (_ : j₁ ⟶ j₂), j₁ ∈ p ↔ j₂ ∈ p) (j : J) : j ∈ p := by
@@ -197,7 +197,7 @@ theorem isPreconnected_induction [IsPreconnected J] (Z : J → Sort _)
     (h₁ : ∀ {j₁ j₂ : J} (_ : j₁ ⟶ j₂), Z j₁ → Z j₂) (h₂ : ∀ {j₁ j₂ : J} (_ : j₁ ⟶ j₂), Z j₂ → Z j₁)
     {j₀ : J} (x : Z j₀) (j : J) : Nonempty (Z j) :=
   (induct_on_objects { j | Nonempty (Z j) } ⟨x⟩
-      (@fun j₁ j₂ f =>
+      (fun f =>
         ⟨by
           rintro ⟨y⟩
           exact ⟨h₁ f y⟩, by
@@ -209,9 +209,8 @@ theorem isPreconnected_induction [IsPreconnected J] (Z : J → Sort _)
 
 /-- If `J` and `K` are equivalent, then if `J` is preconnected then `K` is as well. -/
 theorem isPreconnected_of_equivalent {K : Type u₁} [Category.{v₂} K] [IsPreconnected J]
-    (e : J ≌ K) : IsPreconnected K :=
-  {
-    iso_constant := @fun α F k =>
+    (e : J ≌ K) : IsPreconnected K where
+  iso_constant F k :=
       ⟨calc
           F ≅ e.inverse ⋙ e.functor ⋙ F := (e.invFunIdAssoc F).symm
           _ ≅ e.inverse ⋙ (Functor.const J).obj ((e.functor ⋙ F).obj (e.inverse.obj k)) :=
@@ -219,7 +218,7 @@ theorem isPreconnected_of_equivalent {K : Type u₁} [Category.{v₂} K] [IsPrec
           _ ≅ e.inverse ⋙ (Functor.const J).obj (F.obj k) :=
             isoWhiskerLeft _ ((F ⋙ Functor.const J).mapIso (e.counitIso.app k))
           _ ≅ (Functor.const K).obj (F.obj k) := NatIso.ofComponents (fun X => Iso.refl _) (by simp)
-          ⟩ }
+          ⟩
 #align category_theory.is_preconnected_of_equivalent CategoryTheory.isPreconnected_of_equivalent
 
 /-- If `J` and `K` are equivalent, then if `J` is connected then `K` is as well. -/
@@ -230,8 +229,8 @@ theorem isConnected_of_equivalent {K : Type u₁} [Category.{v₂} K] (e : J ≌
 #align category_theory.is_connected_of_equivalent CategoryTheory.isConnected_of_equivalent
 
 /-- If `J` is preconnected, then `Jᵒᵖ` is preconnected as well. -/
-instance isPreconnected_op [IsPreconnected J] : IsPreconnected Jᵒᵖ
-    where iso_constant := fun {α} F X =>
+instance isPreconnected_op [IsPreconnected J] : IsPreconnected Jᵒᵖ where
+  iso_constant := fun {α} F X =>
     ⟨NatIso.ofComponents (fun Y =>
           eqToIso (Discrete.ext _ _
               (Discrete.eq_of_hom
@@ -254,7 +253,7 @@ theorem isConnected_of_isConnected_op [IsConnected Jᵒᵖ] : IsConnected J :=
   isConnected_of_equivalent (opOpEquivalence J)
 #align category_theory.is_connected_of_is_connected_op CategoryTheory.isConnected_of_isConnected_op
 
-/-- j₁ and j₂ are related by `zag` if there is a morphism between them. -/
+/-- j₁ and j₂ are related by `Zag` if there is a morphism between them. -/
 @[reducible]
 def Zag (j₁ j₂ : J) : Prop :=
   Nonempty (j₁ ⟶ j₂) ∨ Nonempty (j₂ ⟶ j₁)
@@ -263,7 +262,7 @@ def Zag (j₁ j₂ : J) : Prop :=
 theorem zag_symmetric : Symmetric (@Zag J _) := fun _ _ h => h.symm
 #align category_theory.zag_symmetric CategoryTheory.zag_symmetric
 
-/-- `j₁` and `j₂` are related by `zigzag` if there is a chain of
+/-- `j₁` and `j₂` are related by `Zigzag` if there is a chain of
 morphisms from `j₁` to `j₂`, with backward morphisms allowed.
 -/
 @[reducible]
@@ -280,7 +279,7 @@ theorem zigzag_equivalence : _root_.Equivalence (@Zigzag J _) :=
   (fun h g => Relation.transitive_reflTransGen h g)
 #align category_theory.zigzag_equivalence CategoryTheory.zigzag_equivalence
 
-/-- The setoid given by the equivalence relation `zigzag`. A quotient for this
+/-- The setoid given by the equivalence relation `Zigzag`. A quotient for this
 setoid is a connected component of the category.
 -/
 def Zigzag.setoid (J : Type u₂) [Category.{v₁} J] : Setoid J where
@@ -296,7 +295,7 @@ theorem zigzag_obj_of_zigzag (F : J ⥤ K) {j₁ j₂ : J} (h : Zigzag j₁ j₂
   h.lift _ fun _ _ => Or.imp (Nonempty.map fun f => F.map f) (Nonempty.map fun f => F.map f)
 #align category_theory.zigzag_obj_of_zigzag CategoryTheory.zigzag_obj_of_zigzag
 
--- TODO: figure out the right way to generalise this to `zigzag`.
+-- TODO: figure out the right way to generalise this to `Zigzag`.
 theorem zag_of_zag_obj (F : J ⥤ K) [Full F] {j₁ j₂ : J} (h : Zag (F.obj j₁) (F.obj j₂)) :
     Zag j₁ j₂ :=
   Or.imp (Nonempty.map F.preimage) (Nonempty.map F.preimage) h
@@ -307,8 +306,9 @@ theorem equiv_relation [IsConnected J] (r : J → J → Prop) (hr : _root_.Equiv
     (h : ∀ {j₁ j₂ : J} (_ : j₁ ⟶ j₂), r j₁ j₂) : ∀ j₁ j₂ : J, r j₁ j₂ := by
   have z : ∀ j : J, r (Classical.arbitrary J) j :=
     induct_on_objects (fun k => r (Classical.arbitrary J) k) (hr.1 (Classical.arbitrary J))
-      @ fun _ _ f => ⟨fun t => hr.3 t (h f), fun t => hr.3 t (hr.2 (h f))⟩
-  intros ; apply hr.3 (hr.2 (z _)) (z _)
+      fun f => ⟨fun t => hr.3 t (h f), fun t => hr.3 t (hr.2 (h f))⟩
+  intros
+  apply hr.3 (hr.2 (z _)) (z _)
 #align category_theory.equiv_relation CategoryTheory.equiv_relation
 
 /-- In a connected category, any two objects are related by `zigzag`. -/
@@ -352,7 +352,7 @@ theorem isConnected_of_zigzag [Nonempty J] (h : ∀ j₁ j₂ : J, ∃ l,
   apply List.relationReflTransGen_of_exists_chain l hl₁ hl₂
 #align category_theory.is_connected_of_zigzag CategoryTheory.isConnected_of_zigzag
 
-/-- If `discrete α` is connected, then `α` is (type-)equivalent to `punit`. -/
+/-- If `Discrete α` is connected, then `α` is (type-)equivalent to `PUnit`. -/
 def discreteIsConnectedEquivPunit {α : Type u₁} [IsConnected (Discrete α)] : α ≃ PUnit :=
   Discrete.equivOfEquivalence.{u₁, u₁}
     { functor := Functor.star (Discrete α)
@@ -370,17 +370,15 @@ This is the key property of connected categories which we use to establish prope
 theorem nat_trans_from_is_connected [IsPreconnected J] {X Y : C}
     (α : (Functor.const J).obj X ⟶ (Functor.const J).obj Y) :
     ∀ j j' : J, α.app j = (α.app j' : X ⟶ Y) :=
-  @constant_of_preserves_morphisms _ _ _ (X ⟶ Y) (fun j => α.app j) fun _ _ f =>
-    by
+  @constant_of_preserves_morphisms _ _ _ (X ⟶ Y) (fun j => α.app j) fun _ _ f => by
     have := α.naturality f
     erw [id_comp, comp_id] at this
     exact this.symm
 #align category_theory.nat_trans_from_is_connected CategoryTheory.nat_trans_from_is_connected
 
-instance [IsConnected J] : Full (Functor.const J : C ⥤ J ⥤ C)
-    where
-  preimage := @fun X Y f => f.app (Classical.arbitrary J)
-  witness := @fun X Y f => by
+instance [IsConnected J] : Full (Functor.const J : C ⥤ J ⥤ C) where
+  preimage f := f.app (Classical.arbitrary J)
+  witness f := by
     ext j
     apply nat_trans_from_is_connected f (Classical.arbitrary J) j
 
chore: strip trailing spaces in lean files (#2828)

vscode is already configured by .vscode/settings.json to trim these on save. It's not clear how they've managed to stick around.

By doing this all in one PR now, it avoids getting random whitespace diffs in PRs later.

This was done with a regex search in vscode,

image

Diff
@@ -153,7 +153,7 @@ The converse is given in `is_connected.of_induct`.
 -/
 theorem induct_on_objects [IsPreconnected J] (p : Set J) {j₀ : J} (h0 : j₀ ∈ p)
     (h1 : ∀ {j₁ j₂ : J} (_ : j₁ ⟶ j₂), j₁ ∈ p ↔ j₂ ∈ p) (j : J) : j ∈ p := by
-  let aux (j₁ j₂ : J) (f : j₁ ⟶  j₂) := congrArg ULift.up <| (h1 f).to_eq 
+  let aux (j₁ j₂ : J) (f : j₁ ⟶  j₂) := congrArg ULift.up <| (h1 f).to_eq
   injection constant_of_preserves_morphisms (fun k => ULift.up (k ∈ p)) aux j j₀ with i
   rwa [i]
 #align category_theory.induct_on_objects CategoryTheory.induct_on_objects
@@ -167,8 +167,8 @@ theorem IsConnected.of_induct [Nonempty J] {j₀ : J}
     (h : ∀ p : Set J, j₀ ∈ p → (∀ {j₁ j₂ : J} (_ : j₁ ⟶ j₂), j₁ ∈ p ↔ j₂ ∈ p) → ∀ j : J, j ∈ p) :
     IsConnected J :=
   IsConnected.of_constant_of_preserves_morphisms fun {α} F a => by
-    have w := h { j | F j = F j₀ } rfl (fun {j₁} {j₂} f => by 
-      change F j₁ = F j₀ ↔ F j₂ = F j₀ 
+    have w := h { j | F j = F j₀ } rfl (fun {j₁} {j₂} f => by
+      change F j₁ = F j₀ ↔ F j₂ = F j₀
       simp [a f];)
     dsimp at w
     intro j j'
@@ -276,7 +276,7 @@ theorem zigzag_symmetric : Symmetric (@Zigzag J _) :=
 #align category_theory.zigzag_symmetric CategoryTheory.zigzag_symmetric
 
 theorem zigzag_equivalence : _root_.Equivalence (@Zigzag J _) :=
-  _root_.Equivalence.mk Relation.reflexive_reflTransGen (fun h => zigzag_symmetric h) 
+  _root_.Equivalence.mk Relation.reflexive_reflTransGen (fun h => zigzag_symmetric h)
   (fun h g => Relation.transitive_reflTransGen h g)
 #align category_theory.zigzag_equivalence CategoryTheory.zigzag_equivalence
 
@@ -392,4 +392,3 @@ instance nonempty_hom_of_connected_groupoid {G} [Groupoid G] [IsConnected G] :
 #align category_theory.nonempty_hom_of_connected_groupoid CategoryTheory.nonempty_hom_of_connected_groupoid
 
 end CategoryTheory
-
feat: port CategoryTheory.IsConnected (#2443)

Co-authored-by: Moritz Firsching <firsching@google.com> Co-authored-by: Matthew Ballard <matt@mrb.email>

Dependencies 2 + 120

121 files ported (98.4%)
48733 lines ported (99.7%)
Show graph

The unported dependencies are