category_theory.is_connected
⟷
Mathlib.CategoryTheory.IsConnected
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -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"
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -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
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -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"
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -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]
mathlib commit https://github.com/leanprover-community/mathlib/commit/7e5137f579de09a059a5ce98f364a04e221aabf0
@@ -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. -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -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)
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -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.
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -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)
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -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.
mathlib commit https://github.com/leanprover-community/mathlib/commit/09079525fd01b3dda35e96adaa08d2f943e1648c
@@ -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]
mathlib commit https://github.com/leanprover-community/mathlib/commit/2196ab363eb097c008d4497125e0dde23fb36db2
@@ -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.
mathlib commit https://github.com/leanprover-community/mathlib/commit/3180fab693e2cee3bff62675571264cb8778b212
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/4c586d291f189eecb9d00581aeb3dd998ac34442
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -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]
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -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
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>
@@ -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
These notions on functors are now Functor.Full
, Functor.Faithful
, Functor.EssSurj
, Functor.IsEquivalence
, Functor.ReflectsIsomorphisms
. Deprecated aliases are introduced for the previous names.
@@ -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
@@ -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
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>
@@ -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₂
@@ -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.
-/
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)
@@ -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
@@ -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)
@@ -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
@@ -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 =>
@@ -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 :=
@@ -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
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -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⟩
@@ -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 }
Set
defeq abuse, golf (#6114)
{x | p x}
instead of fun x ↦ p x
to define a set here and there.Con.ker_apply_eq_preimage
with Con.ker_apply
. The old version used to abuse definitional equality between Set M
and M → Prop
.Submonoid.mk*
lemmas to use ⟨_, _⟩
, not ⟨⟨_, _⟩, _⟩
.@@ -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 _)
@@ -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
@@ -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
@@ -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]
@@ -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. -/
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>
@@ -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'`.
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>
@@ -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]
@@ -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
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,
@@ -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
-
The unported dependencies are