category_theory.groupoid.subgroupoid
⟷
Mathlib.CategoryTheory.Groupoid.Subgroupoid
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)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -514,7 +514,7 @@ theorem IsNormal.generatedNormal_le {S : Subgroupoid C} (Sn : S.IsNormal) :
constructor
· rintro h c d
let h' := generated_le_generated_normal X
- rw [le_iff] at h h'
+ rw [le_iff] at h h'
exact ((subset_generated X c d).trans (@h' c d)).trans (@h c d)
· rintro h
apply @sInf_le (subgroupoid C) _
@@ -681,7 +681,7 @@ theorem mem_map_objs_iff (hφ : Function.Injective φ.obj) (d : D) :
dsimp [objs, map]
constructor
· rintro ⟨f, hf⟩
- change map.arrows φ hφ S d d f at hf ; rw [map.arrows_iff] at hf
+ change map.arrows φ hφ S d d f at hf; rw [map.arrows_iff] at hf
obtain ⟨c, d, g, ec, ed, eg, gS, eg⟩ := hf
exact ⟨c, ⟨mem_objs_of_src S eg, ec⟩⟩
· rintro ⟨c, ⟨γ, γS⟩, rfl⟩
@@ -736,18 +736,18 @@ theorem isNormal_map (hφ : Function.Injective φ.obj) (hφ' : im φ hφ = ⊤)
change map.arrows φ hφ S _ _ (𝟙 _); rw [← Functor.map_id]
constructor; exact Sn.wide c
conj := fun d d' g δ hδ => by
- rw [mem_map_iff] at hδ
+ rw [mem_map_iff] at hδ
obtain ⟨c, c', γ, cd, cd', γS, hγ⟩ := hδ; subst_vars; cases hφ cd'
have : d' ∈ (im φ hφ).objs := by rw [hφ']; apply mem_top_objs
- rw [mem_im_objs_iff] at this
+ rw [mem_im_objs_iff] at this
obtain ⟨c', rfl⟩ := this
have : g ∈ (im φ hφ).arrows (φ.obj c) (φ.obj c') := by rw [hφ']; trivial
- rw [mem_im_iff] at this
+ rw [mem_im_iff] at this
obtain ⟨b, b', f, hb, hb', _, hf⟩ := this; subst_vars; cases hφ hb; cases hφ hb'
change map.arrows φ hφ S (φ.obj c') (φ.obj c') _
simp only [eq_to_hom_refl, category.comp_id, category.id_comp, inv_eq_inv]
suffices map.arrows φ hφ S (φ.obj c') (φ.obj c') (φ.map <| inv f ≫ γ ≫ f) by
- simp only [inv_eq_inv, functor.map_comp, functor.map_inv] at this ; exact this
+ simp only [inv_eq_inv, functor.map_comp, functor.map_inv] at this; exact this
· constructor; apply Sn.conj f γS }
#align category_theory.subgroupoid.is_normal_map CategoryTheory.Subgroupoid.isNormal_map
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,13 +3,13 @@ Copyright (c) 2022 Rémi Bottinelli. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Rémi Bottinelli, Junyan Xu
-/
-import Mathbin.CategoryTheory.Groupoid.VertexGroup
-import Mathbin.CategoryTheory.Groupoid.Basic
-import Mathbin.CategoryTheory.Groupoid
-import Mathbin.Algebra.Group.Defs
-import Mathbin.Data.Set.Lattice
-import Mathbin.GroupTheory.Subgroup.Basic
-import Mathbin.Order.GaloisConnection
+import CategoryTheory.Groupoid.VertexGroup
+import CategoryTheory.Groupoid.Basic
+import CategoryTheory.Groupoid
+import Algebra.Group.Defs
+import Data.Set.Lattice
+import GroupTheory.Subgroup.Basic
+import Order.GaloisConnection
#align_import category_theory.groupoid.subgroupoid from "leanprover-community/mathlib"@"44e2ae8cffc713925494e4975ee31ec1d06929b3"
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -223,7 +223,7 @@ theorem hom.faithful : ∀ c d, Function.Injective fun f : c ⟶ d => (hom S).ma
def vertexSubgroup {c : C} (hc : c ∈ S.objs) : Subgroup (c ⟶ c)
where
carrier := S.arrows c c
- mul_mem' f g hf hg := S.mul hf hg
+ hMul_mem' f g hf hg := S.mul hf hg
one_mem' := id_mem_of_nonempty_isotropy _ _ hc
inv_mem' f hf := S.inv hf
#align category_theory.subgroupoid.vertex_subgroup CategoryTheory.Subgroupoid.vertexSubgroup
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -593,12 +593,10 @@ theorem ker_comp {E : Type _} [Groupoid E] (ψ : D ⥤ E) : ker (φ ⋙ ψ) = co
#align category_theory.subgroupoid.ker_comp CategoryTheory.Subgroupoid.ker_comp
-/
-#print CategoryTheory.Subgroupoid.Map.Arrows /-
/-- The family of arrows of the image of a subgroupoid under a functor injective on objects -/
inductive Map.Arrows (hφ : Function.Injective φ.obj) (S : Subgroupoid C) : ∀ c d : D, (c ⟶ d) → Prop
| im {c d : C} (f : c ⟶ d) (hf : f ∈ S.arrows c d) : map.arrows (φ.obj c) (φ.obj d) (φ.map f)
-#align category_theory.subgroupoid.map.arrows CategoryTheory.Subgroupoid.Map.Arrows
--/
+#align category_theory.subgroupoid.map.arrows CategoryTheory.Subgroupoid.Map.Arrowsₓ
#print CategoryTheory.Subgroupoid.Map.arrows_iff /-
theorem Map.arrows_iff (hφ : Function.Injective φ.obj) (S : Subgroupoid C) {c d : D} (f : c ⟶ d) :
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,11 +2,6 @@
Copyright (c) 2022 Rémi Bottinelli. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Rémi Bottinelli, Junyan Xu
-
-! This file was ported from Lean 3 source module category_theory.groupoid.subgroupoid
-! leanprover-community/mathlib commit 44e2ae8cffc713925494e4975ee31ec1d06929b3
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.CategoryTheory.Groupoid.VertexGroup
import Mathbin.CategoryTheory.Groupoid.Basic
@@ -16,6 +11,8 @@ import Mathbin.Data.Set.Lattice
import Mathbin.GroupTheory.Subgroup.Basic
import Mathbin.Order.GaloisConnection
+#align_import category_theory.groupoid.subgroupoid from "leanprover-community/mathlib"@"44e2ae8cffc713925494e4975ee31ec1d06929b3"
+
/-!
# Subgroupoid
mathlib commit https://github.com/leanprover-community/mathlib/commit/2a0ce625dbb0ffbc7d1316597de0b25c1ec75303
@@ -235,7 +235,7 @@ def vertexSubgroup {c : C} (hc : c ∈ S.objs) : Subgroup (c ⟶ c)
instance : SetLike (Subgroupoid C) (Σ c d : C, c ⟶ d)
where
coe S := {F | F.2.2 ∈ S.arrows F.1 F.2.1}
- coe_injective' := fun ⟨S, _, _⟩ ⟨T, _, _⟩ h => by ext (c d f); apply Set.ext_iff.1 h ⟨c, d, f⟩
+ coe_injective' := fun ⟨S, _, _⟩ ⟨T, _, _⟩ h => by ext c d f; apply Set.ext_iff.1 h ⟨c, d, f⟩
#print CategoryTheory.Subgroupoid.mem_iff /-
theorem mem_iff (S : Subgroupoid C) (F : Σ c d, c ⟶ d) : F ∈ S ↔ F.2.2 ∈ S.arrows F.1 F.2.1 :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/8efcf8022aac8e01df8d302dcebdbc25d6a886c8
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Rémi Bottinelli, Junyan Xu
! This file was ported from Lean 3 source module category_theory.groupoid.subgroupoid
-! leanprover-community/mathlib commit 70fd9563a21e7b963887c9360bd29b2393e6225a
+! leanprover-community/mathlib commit 44e2ae8cffc713925494e4975ee31ec1d06929b3
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -19,6 +19,9 @@ import Mathbin.Order.GaloisConnection
/-!
# Subgroupoid
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
This file defines subgroupoids as `structure`s containing the subsets of arrows and their
stability under composition and inversion.
Also defined are:
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -88,6 +88,7 @@ namespace Subgroupoid
variable (S : Subgroupoid C)
+#print CategoryTheory.Subgroupoid.inv_mem_iff /-
theorem inv_mem_iff {c d : C} (f : c ⟶ d) : inv f ∈ S.arrows d c ↔ f ∈ S.arrows c d :=
by
constructor
@@ -96,7 +97,9 @@ theorem inv_mem_iff {c d : C} (f : c ⟶ d) : inv f ∈ S.arrows d c ↔ f ∈ S
· apply S.inv h
· apply S.inv
#align category_theory.subgroupoid.inv_mem_iff CategoryTheory.Subgroupoid.inv_mem_iff
+-/
+#print CategoryTheory.Subgroupoid.mul_mem_cancel_left /-
theorem mul_mem_cancel_left {c d e : C} {f : c ⟶ d} {g : d ⟶ e} (hf : f ∈ S.arrows c d) :
f ≫ g ∈ S.arrows c e ↔ g ∈ S.arrows d e :=
by
@@ -107,7 +110,9 @@ theorem mul_mem_cancel_left {c d e : C} {f : c ⟶ d} {g : d ⟶ e} (hf : f ∈
· apply S.mul (S.inv hf) h
· apply S.mul hf
#align category_theory.subgroupoid.mul_mem_cancel_left CategoryTheory.Subgroupoid.mul_mem_cancel_left
+-/
+#print CategoryTheory.Subgroupoid.mul_mem_cancel_right /-
theorem mul_mem_cancel_right {c d e : C} {f : c ⟶ d} {g : d ⟶ e} (hg : g ∈ S.arrows d e) :
f ≫ g ∈ S.arrows c e ↔ f ∈ S.arrows c d :=
by
@@ -118,6 +123,7 @@ theorem mul_mem_cancel_right {c d e : C} {f : c ⟶ d} {g : d ⟶ e} (hg : g ∈
· apply S.mul h (S.inv hg)
· exact fun hf => S.mul hf hg
#align category_theory.subgroupoid.mul_mem_cancel_right CategoryTheory.Subgroupoid.mul_mem_cancel_right
+-/
#print CategoryTheory.Subgroupoid.objs /-
/-- The vertices of `C` on which `S` has non-trivial isotropy -/
@@ -126,28 +132,38 @@ def objs : Set C :=
#align category_theory.subgroupoid.objs CategoryTheory.Subgroupoid.objs
-/
+#print CategoryTheory.Subgroupoid.mem_objs_of_src /-
theorem mem_objs_of_src {c d : C} {f : c ⟶ d} (h : f ∈ S.arrows c d) : c ∈ S.objs :=
⟨f ≫ inv f, S.mul h (S.inv h)⟩
#align category_theory.subgroupoid.mem_objs_of_src CategoryTheory.Subgroupoid.mem_objs_of_src
+-/
+#print CategoryTheory.Subgroupoid.mem_objs_of_tgt /-
theorem mem_objs_of_tgt {c d : C} {f : c ⟶ d} (h : f ∈ S.arrows c d) : d ∈ S.objs :=
⟨inv f ≫ f, S.mul (S.inv h) h⟩
#align category_theory.subgroupoid.mem_objs_of_tgt CategoryTheory.Subgroupoid.mem_objs_of_tgt
+-/
+#print CategoryTheory.Subgroupoid.id_mem_of_nonempty_isotropy /-
theorem id_mem_of_nonempty_isotropy (c : C) : c ∈ objs S → 𝟙 c ∈ S.arrows c c :=
by
rintro ⟨γ, hγ⟩
convert S.mul hγ (S.inv hγ)
simp only [inv_eq_inv, is_iso.hom_inv_id]
#align category_theory.subgroupoid.id_mem_of_nonempty_isotropy CategoryTheory.Subgroupoid.id_mem_of_nonempty_isotropy
+-/
+#print CategoryTheory.Subgroupoid.id_mem_of_src /-
theorem id_mem_of_src {c d : C} {f : c ⟶ d} (h : f ∈ S.arrows c d) : 𝟙 c ∈ S.arrows c c :=
id_mem_of_nonempty_isotropy S c (mem_objs_of_src S h)
#align category_theory.subgroupoid.id_mem_of_src CategoryTheory.Subgroupoid.id_mem_of_src
+-/
+#print CategoryTheory.Subgroupoid.id_mem_of_tgt /-
theorem id_mem_of_tgt {c d : C} {f : c ⟶ d} (h : f ∈ S.arrows c d) : 𝟙 d ∈ S.arrows d d :=
id_mem_of_nonempty_isotropy S d (mem_objs_of_tgt S h)
#align category_theory.subgroupoid.id_mem_of_tgt CategoryTheory.Subgroupoid.id_mem_of_tgt
+-/
#print CategoryTheory.Subgroupoid.asWideQuiver /-
/-- A subgroupoid seen as a quiver on vertex set `C` -/
@@ -172,11 +188,13 @@ instance coe : Groupoid S.objs where
#align category_theory.subgroupoid.coe CategoryTheory.Subgroupoid.coe
-/
+#print CategoryTheory.Subgroupoid.coe_inv_coe' /-
@[simp]
theorem coe_inv_coe' {c d : S.objs} (p : c ⟶ d) :
(CategoryTheory.inv p).val = CategoryTheory.inv p.val := by
simp only [Subtype.val_eq_coe, ← inv_eq_inv, coe_inv_coe]
#align category_theory.subgroupoid.coe_inv_coe' CategoryTheory.Subgroupoid.coe_inv_coe'
+-/
#print CategoryTheory.Subgroupoid.hom /-
/-- The embedding of the coerced subgroupoid to its parent-/
@@ -188,13 +206,17 @@ def hom : S.objs ⥤ C where
#align category_theory.subgroupoid.hom CategoryTheory.Subgroupoid.hom
-/
+#print CategoryTheory.Subgroupoid.hom.inj_on_objects /-
theorem hom.inj_on_objects : Function.Injective (hom S).obj := by rintro ⟨c, hc⟩ ⟨d, hd⟩ hcd;
simp only [Subtype.mk_eq_mk]; exact hcd
#align category_theory.subgroupoid.hom.inj_on_objects CategoryTheory.Subgroupoid.hom.inj_on_objects
+-/
+#print CategoryTheory.Subgroupoid.hom.faithful /-
theorem hom.faithful : ∀ c d, Function.Injective fun f : c ⟶ d => (hom S).map f := by
rintro ⟨c, hc⟩ ⟨d, hd⟩ ⟨f, hf⟩ ⟨g, hg⟩ hfg; simp only [Subtype.mk_eq_mk]; exact hfg
#align category_theory.subgroupoid.hom.faithful CategoryTheory.Subgroupoid.hom.faithful
+-/
#print CategoryTheory.Subgroupoid.vertexSubgroup /-
/-- The subgroup of the vertex group at `c` given by the subgroupoid -/
@@ -212,26 +234,34 @@ instance : SetLike (Subgroupoid C) (Σ c d : C, c ⟶ d)
coe S := {F | F.2.2 ∈ S.arrows F.1 F.2.1}
coe_injective' := fun ⟨S, _, _⟩ ⟨T, _, _⟩ h => by ext (c d f); apply Set.ext_iff.1 h ⟨c, d, f⟩
+#print CategoryTheory.Subgroupoid.mem_iff /-
theorem mem_iff (S : Subgroupoid C) (F : Σ c d, c ⟶ d) : F ∈ S ↔ F.2.2 ∈ S.arrows F.1 F.2.1 :=
Iff.rfl
#align category_theory.subgroupoid.mem_iff CategoryTheory.Subgroupoid.mem_iff
+-/
+#print CategoryTheory.Subgroupoid.le_iff /-
theorem le_iff (S T : Subgroupoid C) : S ≤ T ↔ ∀ {c d}, S.arrows c d ⊆ T.arrows c d := by
rw [SetLike.le_def, Sigma.forall]; exact forall_congr' fun c => Sigma.forall
#align category_theory.subgroupoid.le_iff CategoryTheory.Subgroupoid.le_iff
+-/
instance : Top (Subgroupoid C) :=
⟨{ arrows := fun _ _ => Set.univ
mul := by rintro; trivial
inv := by rintro; trivial }⟩
+#print CategoryTheory.Subgroupoid.mem_top /-
theorem mem_top {c d : C} (f : c ⟶ d) : f ∈ (⊤ : Subgroupoid C).arrows c d :=
trivial
#align category_theory.subgroupoid.mem_top CategoryTheory.Subgroupoid.mem_top
+-/
+#print CategoryTheory.Subgroupoid.mem_top_objs /-
theorem mem_top_objs (c : C) : c ∈ (⊤ : Subgroupoid C).objs := by dsimp [Top.top, objs];
simp only [univ_nonempty]
#align category_theory.subgroupoid.mem_top_objs CategoryTheory.Subgroupoid.mem_top_objs
+-/
instance : Bot (Subgroupoid C) :=
⟨{ arrows := fun _ _ => ∅
@@ -270,10 +300,13 @@ instance : CompleteLattice (Subgroupoid C) :=
inf_le_left := fun R S _ => And.left
inf_le_right := fun R S _ => And.right }
+#print CategoryTheory.Subgroupoid.le_objs /-
theorem le_objs {S T : Subgroupoid C} (h : S ≤ T) : S.objs ⊆ T.objs := fun s ⟨γ, hγ⟩ =>
⟨γ, @h ⟨s, s, γ⟩ hγ⟩
#align category_theory.subgroupoid.le_objs CategoryTheory.Subgroupoid.le_objs
+-/
+#print CategoryTheory.Subgroupoid.inclusion /-
/-- The functor associated to the embedding of subgroupoids -/
def inclusion {S T : Subgroupoid C} (h : S ≤ T) : S.objs ⥤ T.objs
where
@@ -282,29 +315,40 @@ def inclusion {S T : Subgroupoid C} (h : S ≤ T) : S.objs ⥤ T.objs
map_id' _ := rfl
map_comp' _ _ _ _ _ := rfl
#align category_theory.subgroupoid.inclusion CategoryTheory.Subgroupoid.inclusion
+-/
+#print CategoryTheory.Subgroupoid.inclusion_inj_on_objects /-
theorem inclusion_inj_on_objects {S T : Subgroupoid C} (h : S ≤ T) :
Function.Injective (inclusion h).obj := fun ⟨s, hs⟩ ⟨t, ht⟩ => by
simpa only [inclusion, Subtype.mk_eq_mk] using id
#align category_theory.subgroupoid.inclusion_inj_on_objects CategoryTheory.Subgroupoid.inclusion_inj_on_objects
+-/
+#print CategoryTheory.Subgroupoid.inclusion_faithful /-
theorem inclusion_faithful {S T : Subgroupoid C} (h : S ≤ T) (s t : S.objs) :
Function.Injective fun f : s ⟶ t => (inclusion h).map f := fun ⟨f, hf⟩ ⟨g, hg⟩ => by
dsimp only [inclusion]; simpa only [Subtype.mk_eq_mk] using id
#align category_theory.subgroupoid.inclusion_faithful CategoryTheory.Subgroupoid.inclusion_faithful
+-/
+#print CategoryTheory.Subgroupoid.inclusion_refl /-
theorem inclusion_refl {S : Subgroupoid C} : inclusion (le_refl S) = 𝟭 S.objs :=
Functor.hext (fun ⟨s, hs⟩ => rfl) fun ⟨s, hs⟩ ⟨t, ht⟩ ⟨f, hf⟩ => hEq_of_eq rfl
#align category_theory.subgroupoid.inclusion_refl CategoryTheory.Subgroupoid.inclusion_refl
+-/
+#print CategoryTheory.Subgroupoid.inclusion_trans /-
theorem inclusion_trans {R S T : Subgroupoid C} (k : R ≤ S) (h : S ≤ T) :
inclusion (k.trans h) = inclusion k ⋙ inclusion h :=
rfl
#align category_theory.subgroupoid.inclusion_trans CategoryTheory.Subgroupoid.inclusion_trans
+-/
+#print CategoryTheory.Subgroupoid.inclusion_comp_embedding /-
theorem inclusion_comp_embedding {S T : Subgroupoid C} (h : S ≤ T) : inclusion h ⋙ T.Hom = S.Hom :=
rfl
#align category_theory.subgroupoid.inclusion_comp_embedding CategoryTheory.Subgroupoid.inclusion_comp_embedding
+-/
#print CategoryTheory.Subgroupoid.Discrete.Arrows /-
/-- The family of arrows of the discrete groupoid -/
@@ -322,10 +366,12 @@ def discrete : Subgroupoid C where
#align category_theory.subgroupoid.discrete CategoryTheory.Subgroupoid.discrete
-/
+#print CategoryTheory.Subgroupoid.mem_discrete_iff /-
theorem mem_discrete_iff {c d : C} (f : c ⟶ d) :
f ∈ discrete.arrows c d ↔ ∃ h : c = d, f = eqToHom h :=
⟨by rintro ⟨⟩; exact ⟨rfl, rfl⟩, by rintro ⟨rfl, rfl⟩; constructor⟩
#align category_theory.subgroupoid.mem_discrete_iff CategoryTheory.Subgroupoid.mem_discrete_iff
+-/
#print CategoryTheory.Subgroupoid.IsWide /-
/-- A subgroupoid is wide if its carrier set is all of `C`-/
@@ -334,6 +380,7 @@ structure IsWide : Prop where
#align category_theory.subgroupoid.is_wide CategoryTheory.Subgroupoid.IsWide
-/
+#print CategoryTheory.Subgroupoid.isWide_iff_objs_eq_univ /-
theorem isWide_iff_objs_eq_univ : S.IsWide ↔ S.objs = Set.univ :=
by
constructor
@@ -345,14 +392,19 @@ theorem isWide_iff_objs_eq_univ : S.IsWide ↔ S.objs = Set.univ :=
obtain ⟨γ, γS⟩ := (le_of_eq h.symm : ⊤ ⊆ S.objs) (Set.mem_univ c)
exact id_mem_of_src S γS
#align category_theory.subgroupoid.is_wide_iff_objs_eq_univ CategoryTheory.Subgroupoid.isWide_iff_objs_eq_univ
+-/
+#print CategoryTheory.Subgroupoid.IsWide.id_mem /-
theorem IsWide.id_mem {S : Subgroupoid C} (Sw : S.IsWide) (c : C) : 𝟙 c ∈ S.arrows c c :=
Sw.wide c
#align category_theory.subgroupoid.is_wide.id_mem CategoryTheory.Subgroupoid.IsWide.id_mem
+-/
+#print CategoryTheory.Subgroupoid.IsWide.eqToHom_mem /-
theorem IsWide.eqToHom_mem {S : Subgroupoid C} (Sw : S.IsWide) {c d : C} (h : c = d) :
eqToHom h ∈ S.arrows c d := by cases h; simp only [eq_to_hom_refl]; apply Sw.id_mem c
#align category_theory.subgroupoid.is_wide.eq_to_hom_mem CategoryTheory.Subgroupoid.IsWide.eqToHom_mem
+-/
#print CategoryTheory.Subgroupoid.IsNormal /-
/-- A subgroupoid is normal if it is wide and satisfies the expected stability under conjugacy. -/
@@ -361,11 +413,14 @@ structure IsNormal extends IsWide S : Prop where
#align category_theory.subgroupoid.is_normal CategoryTheory.Subgroupoid.IsNormal
-/
+#print CategoryTheory.Subgroupoid.IsNormal.conj' /-
theorem IsNormal.conj' {S : Subgroupoid C} (Sn : IsNormal S) :
∀ {c d} (p : d ⟶ c) {γ : c ⟶ c} (hs : γ ∈ S.arrows c c), p ≫ γ ≫ inv p ∈ S.arrows d d :=
fun c d p γ hs => by convert Sn.conj (inv p) hs; simp
#align category_theory.subgroupoid.is_normal.conj' CategoryTheory.Subgroupoid.IsNormal.conj'
+-/
+#print CategoryTheory.Subgroupoid.IsNormal.conjugation_bij /-
theorem IsNormal.conjugation_bij (Sn : IsNormal S) {c d} (p : c ⟶ d) :
Set.BijOn (fun γ : c ⟶ c => inv p ≫ γ ≫ p) (S.arrows c c) (S.arrows d d) :=
by
@@ -379,27 +434,36 @@ theorem IsNormal.conjugation_bij (Sn : IsNormal S) {c d} (p : c ⟶ d) :
simp only [inv_eq_inv, category.assoc, is_iso.inv_hom_id, category.comp_id,
is_iso.inv_hom_id_assoc]
#align category_theory.subgroupoid.is_normal.conjugation_bij CategoryTheory.Subgroupoid.IsNormal.conjugation_bij
+-/
+#print CategoryTheory.Subgroupoid.top_isNormal /-
theorem top_isNormal : IsNormal (⊤ : Subgroupoid C) :=
{ wide := fun c => trivial
conj := fun a b c d e => trivial }
#align category_theory.subgroupoid.top_is_normal CategoryTheory.Subgroupoid.top_isNormal
+-/
+#print CategoryTheory.Subgroupoid.sInf_isNormal /-
theorem sInf_isNormal (s : Set <| Subgroupoid C) (sn : ∀ S ∈ s, IsNormal S) : IsNormal (sInf s) :=
{ wide := by simp_rw [Inf, mem_Inter₂]; exact fun c S Ss => (sn S Ss).wide c
conj := by simp_rw [Inf, mem_Inter₂]; exact fun c d p γ hγ S Ss => (sn S Ss).conj p (hγ S Ss) }
#align category_theory.subgroupoid.Inf_is_normal CategoryTheory.Subgroupoid.sInf_isNormal
+-/
+#print CategoryTheory.Subgroupoid.discrete_isNormal /-
theorem discrete_isNormal : (@discrete C _).IsNormal :=
{ wide := fun c => by constructor
conj := fun c d f γ hγ => by cases hγ;
simp only [inv_eq_inv, category.id_comp, is_iso.inv_hom_id]; constructor }
#align category_theory.subgroupoid.discrete_is_normal CategoryTheory.Subgroupoid.discrete_isNormal
+-/
+#print CategoryTheory.Subgroupoid.IsNormal.vertexSubgroup /-
theorem IsNormal.vertexSubgroup (Sn : IsNormal S) (c : C) (cS : c ∈ S.objs) :
(S.vertexSubgroup cS).Normal :=
{ conj_mem := fun x hx y => by rw [mul_assoc]; exact Sn.conj' y hx }
#align category_theory.subgroupoid.is_normal.vertex_subgroup CategoryTheory.Subgroupoid.IsNormal.vertexSubgroup
+-/
section GeneratedSubgroupoid
@@ -413,12 +477,14 @@ def generated : Subgroupoid C :=
#align category_theory.subgroupoid.generated CategoryTheory.Subgroupoid.generated
-/
+#print CategoryTheory.Subgroupoid.subset_generated /-
theorem subset_generated (c d : C) : X c d ⊆ (generated X).arrows c d :=
by
dsimp only [generated, Inf]
simp only [subset_Inter₂_iff]
exact fun S hS f fS => hS _ _ fS
#align category_theory.subgroupoid.subset_generated CategoryTheory.Subgroupoid.subset_generated
+-/
#print CategoryTheory.Subgroupoid.generatedNormal /-
/-- The normal sugroupoid generated by the set of arrows `X` -/
@@ -427,16 +493,21 @@ def generatedNormal : Subgroupoid C :=
#align category_theory.subgroupoid.generated_normal CategoryTheory.Subgroupoid.generatedNormal
-/
+#print CategoryTheory.Subgroupoid.generated_le_generatedNormal /-
theorem generated_le_generatedNormal : generated X ≤ generatedNormal X :=
by
apply @sInf_le_sInf (subgroupoid C) _
exact fun S ⟨h, _⟩ => h
#align category_theory.subgroupoid.generated_le_generated_normal CategoryTheory.Subgroupoid.generated_le_generatedNormal
+-/
+#print CategoryTheory.Subgroupoid.generatedNormal_isNormal /-
theorem generatedNormal_isNormal : (generatedNormal X).IsNormal :=
sInf_isNormal _ fun S h => h.right
#align category_theory.subgroupoid.generated_normal_is_normal CategoryTheory.Subgroupoid.generatedNormal_isNormal
+-/
+#print CategoryTheory.Subgroupoid.IsNormal.generatedNormal_le /-
theorem IsNormal.generatedNormal_le {S : Subgroupoid C} (Sn : S.IsNormal) :
generatedNormal X ≤ S ↔ ∀ c d, X c d ⊆ S.arrows c d :=
by
@@ -449,6 +520,7 @@ theorem IsNormal.generatedNormal_le {S : Subgroupoid C} (Sn : S.IsNormal) :
apply @sInf_le (subgroupoid C) _
exact ⟨h, Sn⟩
#align category_theory.subgroupoid.is_normal.generated_normal_le CategoryTheory.Subgroupoid.IsNormal.generatedNormal_le
+-/
end GeneratedSubgroupoid
@@ -471,10 +543,13 @@ def comap (S : Subgroupoid D) : Subgroupoid C
#align category_theory.subgroupoid.comap CategoryTheory.Subgroupoid.comap
-/
+#print CategoryTheory.Subgroupoid.comap_mono /-
theorem comap_mono (S T : Subgroupoid D) : S ≤ T → comap φ S ≤ comap φ T := fun ST ⟨c, d, p⟩ =>
@ST ⟨_, _, _⟩
#align category_theory.subgroupoid.comap_mono CategoryTheory.Subgroupoid.comap_mono
+-/
+#print CategoryTheory.Subgroupoid.isNormal_comap /-
theorem isNormal_comap {S : Subgroupoid D} (Sn : IsNormal S) : IsNormal (comap φ S) :=
{ wide := fun c => by rw [comap, mem_set_of, Functor.map_id]; apply Sn.wide
conj := fun c d f γ hγ =>
@@ -482,11 +557,14 @@ theorem isNormal_comap {S : Subgroupoid D} (Sn : IsNormal S) : IsNormal (comap
simp_rw [inv_eq_inv f, comap, mem_set_of, functor.map_comp, functor.map_inv, ← inv_eq_inv]
exact Sn.conj _ hγ }
#align category_theory.subgroupoid.is_normal_comap CategoryTheory.Subgroupoid.isNormal_comap
+-/
+#print CategoryTheory.Subgroupoid.comap_comp /-
@[simp]
theorem comap_comp {E : Type _} [Groupoid E] (ψ : D ⥤ E) : comap (φ ⋙ ψ) = comap φ ∘ comap ψ :=
rfl
#align category_theory.subgroupoid.comap_comp CategoryTheory.Subgroupoid.comap_comp
+-/
#print CategoryTheory.Subgroupoid.ker /-
/-- The kernel of a functor between subgroupoid is the preimage. -/
@@ -495,25 +573,34 @@ def ker : Subgroupoid C :=
#align category_theory.subgroupoid.ker CategoryTheory.Subgroupoid.ker
-/
+#print CategoryTheory.Subgroupoid.mem_ker_iff /-
theorem mem_ker_iff {c d : C} (f : c ⟶ d) :
f ∈ (ker φ).arrows c d ↔ ∃ h : φ.obj c = φ.obj d, φ.map f = eqToHom h :=
mem_discrete_iff (φ.map f)
#align category_theory.subgroupoid.mem_ker_iff CategoryTheory.Subgroupoid.mem_ker_iff
+-/
+#print CategoryTheory.Subgroupoid.ker_isNormal /-
theorem ker_isNormal : (ker φ).IsNormal :=
isNormal_comap φ discrete_isNormal
#align category_theory.subgroupoid.ker_is_normal CategoryTheory.Subgroupoid.ker_isNormal
+-/
+#print CategoryTheory.Subgroupoid.ker_comp /-
@[simp]
theorem ker_comp {E : Type _} [Groupoid E] (ψ : D ⥤ E) : ker (φ ⋙ ψ) = comap φ (ker ψ) :=
rfl
#align category_theory.subgroupoid.ker_comp CategoryTheory.Subgroupoid.ker_comp
+-/
+#print CategoryTheory.Subgroupoid.Map.Arrows /-
/-- The family of arrows of the image of a subgroupoid under a functor injective on objects -/
inductive Map.Arrows (hφ : Function.Injective φ.obj) (S : Subgroupoid C) : ∀ c d : D, (c ⟶ d) → Prop
| im {c d : C} (f : c ⟶ d) (hf : f ∈ S.arrows c d) : map.arrows (φ.obj c) (φ.obj d) (φ.map f)
#align category_theory.subgroupoid.map.arrows CategoryTheory.Subgroupoid.Map.Arrows
+-/
+#print CategoryTheory.Subgroupoid.Map.arrows_iff /-
theorem Map.arrows_iff (hφ : Function.Injective φ.obj) (S : Subgroupoid C) {c d : D} (f : c ⟶ d) :
Map.Arrows φ hφ S c d f ↔
∃ (a b : C) (g : a ⟶ b) (ha : φ.obj a = c) (hb : φ.obj b = d) (hg : g ∈ S.arrows a b),
@@ -523,7 +610,9 @@ theorem Map.arrows_iff (hφ : Function.Injective φ.obj) (S : Subgroupoid C) {c
· rintro ⟨g, hg⟩; exact ⟨_, _, g, rfl, rfl, hg, eq_conj_eq_to_hom _⟩
· rintro ⟨a, b, g, rfl, rfl, hg, rfl⟩; rw [← eq_conj_eq_to_hom]; constructor; exact hg
#align category_theory.subgroupoid.map.arrows_iff CategoryTheory.Subgroupoid.Map.arrows_iff
+-/
+#print CategoryTheory.Subgroupoid.map /-
/-- The "forward" image of a subgroupoid under a functor injective on objects -/
def map (hφ : Function.Injective φ.obj) (S : Subgroupoid C) : Subgroupoid D
where
@@ -538,14 +627,18 @@ def map (hφ : Function.Injective φ.obj) (S : Subgroupoid C) : Subgroupoid D
cases hφ he; rw [gq, ← eq_conj_eq_to_hom, ← φ.map_comp]
constructor; exact S.mul hf hg
#align category_theory.subgroupoid.map CategoryTheory.Subgroupoid.map
+-/
+#print CategoryTheory.Subgroupoid.mem_map_iff /-
theorem mem_map_iff (hφ : Function.Injective φ.obj) (S : Subgroupoid C) {c d : D} (f : c ⟶ d) :
f ∈ (map φ hφ S).arrows c d ↔
∃ (a b : C) (g : a ⟶ b) (ha : φ.obj a = c) (hb : φ.obj b = d) (hg : g ∈ S.arrows a b),
f = eqToHom ha.symm ≫ φ.map g ≫ eqToHom hb :=
Map.arrows_iff φ hφ S f
#align category_theory.subgroupoid.mem_map_iff CategoryTheory.Subgroupoid.mem_map_iff
+-/
+#print CategoryTheory.Subgroupoid.galoisConnection_map_comap /-
theorem galoisConnection_map_comap (hφ : Function.Injective φ.obj) :
GaloisConnection (map φ hφ) (comap φ) :=
by
@@ -554,26 +647,36 @@ theorem galoisConnection_map_comap (hφ : Function.Injective φ.obj) :
· rintro h _ _ g ⟨a, gφS⟩
exact h gφS
#align category_theory.subgroupoid.galois_connection_map_comap CategoryTheory.Subgroupoid.galoisConnection_map_comap
+-/
+#print CategoryTheory.Subgroupoid.map_mono /-
theorem map_mono (hφ : Function.Injective φ.obj) (S T : Subgroupoid C) :
S ≤ T → map φ hφ S ≤ map φ hφ T := fun h => (galoisConnection_map_comap φ hφ).monotone_l h
#align category_theory.subgroupoid.map_mono CategoryTheory.Subgroupoid.map_mono
+-/
+#print CategoryTheory.Subgroupoid.le_comap_map /-
theorem le_comap_map (hφ : Function.Injective φ.obj) (S : Subgroupoid C) :
S ≤ comap φ (map φ hφ S) :=
(galoisConnection_map_comap φ hφ).le_u_l S
#align category_theory.subgroupoid.le_comap_map CategoryTheory.Subgroupoid.le_comap_map
+-/
+#print CategoryTheory.Subgroupoid.map_comap_le /-
theorem map_comap_le (hφ : Function.Injective φ.obj) (T : Subgroupoid D) :
map φ hφ (comap φ T) ≤ T :=
(galoisConnection_map_comap φ hφ).l_u_le T
#align category_theory.subgroupoid.map_comap_le CategoryTheory.Subgroupoid.map_comap_le
+-/
+#print CategoryTheory.Subgroupoid.map_le_iff_le_comap /-
theorem map_le_iff_le_comap (hφ : Function.Injective φ.obj) (S : Subgroupoid C)
(T : Subgroupoid D) : map φ hφ S ≤ T ↔ S ≤ comap φ T :=
(galoisConnection_map_comap φ hφ).le_iff_le
#align category_theory.subgroupoid.map_le_iff_le_comap CategoryTheory.Subgroupoid.map_le_iff_le_comap
+-/
+#print CategoryTheory.Subgroupoid.mem_map_objs_iff /-
theorem mem_map_objs_iff (hφ : Function.Injective φ.obj) (d : D) :
d ∈ (map φ hφ S).objs ↔ ∃ c ∈ S.objs, φ.obj c = d :=
by
@@ -586,36 +689,48 @@ theorem mem_map_objs_iff (hφ : Function.Injective φ.obj) (d : D) :
· rintro ⟨c, ⟨γ, γS⟩, rfl⟩
exact ⟨φ.map γ, ⟨γ, γS⟩⟩
#align category_theory.subgroupoid.mem_map_objs_iff CategoryTheory.Subgroupoid.mem_map_objs_iff
+-/
+#print CategoryTheory.Subgroupoid.map_objs_eq /-
@[simp]
theorem map_objs_eq (hφ : Function.Injective φ.obj) : (map φ hφ S).objs = φ.obj '' S.objs := by ext;
convert mem_map_objs_iff S φ hφ x; simp only [mem_image, exists_prop]
#align category_theory.subgroupoid.map_objs_eq CategoryTheory.Subgroupoid.map_objs_eq
+-/
+#print CategoryTheory.Subgroupoid.im /-
/-- The image of a functor injective on objects -/
def im (hφ : Function.Injective φ.obj) :=
map φ hφ ⊤
#align category_theory.subgroupoid.im CategoryTheory.Subgroupoid.im
+-/
+#print CategoryTheory.Subgroupoid.mem_im_iff /-
theorem mem_im_iff (hφ : Function.Injective φ.obj) {c d : D} (f : c ⟶ d) :
f ∈ (im φ hφ).arrows c d ↔
∃ (a b : C) (g : a ⟶ b) (ha : φ.obj a = c) (hb : φ.obj b = d),
f = eqToHom ha.symm ≫ φ.map g ≫ eqToHom hb :=
by convert map.arrows_iff φ hφ ⊤ f; simp only [Top.top, mem_univ, exists_true_left]
#align category_theory.subgroupoid.mem_im_iff CategoryTheory.Subgroupoid.mem_im_iff
+-/
+#print CategoryTheory.Subgroupoid.mem_im_objs_iff /-
theorem mem_im_objs_iff (hφ : Function.Injective φ.obj) (d : D) :
d ∈ (im φ hφ).objs ↔ ∃ c : C, φ.obj c = d := by
simp only [im, mem_map_objs_iff, mem_top_objs, exists_true_left]
#align category_theory.subgroupoid.mem_im_objs_iff CategoryTheory.Subgroupoid.mem_im_objs_iff
+-/
+#print CategoryTheory.Subgroupoid.obj_surjective_of_im_eq_top /-
theorem obj_surjective_of_im_eq_top (hφ : Function.Injective φ.obj) (hφ' : im φ hφ = ⊤) :
Function.Surjective φ.obj := by
rintro d
rw [← mem_im_objs_iff, hφ']
apply mem_top_objs
#align category_theory.subgroupoid.obj_surjective_of_im_eq_top CategoryTheory.Subgroupoid.obj_surjective_of_im_eq_top
+-/
+#print CategoryTheory.Subgroupoid.isNormal_map /-
theorem isNormal_map (hφ : Function.Injective φ.obj) (hφ' : im φ hφ = ⊤) (Sn : S.IsNormal) :
(map φ hφ S).IsNormal :=
{ wide := fun d => by
@@ -637,6 +752,7 @@ theorem isNormal_map (hφ : Function.Injective φ.obj) (hφ' : im φ hφ = ⊤)
simp only [inv_eq_inv, functor.map_comp, functor.map_inv] at this ; exact this
· constructor; apply Sn.conj f γS }
#align category_theory.subgroupoid.is_normal_map CategoryTheory.Subgroupoid.isNormal_map
+-/
end Hom
@@ -649,8 +765,10 @@ abbrev IsThin :=
#align category_theory.subgroupoid.is_thin CategoryTheory.Subgroupoid.IsThin
-/
+#print CategoryTheory.Subgroupoid.isThin_iff /-
theorem isThin_iff : S.IsThin ↔ ∀ c : S.objs, Subsingleton (S.arrows c c) := by apply is_thin_iff
#align category_theory.subgroupoid.is_thin_iff CategoryTheory.Subgroupoid.isThin_iff
+-/
end Thin
@@ -663,6 +781,7 @@ abbrev IsTotallyDisconnected :=
#align category_theory.subgroupoid.is_totally_disconnected CategoryTheory.Subgroupoid.IsTotallyDisconnected
-/
+#print CategoryTheory.Subgroupoid.isTotallyDisconnected_iff /-
theorem isTotallyDisconnected_iff :
S.IsTotallyDisconnected ↔ ∀ c d, (S.arrows c d).Nonempty → c = d :=
by
@@ -674,6 +793,7 @@ theorem isTotallyDisconnected_iff :
simp only [Subtype.mk_eq_mk]
exact h c d ⟨f, fS⟩
#align category_theory.subgroupoid.is_totally_disconnected_iff CategoryTheory.Subgroupoid.isTotallyDisconnected_iff
+-/
#print CategoryTheory.Subgroupoid.disconnect /-
/-- The isotropy subgroupoid of `S` -/
@@ -685,26 +805,36 @@ def disconnect : Subgroupoid C
#align category_theory.subgroupoid.disconnect CategoryTheory.Subgroupoid.disconnect
-/
+#print CategoryTheory.Subgroupoid.disconnect_le /-
theorem disconnect_le : S.disconnect ≤ S := by rw [le_iff]; rintro _ _ _ ⟨⟩; assumption
#align category_theory.subgroupoid.disconnect_le CategoryTheory.Subgroupoid.disconnect_le
+-/
+#print CategoryTheory.Subgroupoid.disconnect_normal /-
theorem disconnect_normal (Sn : S.IsNormal) : S.disconnect.IsNormal :=
{ wide := fun c => ⟨rfl, Sn.wide c⟩
conj := fun c d p γ ⟨_, h'⟩ => ⟨rfl, Sn.conj _ h'⟩ }
#align category_theory.subgroupoid.disconnect_normal CategoryTheory.Subgroupoid.disconnect_normal
+-/
+#print CategoryTheory.Subgroupoid.mem_disconnect_objs_iff /-
@[simp]
theorem mem_disconnect_objs_iff {c : C} : c ∈ S.disconnect.objs ↔ c ∈ S.objs :=
⟨fun ⟨γ, h, γS⟩ => ⟨γ, γS⟩, fun ⟨γ, γS⟩ => ⟨γ, rfl, γS⟩⟩
#align category_theory.subgroupoid.mem_disconnect_objs_iff CategoryTheory.Subgroupoid.mem_disconnect_objs_iff
+-/
+#print CategoryTheory.Subgroupoid.disconnect_objs /-
theorem disconnect_objs : S.disconnect.objs = S.objs := by apply Set.ext;
apply mem_disconnect_objs_iff
#align category_theory.subgroupoid.disconnect_objs CategoryTheory.Subgroupoid.disconnect_objs
+-/
+#print CategoryTheory.Subgroupoid.disconnect_isTotallyDisconnected /-
theorem disconnect_isTotallyDisconnected : S.disconnect.IsTotallyDisconnected := by
rw [is_totally_disconnected_iff]; exact fun c d ⟨f, h, fS⟩ => h
#align category_theory.subgroupoid.disconnect_is_totally_disconnected CategoryTheory.Subgroupoid.disconnect_isTotallyDisconnected
+-/
end Disconnected
@@ -721,29 +851,40 @@ def full : Subgroupoid C where
#align category_theory.subgroupoid.full CategoryTheory.Subgroupoid.full
-/
+#print CategoryTheory.Subgroupoid.full_objs /-
theorem full_objs : (full D).objs = D :=
Set.ext fun _ => ⟨fun ⟨f, h, _⟩ => h, fun h => ⟨𝟙 _, h, h⟩⟩
#align category_theory.subgroupoid.full_objs CategoryTheory.Subgroupoid.full_objs
+-/
+#print CategoryTheory.Subgroupoid.mem_full_iff /-
@[simp]
theorem mem_full_iff {c d : C} {f : c ⟶ d} : f ∈ (full D).arrows c d ↔ c ∈ D ∧ d ∈ D :=
Iff.rfl
#align category_theory.subgroupoid.mem_full_iff CategoryTheory.Subgroupoid.mem_full_iff
+-/
+#print CategoryTheory.Subgroupoid.mem_full_objs_iff /-
@[simp]
theorem mem_full_objs_iff {c : C} : c ∈ (full D).objs ↔ c ∈ D := by rw [full_objs]
#align category_theory.subgroupoid.mem_full_objs_iff CategoryTheory.Subgroupoid.mem_full_objs_iff
+-/
+#print CategoryTheory.Subgroupoid.full_empty /-
@[simp]
theorem full_empty : full ∅ = (⊥ : Subgroupoid C) := by ext;
simp only [Bot.bot, mem_full_iff, mem_empty_iff_false, and_self_iff]
#align category_theory.subgroupoid.full_empty CategoryTheory.Subgroupoid.full_empty
+-/
+#print CategoryTheory.Subgroupoid.full_univ /-
@[simp]
theorem full_univ : full Set.univ = (⊤ : Subgroupoid C) := by ext;
simp only [mem_full_iff, mem_univ, and_self_iff, true_iff_iff]
#align category_theory.subgroupoid.full_univ CategoryTheory.Subgroupoid.full_univ
+-/
+#print CategoryTheory.Subgroupoid.full_mono /-
theorem full_mono {D E : Set C} (h : D ≤ E) : full D ≤ full E :=
by
rw [le_iff]
@@ -751,10 +892,13 @@ theorem full_mono {D E : Set C} (h : D ≤ E) : full D ≤ full E :=
simp only [mem_full_iff]
exact fun ⟨hc, hd⟩ => ⟨h hc, h hd⟩
#align category_theory.subgroupoid.full_mono CategoryTheory.Subgroupoid.full_mono
+-/
+#print CategoryTheory.Subgroupoid.full_arrow_eq_iff /-
theorem full_arrow_eq_iff {c d : (full D).objs} {f g : c ⟶ d} : f = g ↔ (↑f : c.val ⟶ d.val) = ↑g :=
by apply Subtype.ext_iff
#align category_theory.subgroupoid.full_arrow_eq_iff CategoryTheory.Subgroupoid.full_arrow_eq_iff
+-/
end Full
mathlib commit https://github.com/leanprover-community/mathlib/commit/ccdbfb6e5614667af5aa3ab2d50885e0ef44a46f
@@ -70,6 +70,7 @@ universe u v
variable {C : Type u} [Groupoid C]
+#print CategoryTheory.Subgroupoid /-
/-- A sugroupoid of `C` consists of a choice of arrows for each pair of vertices, closed
under composition and inverses.
-/
@@ -79,6 +80,7 @@ structure Subgroupoid (C : Type u) [Groupoid C] where
inv : ∀ {c d} {p : c ⟶ d} (hp : p ∈ arrows c d), inv p ∈ arrows d c
mul : ∀ {c d e} {p} (hp : p ∈ arrows c d) {q} (hq : q ∈ arrows d e), p ≫ q ∈ arrows c e
#align category_theory.subgroupoid CategoryTheory.Subgroupoid
+-/
attribute [protected] subgroupoid.inv subgroupoid.mul
@@ -117,10 +119,12 @@ theorem mul_mem_cancel_right {c d e : C} {f : c ⟶ d} {g : d ⟶ e} (hg : g ∈
· exact fun hf => S.mul hf hg
#align category_theory.subgroupoid.mul_mem_cancel_right CategoryTheory.Subgroupoid.mul_mem_cancel_right
+#print CategoryTheory.Subgroupoid.objs /-
/-- The vertices of `C` on which `S` has non-trivial isotropy -/
def objs : Set C :=
{c : C | (S.arrows c c).Nonempty}
#align category_theory.subgroupoid.objs CategoryTheory.Subgroupoid.objs
+-/
theorem mem_objs_of_src {c d : C} {f : c ⟶ d} (h : f ∈ S.arrows c d) : c ∈ S.objs :=
⟨f ≫ inv f, S.mul h (S.inv h)⟩
@@ -145,11 +149,14 @@ theorem id_mem_of_tgt {c d : C} {f : c ⟶ d} (h : f ∈ S.arrows c d) : 𝟙 d
id_mem_of_nonempty_isotropy S d (mem_objs_of_tgt S h)
#align category_theory.subgroupoid.id_mem_of_tgt CategoryTheory.Subgroupoid.id_mem_of_tgt
+#print CategoryTheory.Subgroupoid.asWideQuiver /-
/-- A subgroupoid seen as a quiver on vertex set `C` -/
def asWideQuiver : Quiver C :=
⟨fun c d => Subtype <| S.arrows c d⟩
#align category_theory.subgroupoid.as_wide_quiver CategoryTheory.Subgroupoid.asWideQuiver
+-/
+#print CategoryTheory.Subgroupoid.coe /-
/-- The coercion of a subgroupoid as a groupoid -/
@[simps to_category_comp_coe, simps (config := lemmasOnly) inv_coe]
instance coe : Groupoid S.objs where
@@ -163,6 +170,7 @@ instance coe : Groupoid S.objs where
inv_comp' := fun a b ⟨p, hp⟩ => by simp only [inv_comp]
comp_inv' := fun a b ⟨p, hp⟩ => by simp only [comp_inv]
#align category_theory.subgroupoid.coe CategoryTheory.Subgroupoid.coe
+-/
@[simp]
theorem coe_inv_coe' {c d : S.objs} (p : c ⟶ d) :
@@ -170,6 +178,7 @@ theorem coe_inv_coe' {c d : S.objs} (p : c ⟶ d) :
simp only [Subtype.val_eq_coe, ← inv_eq_inv, coe_inv_coe]
#align category_theory.subgroupoid.coe_inv_coe' CategoryTheory.Subgroupoid.coe_inv_coe'
+#print CategoryTheory.Subgroupoid.hom /-
/-- The embedding of the coerced subgroupoid to its parent-/
def hom : S.objs ⥤ C where
obj c := c.val
@@ -177,6 +186,7 @@ def hom : S.objs ⥤ C where
map_id' c := rfl
map_comp' c d e f g := rfl
#align category_theory.subgroupoid.hom CategoryTheory.Subgroupoid.hom
+-/
theorem hom.inj_on_objects : Function.Injective (hom S).obj := by rintro ⟨c, hc⟩ ⟨d, hd⟩ hcd;
simp only [Subtype.mk_eq_mk]; exact hcd
@@ -186,6 +196,7 @@ theorem hom.faithful : ∀ c d, Function.Injective fun f : c ⟶ d => (hom S).ma
rintro ⟨c, hc⟩ ⟨d, hd⟩ ⟨f, hf⟩ ⟨g, hg⟩ hfg; simp only [Subtype.mk_eq_mk]; exact hfg
#align category_theory.subgroupoid.hom.faithful CategoryTheory.Subgroupoid.hom.faithful
+#print CategoryTheory.Subgroupoid.vertexSubgroup /-
/-- The subgroup of the vertex group at `c` given by the subgroupoid -/
def vertexSubgroup {c : C} (hc : c ∈ S.objs) : Subgroup (c ⟶ c)
where
@@ -194,6 +205,7 @@ def vertexSubgroup {c : C} (hc : c ∈ S.objs) : Subgroup (c ⟶ c)
one_mem' := id_mem_of_nonempty_isotropy _ _ hc
inv_mem' f hf := S.inv hf
#align category_theory.subgroupoid.vertex_subgroup CategoryTheory.Subgroupoid.vertexSubgroup
+-/
instance : SetLike (Subgroupoid C) (Σ c d : C, c ⟶ d)
where
@@ -294,27 +306,33 @@ theorem inclusion_comp_embedding {S T : Subgroupoid C} (h : S ≤ T) : inclusion
rfl
#align category_theory.subgroupoid.inclusion_comp_embedding CategoryTheory.Subgroupoid.inclusion_comp_embedding
+#print CategoryTheory.Subgroupoid.Discrete.Arrows /-
/-- The family of arrows of the discrete groupoid -/
inductive Discrete.Arrows : ∀ c d : C, (c ⟶ d) → Prop
| id (c : C) : discrete.arrows c c (𝟙 c)
#align category_theory.subgroupoid.discrete.arrows CategoryTheory.Subgroupoid.Discrete.Arrows
+-/
+#print CategoryTheory.Subgroupoid.discrete /-
/-- The only arrows of the discrete groupoid are the identity arrows. -/
def discrete : Subgroupoid C where
arrows := Discrete.Arrows
inv := by rintro _ _ _ ⟨⟩; simp only [inv_eq_inv, is_iso.inv_id]; constructor
mul := by rintro _ _ _ _ ⟨⟩ _ ⟨⟩; rw [category.comp_id]; constructor
#align category_theory.subgroupoid.discrete CategoryTheory.Subgroupoid.discrete
+-/
theorem mem_discrete_iff {c d : C} (f : c ⟶ d) :
f ∈ discrete.arrows c d ↔ ∃ h : c = d, f = eqToHom h :=
⟨by rintro ⟨⟩; exact ⟨rfl, rfl⟩, by rintro ⟨rfl, rfl⟩; constructor⟩
#align category_theory.subgroupoid.mem_discrete_iff CategoryTheory.Subgroupoid.mem_discrete_iff
+#print CategoryTheory.Subgroupoid.IsWide /-
/-- A subgroupoid is wide if its carrier set is all of `C`-/
structure IsWide : Prop where
wide : ∀ c, 𝟙 c ∈ S.arrows c c
#align category_theory.subgroupoid.is_wide CategoryTheory.Subgroupoid.IsWide
+-/
theorem isWide_iff_objs_eq_univ : S.IsWide ↔ S.objs = Set.univ :=
by
@@ -336,10 +354,12 @@ theorem IsWide.eqToHom_mem {S : Subgroupoid C} (Sw : S.IsWide) {c d : C} (h : c
eqToHom h ∈ S.arrows c d := by cases h; simp only [eq_to_hom_refl]; apply Sw.id_mem c
#align category_theory.subgroupoid.is_wide.eq_to_hom_mem CategoryTheory.Subgroupoid.IsWide.eqToHom_mem
+#print CategoryTheory.Subgroupoid.IsNormal /-
/-- A subgroupoid is normal if it is wide and satisfies the expected stability under conjugacy. -/
structure IsNormal extends IsWide S : Prop where
conj : ∀ {c d} (p : c ⟶ d) {γ : c ⟶ c} (hs : γ ∈ S.arrows c c), inv p ≫ γ ≫ p ∈ S.arrows d d
#align category_theory.subgroupoid.is_normal CategoryTheory.Subgroupoid.IsNormal
+-/
theorem IsNormal.conj' {S : Subgroupoid C} (Sn : IsNormal S) :
∀ {c d} (p : d ⟶ c) {γ : c ⟶ c} (hs : γ ∈ S.arrows c c), p ≫ γ ≫ inv p ∈ S.arrows d d :=
@@ -386,10 +406,12 @@ section GeneratedSubgroupoid
-- TODO: proof that generated is just "words in X" and generated_normal is similarly
variable (X : ∀ c d : C, Set (c ⟶ d))
+#print CategoryTheory.Subgroupoid.generated /-
/-- The subgropoid generated by the set of arrows `X` -/
def generated : Subgroupoid C :=
sInf {S : Subgroupoid C | ∀ c d, X c d ⊆ S.arrows c d}
#align category_theory.subgroupoid.generated CategoryTheory.Subgroupoid.generated
+-/
theorem subset_generated (c d : C) : X c d ⊆ (generated X).arrows c d :=
by
@@ -398,10 +420,12 @@ theorem subset_generated (c d : C) : X c d ⊆ (generated X).arrows c d :=
exact fun S hS f fS => hS _ _ fS
#align category_theory.subgroupoid.subset_generated CategoryTheory.Subgroupoid.subset_generated
+#print CategoryTheory.Subgroupoid.generatedNormal /-
/-- The normal sugroupoid generated by the set of arrows `X` -/
def generatedNormal : Subgroupoid C :=
sInf {S : Subgroupoid C | (∀ c d, X c d ⊆ S.arrows c d) ∧ S.IsNormal}
#align category_theory.subgroupoid.generated_normal CategoryTheory.Subgroupoid.generatedNormal
+-/
theorem generated_le_generatedNormal : generated X ≤ generatedNormal X :=
by
@@ -432,6 +456,7 @@ section Hom
variable {D : Type _} [Groupoid D] (φ : C ⥤ D)
+#print CategoryTheory.Subgroupoid.comap /-
/-- A functor between groupoid defines a map of subgroupoids in the reverse direction
by taking preimages.
-/
@@ -444,6 +469,7 @@ def comap (S : Subgroupoid D) : Subgroupoid C
simp only [mem_set_of, functor.map_comp]
apply S.mul <;> assumption
#align category_theory.subgroupoid.comap CategoryTheory.Subgroupoid.comap
+-/
theorem comap_mono (S T : Subgroupoid D) : S ≤ T → comap φ S ≤ comap φ T := fun ST ⟨c, d, p⟩ =>
@ST ⟨_, _, _⟩
@@ -462,10 +488,12 @@ theorem comap_comp {E : Type _} [Groupoid E] (ψ : D ⥤ E) : comap (φ ⋙ ψ)
rfl
#align category_theory.subgroupoid.comap_comp CategoryTheory.Subgroupoid.comap_comp
+#print CategoryTheory.Subgroupoid.ker /-
/-- The kernel of a functor between subgroupoid is the preimage. -/
def ker : Subgroupoid C :=
comap φ discrete
#align category_theory.subgroupoid.ker CategoryTheory.Subgroupoid.ker
+-/
theorem mem_ker_iff {c d : C} (f : c ⟶ d) :
f ∈ (ker φ).arrows c d ↔ ∃ h : φ.obj c = φ.obj d, φ.map f = eqToHom h :=
@@ -614,10 +642,12 @@ end Hom
section Thin
+#print CategoryTheory.Subgroupoid.IsThin /-
/-- A subgroupoid `is_thin` if it has at most one arrow between any two vertices. -/
abbrev IsThin :=
Quiver.IsThin S.objs
#align category_theory.subgroupoid.is_thin CategoryTheory.Subgroupoid.IsThin
+-/
theorem isThin_iff : S.IsThin ↔ ∀ c : S.objs, Subsingleton (S.arrows c c) := by apply is_thin_iff
#align category_theory.subgroupoid.is_thin_iff CategoryTheory.Subgroupoid.isThin_iff
@@ -626,10 +656,12 @@ end Thin
section Disconnected
+#print CategoryTheory.Subgroupoid.IsTotallyDisconnected /-
/-- A subgroupoid `is_totally_disconnected` if it has only isotropy arrows. -/
abbrev IsTotallyDisconnected :=
IsTotallyDisconnected S.objs
#align category_theory.subgroupoid.is_totally_disconnected CategoryTheory.Subgroupoid.IsTotallyDisconnected
+-/
theorem isTotallyDisconnected_iff :
S.IsTotallyDisconnected ↔ ∀ c d, (S.arrows c d).Nonempty → c = d :=
@@ -643,6 +675,7 @@ theorem isTotallyDisconnected_iff :
exact h c d ⟨f, fS⟩
#align category_theory.subgroupoid.is_totally_disconnected_iff CategoryTheory.Subgroupoid.isTotallyDisconnected_iff
+#print CategoryTheory.Subgroupoid.disconnect /-
/-- The isotropy subgroupoid of `S` -/
def disconnect : Subgroupoid C
where
@@ -650,6 +683,7 @@ def disconnect : Subgroupoid C
inv := by rintro _ _ _ ⟨rfl, h⟩; exact ⟨rfl, S.inv h⟩
mul := by rintro _ _ _ _ ⟨rfl, h⟩ _ ⟨rfl, h'⟩; exact ⟨rfl, S.mul h h'⟩
#align category_theory.subgroupoid.disconnect CategoryTheory.Subgroupoid.disconnect
+-/
theorem disconnect_le : S.disconnect ≤ S := by rw [le_iff]; rintro _ _ _ ⟨⟩; assumption
#align category_theory.subgroupoid.disconnect_le CategoryTheory.Subgroupoid.disconnect_le
@@ -678,12 +712,14 @@ section Full
variable (D : Set C)
+#print CategoryTheory.Subgroupoid.full /-
/-- The full subgroupoid on a set `D : set C` -/
def full : Subgroupoid C where
arrows c d _ := c ∈ D ∧ d ∈ D
inv := by rintro _ _ _ ⟨⟩; constructor <;> assumption
mul := by rintro _ _ _ _ ⟨⟩ _ ⟨⟩; constructor <;> assumption
#align category_theory.subgroupoid.full CategoryTheory.Subgroupoid.full
+-/
theorem full_objs : (full D).objs = D :=
Set.ext fun _ => ⟨fun ⟨f, h, _⟩ => h, fun h => ⟨𝟙 _, h, h⟩⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -119,7 +119,7 @@ theorem mul_mem_cancel_right {c d e : C} {f : c ⟶ d} {g : d ⟶ e} (hg : g ∈
/-- The vertices of `C` on which `S` has non-trivial isotropy -/
def objs : Set C :=
- { c : C | (S.arrows c c).Nonempty }
+ {c : C | (S.arrows c c).Nonempty}
#align category_theory.subgroupoid.objs CategoryTheory.Subgroupoid.objs
theorem mem_objs_of_src {c d : C} {f : c ⟶ d} (h : f ∈ S.arrows c d) : c ∈ S.objs :=
@@ -197,7 +197,7 @@ def vertexSubgroup {c : C} (hc : c ∈ S.objs) : Subgroup (c ⟶ c)
instance : SetLike (Subgroupoid C) (Σ c d : C, c ⟶ d)
where
- coe S := { F | F.2.2 ∈ S.arrows F.1 F.2.1 }
+ coe S := {F | F.2.2 ∈ S.arrows F.1 F.2.1}
coe_injective' := fun ⟨S, _, _⟩ ⟨T, _, _⟩ h => by ext (c d f); apply Set.ext_iff.1 h ⟨c, d, f⟩
theorem mem_iff (S : Subgroupoid C) (F : Σ c d, c ⟶ d) : F ∈ S ↔ F.2.2 ∈ S.arrows F.1 F.2.1 :=
@@ -388,7 +388,7 @@ variable (X : ∀ c d : C, Set (c ⟶ d))
/-- The subgropoid generated by the set of arrows `X` -/
def generated : Subgroupoid C :=
- sInf { S : Subgroupoid C | ∀ c d, X c d ⊆ S.arrows c d }
+ sInf {S : Subgroupoid C | ∀ c d, X c d ⊆ S.arrows c d}
#align category_theory.subgroupoid.generated CategoryTheory.Subgroupoid.generated
theorem subset_generated (c d : C) : X c d ⊆ (generated X).arrows c d :=
@@ -400,7 +400,7 @@ theorem subset_generated (c d : C) : X c d ⊆ (generated X).arrows c d :=
/-- The normal sugroupoid generated by the set of arrows `X` -/
def generatedNormal : Subgroupoid C :=
- sInf { S : Subgroupoid C | (∀ c d, X c d ⊆ S.arrows c d) ∧ S.IsNormal }
+ sInf {S : Subgroupoid C | (∀ c d, X c d ⊆ S.arrows c d) ∧ S.IsNormal}
#align category_theory.subgroupoid.generated_normal CategoryTheory.Subgroupoid.generatedNormal
theorem generated_le_generatedNormal : generated X ≤ generatedNormal X :=
@@ -437,7 +437,7 @@ by taking preimages.
-/
def comap (S : Subgroupoid D) : Subgroupoid C
where
- arrows c d := { f : c ⟶ d | φ.map f ∈ S.arrows (φ.obj c) (φ.obj d) }
+ arrows c d := {f : c ⟶ d | φ.map f ∈ S.arrows (φ.obj c) (φ.obj d)}
inv c d p hp := by rw [mem_set_of, inv_eq_inv, φ.map_inv p, ← inv_eq_inv]; exact S.inv hp
mul := by
rintro
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -195,12 +195,12 @@ def vertexSubgroup {c : C} (hc : c ∈ S.objs) : Subgroup (c ⟶ c)
inv_mem' f hf := S.inv hf
#align category_theory.subgroupoid.vertex_subgroup CategoryTheory.Subgroupoid.vertexSubgroup
-instance : SetLike (Subgroupoid C) (Σc d : C, c ⟶ d)
+instance : SetLike (Subgroupoid C) (Σ c d : C, c ⟶ d)
where
coe S := { F | F.2.2 ∈ S.arrows F.1 F.2.1 }
coe_injective' := fun ⟨S, _, _⟩ ⟨T, _, _⟩ h => by ext (c d f); apply Set.ext_iff.1 h ⟨c, d, f⟩
-theorem mem_iff (S : Subgroupoid C) (F : Σc d, c ⟶ d) : F ∈ S ↔ F.2.2 ∈ S.arrows F.1 F.2.1 :=
+theorem mem_iff (S : Subgroupoid C) (F : Σ c d, c ⟶ d) : F ∈ S ↔ F.2.2 ∈ S.arrows F.1 F.2.1 :=
Iff.rfl
#align category_theory.subgroupoid.mem_iff CategoryTheory.Subgroupoid.mem_iff
@@ -238,8 +238,8 @@ instance : Inf (Subgroupoid C) :=
instance : InfSet (Subgroupoid C) :=
⟨fun s =>
{ arrows := fun c d => ⋂ S ∈ s, Subgroupoid.arrows S c d
- inv := by intros ; rw [mem_Inter₂] at hp⊢; exact fun S hS => S.inv (hp S hS)
- mul := by intros ; rw [mem_Inter₂] at hp hq⊢; exact fun S hS => S.mul (hp S hS) (hq S hS) }⟩
+ inv := by intros; rw [mem_Inter₂] at hp ⊢; exact fun S hS => S.inv (hp S hS)
+ mul := by intros; rw [mem_Inter₂] at hp hq ⊢; exact fun S hS => S.mul (hp S hS) (hq S hS) }⟩
instance : CompleteLattice (Subgroupoid C) :=
{
@@ -247,7 +247,7 @@ instance : CompleteLattice (Subgroupoid C) :=
(by
refine' fun s => ⟨fun S Ss F => _, fun T Tl F fT => _⟩ <;>
simp only [Inf, mem_iff, mem_Inter]
- exacts[fun hp => hp S Ss, fun S Ss =>
+ exacts [fun hp => hp S Ss, fun S Ss =>
Tl Ss fT]) with
bot := ⊥
bot_le := fun S => empty_subset _
@@ -419,7 +419,7 @@ theorem IsNormal.generatedNormal_le {S : Subgroupoid C} (Sn : S.IsNormal) :
constructor
· rintro h c d
let h' := generated_le_generated_normal X
- rw [le_iff] at h h'
+ rw [le_iff] at h h'
exact ((subset_generated X c d).trans (@h' c d)).trans (@h c d)
· rintro h
apply @sInf_le (subgroupoid C) _
@@ -488,7 +488,7 @@ inductive Map.Arrows (hφ : Function.Injective φ.obj) (S : Subgroupoid C) : ∀
theorem Map.arrows_iff (hφ : Function.Injective φ.obj) (S : Subgroupoid C) {c d : D} (f : c ⟶ d) :
Map.Arrows φ hφ S c d f ↔
- ∃ (a b : C)(g : a ⟶ b)(ha : φ.obj a = c)(hb : φ.obj b = d)(hg : g ∈ S.arrows a b),
+ ∃ (a b : C) (g : a ⟶ b) (ha : φ.obj a = c) (hb : φ.obj b = d) (hg : g ∈ S.arrows a b),
f = eqToHom ha.symm ≫ φ.map g ≫ eqToHom hb :=
by
constructor
@@ -513,7 +513,7 @@ def map (hφ : Function.Injective φ.obj) (S : Subgroupoid C) : Subgroupoid D
theorem mem_map_iff (hφ : Function.Injective φ.obj) (S : Subgroupoid C) {c d : D} (f : c ⟶ d) :
f ∈ (map φ hφ S).arrows c d ↔
- ∃ (a b : C)(g : a ⟶ b)(ha : φ.obj a = c)(hb : φ.obj b = d)(hg : g ∈ S.arrows a b),
+ ∃ (a b : C) (g : a ⟶ b) (ha : φ.obj a = c) (hb : φ.obj b = d) (hg : g ∈ S.arrows a b),
f = eqToHom ha.symm ≫ φ.map g ≫ eqToHom hb :=
Map.arrows_iff φ hφ S f
#align category_theory.subgroupoid.mem_map_iff CategoryTheory.Subgroupoid.mem_map_iff
@@ -552,7 +552,7 @@ theorem mem_map_objs_iff (hφ : Function.Injective φ.obj) (d : D) :
dsimp [objs, map]
constructor
· rintro ⟨f, hf⟩
- change map.arrows φ hφ S d d f at hf; rw [map.arrows_iff] at hf
+ change map.arrows φ hφ S d d f at hf ; rw [map.arrows_iff] at hf
obtain ⟨c, d, g, ec, ed, eg, gS, eg⟩ := hf
exact ⟨c, ⟨mem_objs_of_src S eg, ec⟩⟩
· rintro ⟨c, ⟨γ, γS⟩, rfl⟩
@@ -571,7 +571,7 @@ def im (hφ : Function.Injective φ.obj) :=
theorem mem_im_iff (hφ : Function.Injective φ.obj) {c d : D} (f : c ⟶ d) :
f ∈ (im φ hφ).arrows c d ↔
- ∃ (a b : C)(g : a ⟶ b)(ha : φ.obj a = c)(hb : φ.obj b = d),
+ ∃ (a b : C) (g : a ⟶ b) (ha : φ.obj a = c) (hb : φ.obj b = d),
f = eqToHom ha.symm ≫ φ.map g ≫ eqToHom hb :=
by convert map.arrows_iff φ hφ ⊤ f; simp only [Top.top, mem_univ, exists_true_left]
#align category_theory.subgroupoid.mem_im_iff CategoryTheory.Subgroupoid.mem_im_iff
@@ -595,18 +595,18 @@ theorem isNormal_map (hφ : Function.Injective φ.obj) (hφ' : im φ hφ = ⊤)
change map.arrows φ hφ S _ _ (𝟙 _); rw [← Functor.map_id]
constructor; exact Sn.wide c
conj := fun d d' g δ hδ => by
- rw [mem_map_iff] at hδ
+ rw [mem_map_iff] at hδ
obtain ⟨c, c', γ, cd, cd', γS, hγ⟩ := hδ; subst_vars; cases hφ cd'
have : d' ∈ (im φ hφ).objs := by rw [hφ']; apply mem_top_objs
- rw [mem_im_objs_iff] at this
+ rw [mem_im_objs_iff] at this
obtain ⟨c', rfl⟩ := this
have : g ∈ (im φ hφ).arrows (φ.obj c) (φ.obj c') := by rw [hφ']; trivial
- rw [mem_im_iff] at this
+ rw [mem_im_iff] at this
obtain ⟨b, b', f, hb, hb', _, hf⟩ := this; subst_vars; cases hφ hb; cases hφ hb'
change map.arrows φ hφ S (φ.obj c') (φ.obj c') _
simp only [eq_to_hom_refl, category.comp_id, category.id_comp, inv_eq_inv]
suffices map.arrows φ hφ S (φ.obj c') (φ.obj c') (φ.map <| inv f ≫ γ ≫ f) by
- simp only [inv_eq_inv, functor.map_comp, functor.map_inv] at this; exact this
+ simp only [inv_eq_inv, functor.map_comp, functor.map_inv] at this ; exact this
· constructor; apply Sn.conj f γS }
#align category_theory.subgroupoid.is_normal_map CategoryTheory.Subgroupoid.isNormal_map
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -178,18 +178,12 @@ def hom : S.objs ⥤ C where
map_comp' c d e f g := rfl
#align category_theory.subgroupoid.hom CategoryTheory.Subgroupoid.hom
-theorem hom.inj_on_objects : Function.Injective (hom S).obj :=
- by
- rintro ⟨c, hc⟩ ⟨d, hd⟩ hcd
- simp only [Subtype.mk_eq_mk]
- exact hcd
+theorem hom.inj_on_objects : Function.Injective (hom S).obj := by rintro ⟨c, hc⟩ ⟨d, hd⟩ hcd;
+ simp only [Subtype.mk_eq_mk]; exact hcd
#align category_theory.subgroupoid.hom.inj_on_objects CategoryTheory.Subgroupoid.hom.inj_on_objects
-theorem hom.faithful : ∀ c d, Function.Injective fun f : c ⟶ d => (hom S).map f :=
- by
- rintro ⟨c, hc⟩ ⟨d, hd⟩ ⟨f, hf⟩ ⟨g, hg⟩ hfg
- simp only [Subtype.mk_eq_mk]
- exact hfg
+theorem hom.faithful : ∀ c d, Function.Injective fun f : c ⟶ d => (hom S).map f := by
+ rintro ⟨c, hc⟩ ⟨d, hd⟩ ⟨f, hf⟩ ⟨g, hg⟩ hfg; simp only [Subtype.mk_eq_mk]; exact hfg
#align category_theory.subgroupoid.hom.faithful CategoryTheory.Subgroupoid.hom.faithful
/-- The subgroup of the vertex group at `c` given by the subgroupoid -/
@@ -204,37 +198,26 @@ def vertexSubgroup {c : C} (hc : c ∈ S.objs) : Subgroup (c ⟶ c)
instance : SetLike (Subgroupoid C) (Σc d : C, c ⟶ d)
where
coe S := { F | F.2.2 ∈ S.arrows F.1 F.2.1 }
- coe_injective' := fun ⟨S, _, _⟩ ⟨T, _, _⟩ h =>
- by
- ext (c d f)
- apply Set.ext_iff.1 h ⟨c, d, f⟩
+ coe_injective' := fun ⟨S, _, _⟩ ⟨T, _, _⟩ h => by ext (c d f); apply Set.ext_iff.1 h ⟨c, d, f⟩
theorem mem_iff (S : Subgroupoid C) (F : Σc d, c ⟶ d) : F ∈ S ↔ F.2.2 ∈ S.arrows F.1 F.2.1 :=
Iff.rfl
#align category_theory.subgroupoid.mem_iff CategoryTheory.Subgroupoid.mem_iff
-theorem le_iff (S T : Subgroupoid C) : S ≤ T ↔ ∀ {c d}, S.arrows c d ⊆ T.arrows c d :=
- by
- rw [SetLike.le_def, Sigma.forall]
- exact forall_congr' fun c => Sigma.forall
+theorem le_iff (S T : Subgroupoid C) : S ≤ T ↔ ∀ {c d}, S.arrows c d ⊆ T.arrows c d := by
+ rw [SetLike.le_def, Sigma.forall]; exact forall_congr' fun c => Sigma.forall
#align category_theory.subgroupoid.le_iff CategoryTheory.Subgroupoid.le_iff
instance : Top (Subgroupoid C) :=
⟨{ arrows := fun _ _ => Set.univ
- mul := by
- rintro
- trivial
- inv := by
- rintro
- trivial }⟩
+ mul := by rintro; trivial
+ inv := by rintro; trivial }⟩
theorem mem_top {c d : C} (f : c ⟶ d) : f ∈ (⊤ : Subgroupoid C).arrows c d :=
trivial
#align category_theory.subgroupoid.mem_top CategoryTheory.Subgroupoid.mem_top
-theorem mem_top_objs (c : C) : c ∈ (⊤ : Subgroupoid C).objs :=
- by
- dsimp [Top.top, objs]
+theorem mem_top_objs (c : C) : c ∈ (⊤ : Subgroupoid C).objs := by dsimp [Top.top, objs];
simp only [univ_nonempty]
#align category_theory.subgroupoid.mem_top_objs CategoryTheory.Subgroupoid.mem_top_objs
@@ -249,24 +232,14 @@ instance : Inhabited (Subgroupoid C) :=
instance : Inf (Subgroupoid C) :=
⟨fun S T =>
{ arrows := fun c d => S.arrows c d ∩ T.arrows c d
- inv := by
- rintro
- exact ⟨S.inv hp.1, T.inv hp.2⟩
- mul := by
- rintro
- exact ⟨S.mul hp.1 hq.1, T.mul hp.2 hq.2⟩ }⟩
+ inv := by rintro; exact ⟨S.inv hp.1, T.inv hp.2⟩
+ mul := by rintro; exact ⟨S.mul hp.1 hq.1, T.mul hp.2 hq.2⟩ }⟩
instance : InfSet (Subgroupoid C) :=
⟨fun s =>
{ arrows := fun c d => ⋂ S ∈ s, Subgroupoid.arrows S c d
- inv := by
- intros
- rw [mem_Inter₂] at hp⊢
- exact fun S hS => S.inv (hp S hS)
- mul := by
- intros
- rw [mem_Inter₂] at hp hq⊢
- exact fun S hS => S.mul (hp S hS) (hq S hS) }⟩
+ inv := by intros ; rw [mem_Inter₂] at hp⊢; exact fun S hS => S.inv (hp S hS)
+ mul := by intros ; rw [mem_Inter₂] at hp hq⊢; exact fun S hS => S.mul (hp S hS) (hq S hS) }⟩
instance : CompleteLattice (Subgroupoid C) :=
{
@@ -304,10 +277,8 @@ theorem inclusion_inj_on_objects {S T : Subgroupoid C} (h : S ≤ T) :
#align category_theory.subgroupoid.inclusion_inj_on_objects CategoryTheory.Subgroupoid.inclusion_inj_on_objects
theorem inclusion_faithful {S T : Subgroupoid C} (h : S ≤ T) (s t : S.objs) :
- Function.Injective fun f : s ⟶ t => (inclusion h).map f := fun ⟨f, hf⟩ ⟨g, hg⟩ =>
- by
- dsimp only [inclusion]
- simpa only [Subtype.mk_eq_mk] using id
+ Function.Injective fun f : s ⟶ t => (inclusion h).map f := fun ⟨f, hf⟩ ⟨g, hg⟩ => by
+ dsimp only [inclusion]; simpa only [Subtype.mk_eq_mk] using id
#align category_theory.subgroupoid.inclusion_faithful CategoryTheory.Subgroupoid.inclusion_faithful
theorem inclusion_refl {S : Subgroupoid C} : inclusion (le_refl S) = 𝟭 S.objs :=
@@ -331,23 +302,13 @@ inductive Discrete.Arrows : ∀ c d : C, (c ⟶ d) → Prop
/-- The only arrows of the discrete groupoid are the identity arrows. -/
def discrete : Subgroupoid C where
arrows := Discrete.Arrows
- inv := by
- rintro _ _ _ ⟨⟩
- simp only [inv_eq_inv, is_iso.inv_id]
- constructor
- mul := by
- rintro _ _ _ _ ⟨⟩ _ ⟨⟩
- rw [category.comp_id]
- constructor
+ inv := by rintro _ _ _ ⟨⟩; simp only [inv_eq_inv, is_iso.inv_id]; constructor
+ mul := by rintro _ _ _ _ ⟨⟩ _ ⟨⟩; rw [category.comp_id]; constructor
#align category_theory.subgroupoid.discrete CategoryTheory.Subgroupoid.discrete
theorem mem_discrete_iff {c d : C} (f : c ⟶ d) :
f ∈ discrete.arrows c d ↔ ∃ h : c = d, f = eqToHom h :=
- ⟨by
- rintro ⟨⟩
- exact ⟨rfl, rfl⟩, by
- rintro ⟨rfl, rfl⟩
- constructor⟩
+ ⟨by rintro ⟨⟩; exact ⟨rfl, rfl⟩, by rintro ⟨rfl, rfl⟩; constructor⟩
#align category_theory.subgroupoid.mem_discrete_iff CategoryTheory.Subgroupoid.mem_discrete_iff
/-- A subgroupoid is wide if its carrier set is all of `C`-/
@@ -359,8 +320,7 @@ theorem isWide_iff_objs_eq_univ : S.IsWide ↔ S.objs = Set.univ :=
by
constructor
· rintro h
- ext
- constructor <;> simp only [top_eq_univ, mem_univ, imp_true_iff, forall_true_left]
+ ext; constructor <;> simp only [top_eq_univ, mem_univ, imp_true_iff, forall_true_left]
apply mem_objs_of_src S (h.wide x)
· rintro h
refine' ⟨fun c => _⟩
@@ -373,10 +333,7 @@ theorem IsWide.id_mem {S : Subgroupoid C} (Sw : S.IsWide) (c : C) : 𝟙 c ∈ S
#align category_theory.subgroupoid.is_wide.id_mem CategoryTheory.Subgroupoid.IsWide.id_mem
theorem IsWide.eqToHom_mem {S : Subgroupoid C} (Sw : S.IsWide) {c d : C} (h : c = d) :
- eqToHom h ∈ S.arrows c d := by
- cases h
- simp only [eq_to_hom_refl]
- apply Sw.id_mem c
+ eqToHom h ∈ S.arrows c d := by cases h; simp only [eq_to_hom_refl]; apply Sw.id_mem c
#align category_theory.subgroupoid.is_wide.eq_to_hom_mem CategoryTheory.Subgroupoid.IsWide.eqToHom_mem
/-- A subgroupoid is normal if it is wide and satisfies the expected stability under conjugacy. -/
@@ -386,9 +343,7 @@ structure IsNormal extends IsWide S : Prop where
theorem IsNormal.conj' {S : Subgroupoid C} (Sn : IsNormal S) :
∀ {c d} (p : d ⟶ c) {γ : c ⟶ c} (hs : γ ∈ S.arrows c c), p ≫ γ ≫ inv p ∈ S.arrows d d :=
- fun c d p γ hs => by
- convert Sn.conj (inv p) hs
- simp
+ fun c d p γ hs => by convert Sn.conj (inv p) hs; simp
#align category_theory.subgroupoid.is_normal.conj' CategoryTheory.Subgroupoid.IsNormal.conj'
theorem IsNormal.conjugation_bij (Sn : IsNormal S) {c d} (p : c ⟶ d) :
@@ -411,28 +366,19 @@ theorem top_isNormal : IsNormal (⊤ : Subgroupoid C) :=
#align category_theory.subgroupoid.top_is_normal CategoryTheory.Subgroupoid.top_isNormal
theorem sInf_isNormal (s : Set <| Subgroupoid C) (sn : ∀ S ∈ s, IsNormal S) : IsNormal (sInf s) :=
- { wide := by
- simp_rw [Inf, mem_Inter₂]
- exact fun c S Ss => (sn S Ss).wide c
- conj := by
- simp_rw [Inf, mem_Inter₂]
- exact fun c d p γ hγ S Ss => (sn S Ss).conj p (hγ S Ss) }
+ { wide := by simp_rw [Inf, mem_Inter₂]; exact fun c S Ss => (sn S Ss).wide c
+ conj := by simp_rw [Inf, mem_Inter₂]; exact fun c d p γ hγ S Ss => (sn S Ss).conj p (hγ S Ss) }
#align category_theory.subgroupoid.Inf_is_normal CategoryTheory.Subgroupoid.sInf_isNormal
theorem discrete_isNormal : (@discrete C _).IsNormal :=
{ wide := fun c => by constructor
- conj := fun c d f γ hγ => by
- cases hγ
- simp only [inv_eq_inv, category.id_comp, is_iso.inv_hom_id]
- constructor }
+ conj := fun c d f γ hγ => by cases hγ;
+ simp only [inv_eq_inv, category.id_comp, is_iso.inv_hom_id]; constructor }
#align category_theory.subgroupoid.discrete_is_normal CategoryTheory.Subgroupoid.discrete_isNormal
theorem IsNormal.vertexSubgroup (Sn : IsNormal S) (c : C) (cS : c ∈ S.objs) :
(S.vertexSubgroup cS).Normal :=
- {
- conj_mem := fun x hx y => by
- rw [mul_assoc]
- exact Sn.conj' y hx }
+ { conj_mem := fun x hx y => by rw [mul_assoc]; exact Sn.conj' y hx }
#align category_theory.subgroupoid.is_normal.vertex_subgroup CategoryTheory.Subgroupoid.IsNormal.vertexSubgroup
section GeneratedSubgroupoid
@@ -492,9 +438,7 @@ by taking preimages.
def comap (S : Subgroupoid D) : Subgroupoid C
where
arrows c d := { f : c ⟶ d | φ.map f ∈ S.arrows (φ.obj c) (φ.obj d) }
- inv c d p hp := by
- rw [mem_set_of, inv_eq_inv, φ.map_inv p, ← inv_eq_inv]
- exact S.inv hp
+ inv c d p hp := by rw [mem_set_of, inv_eq_inv, φ.map_inv p, ← inv_eq_inv]; exact S.inv hp
mul := by
rintro
simp only [mem_set_of, functor.map_comp]
@@ -506,9 +450,7 @@ theorem comap_mono (S T : Subgroupoid D) : S ≤ T → comap φ S ≤ comap φ T
#align category_theory.subgroupoid.comap_mono CategoryTheory.Subgroupoid.comap_mono
theorem isNormal_comap {S : Subgroupoid D} (Sn : IsNormal S) : IsNormal (comap φ S) :=
- { wide := fun c => by
- rw [comap, mem_set_of, Functor.map_id]
- apply Sn.wide
+ { wide := fun c => by rw [comap, mem_set_of, Functor.map_id]; apply Sn.wide
conj := fun c d f γ hγ =>
by
simp_rw [inv_eq_inv f, comap, mem_set_of, functor.map_comp, functor.map_inv, ← inv_eq_inv]
@@ -550,12 +492,8 @@ theorem Map.arrows_iff (hφ : Function.Injective φ.obj) (S : Subgroupoid C) {c
f = eqToHom ha.symm ≫ φ.map g ≫ eqToHom hb :=
by
constructor
- · rintro ⟨g, hg⟩
- exact ⟨_, _, g, rfl, rfl, hg, eq_conj_eq_to_hom _⟩
- · rintro ⟨a, b, g, rfl, rfl, hg, rfl⟩
- rw [← eq_conj_eq_to_hom]
- constructor
- exact hg
+ · rintro ⟨g, hg⟩; exact ⟨_, _, g, rfl, rfl, hg, eq_conj_eq_to_hom _⟩
+ · rintro ⟨a, b, g, rfl, rfl, hg, rfl⟩; rw [← eq_conj_eq_to_hom]; constructor; exact hg
#align category_theory.subgroupoid.map.arrows_iff CategoryTheory.Subgroupoid.Map.arrows_iff
/-- The "forward" image of a subgroupoid under a functor injective on objects -/
@@ -614,8 +552,7 @@ theorem mem_map_objs_iff (hφ : Function.Injective φ.obj) (d : D) :
dsimp [objs, map]
constructor
· rintro ⟨f, hf⟩
- change map.arrows φ hφ S d d f at hf
- rw [map.arrows_iff] at hf
+ change map.arrows φ hφ S d d f at hf; rw [map.arrows_iff] at hf
obtain ⟨c, d, g, ec, ed, eg, gS, eg⟩ := hf
exact ⟨c, ⟨mem_objs_of_src S eg, ec⟩⟩
· rintro ⟨c, ⟨γ, γS⟩, rfl⟩
@@ -623,11 +560,8 @@ theorem mem_map_objs_iff (hφ : Function.Injective φ.obj) (d : D) :
#align category_theory.subgroupoid.mem_map_objs_iff CategoryTheory.Subgroupoid.mem_map_objs_iff
@[simp]
-theorem map_objs_eq (hφ : Function.Injective φ.obj) : (map φ hφ S).objs = φ.obj '' S.objs :=
- by
- ext
- convert mem_map_objs_iff S φ hφ x
- simp only [mem_image, exists_prop]
+theorem map_objs_eq (hφ : Function.Injective φ.obj) : (map φ hφ S).objs = φ.obj '' S.objs := by ext;
+ convert mem_map_objs_iff S φ hφ x; simp only [mem_image, exists_prop]
#align category_theory.subgroupoid.map_objs_eq CategoryTheory.Subgroupoid.map_objs_eq
/-- The image of a functor injective on objects -/
@@ -639,9 +573,7 @@ theorem mem_im_iff (hφ : Function.Injective φ.obj) {c d : D} (f : c ⟶ d) :
f ∈ (im φ hφ).arrows c d ↔
∃ (a b : C)(g : a ⟶ b)(ha : φ.obj a = c)(hb : φ.obj b = d),
f = eqToHom ha.symm ≫ φ.map g ≫ eqToHom hb :=
- by
- convert map.arrows_iff φ hφ ⊤ f
- simp only [Top.top, mem_univ, exists_true_left]
+ by convert map.arrows_iff φ hφ ⊤ f; simp only [Top.top, mem_univ, exists_true_left]
#align category_theory.subgroupoid.mem_im_iff CategoryTheory.Subgroupoid.mem_im_iff
theorem mem_im_objs_iff (hφ : Function.Injective φ.obj) (d : D) :
@@ -660,37 +592,22 @@ theorem isNormal_map (hφ : Function.Injective φ.obj) (hφ' : im φ hφ = ⊤)
(map φ hφ S).IsNormal :=
{ wide := fun d => by
obtain ⟨c, rfl⟩ := obj_surjective_of_im_eq_top φ hφ hφ' d
- change map.arrows φ hφ S _ _ (𝟙 _)
- rw [← Functor.map_id]
- constructor
- exact Sn.wide c
+ change map.arrows φ hφ S _ _ (𝟙 _); rw [← Functor.map_id]
+ constructor; exact Sn.wide c
conj := fun d d' g δ hδ => by
rw [mem_map_iff] at hδ
- obtain ⟨c, c', γ, cd, cd', γS, hγ⟩ := hδ
- subst_vars
- cases hφ cd'
- have : d' ∈ (im φ hφ).objs := by
- rw [hφ']
- apply mem_top_objs
+ obtain ⟨c, c', γ, cd, cd', γS, hγ⟩ := hδ; subst_vars; cases hφ cd'
+ have : d' ∈ (im φ hφ).objs := by rw [hφ']; apply mem_top_objs
rw [mem_im_objs_iff] at this
obtain ⟨c', rfl⟩ := this
- have : g ∈ (im φ hφ).arrows (φ.obj c) (φ.obj c') :=
- by
- rw [hφ']
- trivial
+ have : g ∈ (im φ hφ).arrows (φ.obj c) (φ.obj c') := by rw [hφ']; trivial
rw [mem_im_iff] at this
- obtain ⟨b, b', f, hb, hb', _, hf⟩ := this
- subst_vars
- cases hφ hb
- cases hφ hb'
+ obtain ⟨b, b', f, hb, hb', _, hf⟩ := this; subst_vars; cases hφ hb; cases hφ hb'
change map.arrows φ hφ S (φ.obj c') (φ.obj c') _
simp only [eq_to_hom_refl, category.comp_id, category.id_comp, inv_eq_inv]
- suffices map.arrows φ hφ S (φ.obj c') (φ.obj c') (φ.map <| inv f ≫ γ ≫ f)
- by
- simp only [inv_eq_inv, functor.map_comp, functor.map_inv] at this
- exact this
- · constructor
- apply Sn.conj f γS }
+ suffices map.arrows φ hφ S (φ.obj c') (φ.obj c') (φ.map <| inv f ≫ γ ≫ f) by
+ simp only [inv_eq_inv, functor.map_comp, functor.map_inv] at this; exact this
+ · constructor; apply Sn.conj f γS }
#align category_theory.subgroupoid.is_normal_map CategoryTheory.Subgroupoid.isNormal_map
end Hom
@@ -730,18 +647,11 @@ theorem isTotallyDisconnected_iff :
def disconnect : Subgroupoid C
where
arrows c d f := c = d ∧ f ∈ S.arrows c d
- inv := by
- rintro _ _ _ ⟨rfl, h⟩
- exact ⟨rfl, S.inv h⟩
- mul := by
- rintro _ _ _ _ ⟨rfl, h⟩ _ ⟨rfl, h'⟩
- exact ⟨rfl, S.mul h h'⟩
+ inv := by rintro _ _ _ ⟨rfl, h⟩; exact ⟨rfl, S.inv h⟩
+ mul := by rintro _ _ _ _ ⟨rfl, h⟩ _ ⟨rfl, h'⟩; exact ⟨rfl, S.mul h h'⟩
#align category_theory.subgroupoid.disconnect CategoryTheory.Subgroupoid.disconnect
-theorem disconnect_le : S.disconnect ≤ S := by
- rw [le_iff]
- rintro _ _ _ ⟨⟩
- assumption
+theorem disconnect_le : S.disconnect ≤ S := by rw [le_iff]; rintro _ _ _ ⟨⟩; assumption
#align category_theory.subgroupoid.disconnect_le CategoryTheory.Subgroupoid.disconnect_le
theorem disconnect_normal (Sn : S.IsNormal) : S.disconnect.IsNormal :=
@@ -754,16 +664,12 @@ theorem mem_disconnect_objs_iff {c : C} : c ∈ S.disconnect.objs ↔ c ∈ S.ob
⟨fun ⟨γ, h, γS⟩ => ⟨γ, γS⟩, fun ⟨γ, γS⟩ => ⟨γ, rfl, γS⟩⟩
#align category_theory.subgroupoid.mem_disconnect_objs_iff CategoryTheory.Subgroupoid.mem_disconnect_objs_iff
-theorem disconnect_objs : S.disconnect.objs = S.objs :=
- by
- apply Set.ext
+theorem disconnect_objs : S.disconnect.objs = S.objs := by apply Set.ext;
apply mem_disconnect_objs_iff
#align category_theory.subgroupoid.disconnect_objs CategoryTheory.Subgroupoid.disconnect_objs
-theorem disconnect_isTotallyDisconnected : S.disconnect.IsTotallyDisconnected :=
- by
- rw [is_totally_disconnected_iff]
- exact fun c d ⟨f, h, fS⟩ => h
+theorem disconnect_isTotallyDisconnected : S.disconnect.IsTotallyDisconnected := by
+ rw [is_totally_disconnected_iff]; exact fun c d ⟨f, h, fS⟩ => h
#align category_theory.subgroupoid.disconnect_is_totally_disconnected CategoryTheory.Subgroupoid.disconnect_isTotallyDisconnected
end Disconnected
@@ -775,12 +681,8 @@ variable (D : Set C)
/-- The full subgroupoid on a set `D : set C` -/
def full : Subgroupoid C where
arrows c d _ := c ∈ D ∧ d ∈ D
- inv := by
- rintro _ _ _ ⟨⟩
- constructor <;> assumption
- mul := by
- rintro _ _ _ _ ⟨⟩ _ ⟨⟩
- constructor <;> assumption
+ inv := by rintro _ _ _ ⟨⟩; constructor <;> assumption
+ mul := by rintro _ _ _ _ ⟨⟩ _ ⟨⟩; constructor <;> assumption
#align category_theory.subgroupoid.full CategoryTheory.Subgroupoid.full
theorem full_objs : (full D).objs = D :=
@@ -797,16 +699,12 @@ theorem mem_full_objs_iff {c : C} : c ∈ (full D).objs ↔ c ∈ D := by rw [fu
#align category_theory.subgroupoid.mem_full_objs_iff CategoryTheory.Subgroupoid.mem_full_objs_iff
@[simp]
-theorem full_empty : full ∅ = (⊥ : Subgroupoid C) :=
- by
- ext
+theorem full_empty : full ∅ = (⊥ : Subgroupoid C) := by ext;
simp only [Bot.bot, mem_full_iff, mem_empty_iff_false, and_self_iff]
#align category_theory.subgroupoid.full_empty CategoryTheory.Subgroupoid.full_empty
@[simp]
-theorem full_univ : full Set.univ = (⊤ : Subgroupoid C) :=
- by
- ext
+theorem full_univ : full Set.univ = (⊤ : Subgroupoid C) := by ext;
simp only [mem_full_iff, mem_univ, and_self_iff, true_iff_iff]
#align category_theory.subgroupoid.full_univ CategoryTheory.Subgroupoid.full_univ
mathlib commit https://github.com/leanprover-community/mathlib/commit/e3fb84046afd187b710170887195d50bada934ee
@@ -410,14 +410,14 @@ theorem top_isNormal : IsNormal (⊤ : Subgroupoid C) :=
conj := fun a b c d e => trivial }
#align category_theory.subgroupoid.top_is_normal CategoryTheory.Subgroupoid.top_isNormal
-theorem infₛ_isNormal (s : Set <| Subgroupoid C) (sn : ∀ S ∈ s, IsNormal S) : IsNormal (infₛ s) :=
+theorem sInf_isNormal (s : Set <| Subgroupoid C) (sn : ∀ S ∈ s, IsNormal S) : IsNormal (sInf s) :=
{ wide := by
simp_rw [Inf, mem_Inter₂]
exact fun c S Ss => (sn S Ss).wide c
conj := by
simp_rw [Inf, mem_Inter₂]
exact fun c d p γ hγ S Ss => (sn S Ss).conj p (hγ S Ss) }
-#align category_theory.subgroupoid.Inf_is_normal CategoryTheory.Subgroupoid.infₛ_isNormal
+#align category_theory.subgroupoid.Inf_is_normal CategoryTheory.Subgroupoid.sInf_isNormal
theorem discrete_isNormal : (@discrete C _).IsNormal :=
{ wide := fun c => by constructor
@@ -442,7 +442,7 @@ variable (X : ∀ c d : C, Set (c ⟶ d))
/-- The subgropoid generated by the set of arrows `X` -/
def generated : Subgroupoid C :=
- infₛ { S : Subgroupoid C | ∀ c d, X c d ⊆ S.arrows c d }
+ sInf { S : Subgroupoid C | ∀ c d, X c d ⊆ S.arrows c d }
#align category_theory.subgroupoid.generated CategoryTheory.Subgroupoid.generated
theorem subset_generated (c d : C) : X c d ⊆ (generated X).arrows c d :=
@@ -454,17 +454,17 @@ theorem subset_generated (c d : C) : X c d ⊆ (generated X).arrows c d :=
/-- The normal sugroupoid generated by the set of arrows `X` -/
def generatedNormal : Subgroupoid C :=
- infₛ { S : Subgroupoid C | (∀ c d, X c d ⊆ S.arrows c d) ∧ S.IsNormal }
+ sInf { S : Subgroupoid C | (∀ c d, X c d ⊆ S.arrows c d) ∧ S.IsNormal }
#align category_theory.subgroupoid.generated_normal CategoryTheory.Subgroupoid.generatedNormal
theorem generated_le_generatedNormal : generated X ≤ generatedNormal X :=
by
- apply @infₛ_le_infₛ (subgroupoid C) _
+ apply @sInf_le_sInf (subgroupoid C) _
exact fun S ⟨h, _⟩ => h
#align category_theory.subgroupoid.generated_le_generated_normal CategoryTheory.Subgroupoid.generated_le_generatedNormal
theorem generatedNormal_isNormal : (generatedNormal X).IsNormal :=
- infₛ_isNormal _ fun S h => h.right
+ sInf_isNormal _ fun S h => h.right
#align category_theory.subgroupoid.generated_normal_is_normal CategoryTheory.Subgroupoid.generatedNormal_isNormal
theorem IsNormal.generatedNormal_le {S : Subgroupoid C} (Sn : S.IsNormal) :
@@ -476,7 +476,7 @@ theorem IsNormal.generatedNormal_le {S : Subgroupoid C} (Sn : S.IsNormal) :
rw [le_iff] at h h'
exact ((subset_generated X c d).trans (@h' c d)).trans (@h c d)
· rintro h
- apply @infₛ_le (subgroupoid C) _
+ apply @sInf_le (subgroupoid C) _
exact ⟨h, Sn⟩
#align category_theory.subgroupoid.is_normal.generated_normal_le CategoryTheory.Subgroupoid.IsNormal.generatedNormal_le
mathlib commit https://github.com/leanprover-community/mathlib/commit/9da1b3534b65d9661eb8f42443598a92bbb49211
@@ -246,7 +246,7 @@ instance : Bot (Subgroupoid C) :=
instance : Inhabited (Subgroupoid C) :=
⟨⊤⟩
-instance : HasInf (Subgroupoid C) :=
+instance : Inf (Subgroupoid C) :=
⟨fun S T =>
{ arrows := fun c d => S.arrows c d ∩ T.arrows c d
inv := by
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -94,7 +94,7 @@ theorem mul_mem_cancel_left {c d e : C} {f : c ⟶ d} {g : d ⟶ e} (hf : f ∈
· rintro h
suffices Groupoid.inv f ≫ f ≫ g ∈ S.arrows d e by
simpa only [inv_eq_inv, IsIso.inv_hom_id_assoc] using this
- · apply S.mul (S.inv hf) h
+ apply S.mul (S.inv hf) h
· apply S.mul hf
#align category_theory.subgroupoid.mul_mem_cancel_left CategoryTheory.Subgroupoid.mul_mem_cancel_left
@@ -104,7 +104,7 @@ theorem mul_mem_cancel_right {c d e : C} {f : c ⟶ d} {g : d ⟶ e} (hg : g ∈
· rintro h
suffices (f ≫ g) ≫ Groupoid.inv g ∈ S.arrows c d by
simpa only [inv_eq_inv, IsIso.hom_inv_id, Category.comp_id, Category.assoc] using this
- · apply S.mul h (S.inv hg)
+ apply S.mul h (S.inv hg)
· exact fun hf => S.mul hf hg
#align category_theory.subgroupoid.mul_mem_cancel_right CategoryTheory.Subgroupoid.mul_mem_cancel_right
@@ -590,7 +590,7 @@ theorem isNormal_map (hφ : Function.Injective φ.obj) (hφ' : im φ hφ = ⊤)
simp only [eqToHom_refl, Category.comp_id, Category.id_comp, inv_eq_inv]
suffices Map.Arrows φ hφ S (φ.obj c') (φ.obj c') (φ.map <| Groupoid.inv f ≫ γ ≫ f) by
simp only [inv_eq_inv, Functor.map_comp, Functor.map_inv] at this; exact this
- · constructor; apply Sn.conj f γS }
+ constructor; apply Sn.conj f γS }
#align category_theory.subgroupoid.is_normal_map CategoryTheory.Subgroupoid.isNormal_map
end Hom
@@ -585,7 +585,7 @@ theorem isNormal_map (hφ : Function.Injective φ.obj) (hφ' : im φ hφ = ⊤)
obtain ⟨c', rfl⟩ := this
have : g ∈ (im φ hφ).arrows (φ.obj c) (φ.obj c') := by rw [hφ']; trivial
rw [mem_im_iff] at this
- obtain ⟨b, b', f, hb, hb', _, hf⟩ := this; subst_vars; cases hφ hb; cases hφ hb'
+ obtain ⟨b, b', f, hb, hb', _, hf⟩ := this; cases hφ hb; cases hφ hb'
change Map.Arrows φ hφ S (φ.obj c') (φ.obj c') _
simp only [eqToHom_refl, Category.comp_id, Category.id_comp, inv_eq_inv]
suffices Map.Arrows φ hφ S (φ.obj c') (φ.obj c') (φ.map <| Groupoid.inv f ≫ γ ≫ f) by
@@ -232,7 +232,7 @@ instance : InfSet (Subgroupoid C) :=
rw [mem_iInter₂] at hp hq ⊢;
exact fun S hS => S.mul (hp S hS) (hq S hS) }⟩
--- Porting note: new lemma
+-- Porting note (#10756): new lemma
theorem mem_sInf_arrows {s : Set (Subgroupoid C)} {c d : C} {p : c ⟶ d} :
p ∈ (sInf s).arrows c d ↔ ∀ S ∈ s, p ∈ S.arrows c d :=
mem_iInter₂
Homogenises porting notes via capitalisation and addition of whitespace.
It makes the following changes:
@@ -232,7 +232,7 @@ instance : InfSet (Subgroupoid C) :=
rw [mem_iInter₂] at hp hq ⊢;
exact fun S hS => S.mul (hp S hS) (hq S hS) }⟩
--- porting note: new lemma
+-- Porting note: new lemma
theorem mem_sInf_arrows {s : Set (Subgroupoid C)} {c d : C} {p : c ⟶ d} :
p ∈ (sInf s).arrows c d ↔ ∀ S ∈ s, p ∈ S.arrows c d :=
mem_iInter₂
@@ -273,7 +273,7 @@ theorem inclusion_inj_on_objects {S T : Subgroupoid C} (h : S ≤ T) :
theorem inclusion_faithful {S T : Subgroupoid C} (h : S ≤ T) (s t : S.objs) :
Function.Injective fun f : s ⟶ t => (inclusion h).map f := fun ⟨f, hf⟩ ⟨g, hg⟩ => by
- -- porting note: was `...; simpa only [Subtype.mk_eq_mk] using id`
+ -- Porting note: was `...; simpa only [Subtype.mk_eq_mk] using id`
dsimp only [inclusion]; rw [Subtype.mk_eq_mk, Subtype.mk_eq_mk]; exact id
#align category_theory.subgroupoid.inclusion_faithful CategoryTheory.Subgroupoid.inclusion_faithful
@@ -698,7 +698,7 @@ theorem full_mono {D E : Set C} (h : D ≤ E) : full D ≤ full E := by
exact fun ⟨hc, hd⟩ => ⟨h hc, h hd⟩
#align category_theory.subgroupoid.full_mono CategoryTheory.Subgroupoid.full_mono
--- porting note: using `.1` instead of `↑`
+-- Porting note: using `.1` instead of `↑`
theorem full_arrow_eq_iff {c d : (full D).objs} {f g : c ⟶ d} :
f = g ↔ (f.1 : c.val ⟶ d.val) = g.1 :=
Subtype.ext_iff
This is the supremum of
along with some minor fixes from failures on nightly-testing as Mathlib master
is merged into it.
Note that some PRs for changes that are already compatible with the current toolchain and will be necessary have already been split out: #8380.
I am hopeful that in future we will be able to progressively merge adaptation PRs into a bump/v4.X.0
branch, so we never end up with a "big merge" like this. However one of these adaptation PRs (#8056) predates my new scheme for combined CI, and it wasn't possible to keep that PR viable in the meantime.
In particular this includes adjustments for the Lean PRs
We can get rid of all the
local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue [lean4#2220](https://github.com/leanprover/lean4/pull/2220)
macros across Mathlib (and in any projects that want to write natural number powers of reals).
Changes the default behaviour of simp
to (config := {decide := false})
. This makes simp
(and consequentially norm_num
) less powerful, but also more consistent, and less likely to blow up in long failures. This requires a variety of changes: changing some previously by simp
or norm_num
to decide
or rfl
, or adding (config := {decide := true})
.
This changed the behaviour of simp
so that simp [f]
will only unfold "fully applied" occurrences of f
. The old behaviour can be recovered with simp (config := { unfoldPartialApp := true })
. We may in future add a syntax for this, e.g. simp [!f]
; please provide feedback! In the meantime, we have made the following changes:
(config := { unfoldPartialApp := true })
in some places, to recover the old behaviour@[eqns]
to manually adjust the equation lemmas for a particular definition, recovering the old behaviour just for that definition. See #8371, where we do this for Function.comp
and Function.flip
.This change in Lean may require further changes down the line (e.g. adding the !f
syntax, and/or upstreaming the special treatment for Function.comp
and Function.flip
, and/or removing this special treatment). Please keep an open and skeptical mind about these changes!
Co-authored-by: leanprover-community-mathlib4-bot <leanprover-community-mathlib4-bot@users.noreply.github.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Mauricio Collares <mauricio@collares.org>
@@ -688,7 +688,7 @@ theorem full_empty : full ∅ = (⊥ : Subgroupoid C) := by
@[simp]
theorem full_univ : full Set.univ = (⊤ : Subgroupoid C) := by
ext
- simp only [mem_full_iff, mem_univ, mem_top]
+ simp only [mem_full_iff, mem_univ, and_self, mem_top]
#align category_theory.subgroupoid.full_univ CategoryTheory.Subgroupoid.full_univ
theorem full_mono {D E : Set C} (h : D ≤ E) : full D ≤ full E := by
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -419,7 +419,7 @@ end GeneratedSubgroupoid
section Hom
-variable {D : Type _} [Groupoid D] (φ : C ⥤ D)
+variable {D : Type*} [Groupoid D] (φ : C ⥤ D)
/-- A functor between groupoid defines a map of subgroupoids in the reverse direction
by taking preimages.
@@ -445,7 +445,7 @@ theorem isNormal_comap {S : Subgroupoid D} (Sn : IsNormal S) : IsNormal (comap
#align category_theory.subgroupoid.is_normal_comap CategoryTheory.Subgroupoid.isNormal_comap
@[simp]
-theorem comap_comp {E : Type _} [Groupoid E] (ψ : D ⥤ E) : comap (φ ⋙ ψ) = comap φ ∘ comap ψ :=
+theorem comap_comp {E : Type*} [Groupoid E] (ψ : D ⥤ E) : comap (φ ⋙ ψ) = comap φ ∘ comap ψ :=
rfl
#align category_theory.subgroupoid.comap_comp CategoryTheory.Subgroupoid.comap_comp
@@ -464,7 +464,7 @@ theorem ker_isNormal : (ker φ).IsNormal :=
#align category_theory.subgroupoid.ker_is_normal CategoryTheory.Subgroupoid.ker_isNormal
@[simp]
-theorem ker_comp {E : Type _} [Groupoid E] (ψ : D ⥤ E) : ker (φ ⋙ ψ) = comap φ (ker ψ) :=
+theorem ker_comp {E : Type*} [Groupoid E] (ψ : D ⥤ E) : ker (φ ⋙ ψ) = comap φ (ker ψ) :=
rfl
#align category_theory.subgroupoid.ker_comp CategoryTheory.Subgroupoid.ker_comp
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 ⟨⟨_, _⟩, _⟩
.@@ -484,7 +484,7 @@ theorem Map.arrows_iff (hφ : Function.Injective φ.obj) (S : Subgroupoid C) {c
/-- The "forward" image of a subgroupoid under a functor injective on objects -/
def map (hφ : Function.Injective φ.obj) (S : Subgroupoid C) : Subgroupoid D where
- arrows := Map.Arrows φ hφ S
+ arrows c d := {x | Map.Arrows φ hφ S c d x}
inv := by
rintro _ _ _ ⟨⟩
rw [inv_eq_inv, ← Functor.map_inv, ← inv_eq_inv]
@@ -628,7 +628,7 @@ theorem isTotallyDisconnected_iff :
/-- The isotropy subgroupoid of `S` -/
def disconnect : Subgroupoid C where
- arrows c d f := c = d ∧ f ∈ S.arrows c d
+ arrows c d := {f | c = d ∧ f ∈ S.arrows c d}
inv := by rintro _ _ _ ⟨rfl, h⟩; exact ⟨rfl, S.inv h⟩
mul := by rintro _ _ _ _ ⟨rfl, h⟩ _ ⟨rfl, h'⟩; exact ⟨rfl, S.mul h h'⟩
#align category_theory.subgroupoid.disconnect CategoryTheory.Subgroupoid.disconnect
@@ -661,7 +661,7 @@ variable (D : Set C)
/-- The full subgroupoid on a set `D : Set C` -/
def full : Subgroupoid C where
- arrows c d _ := c ∈ D ∧ d ∈ D
+ arrows c d := {_f | c ∈ D ∧ d ∈ D}
inv := by rintro _ _ _ ⟨⟩; constructor <;> assumption
mul := by rintro _ _ _ _ ⟨⟩ _ ⟨⟩; constructor <;> assumption
#align category_theory.subgroupoid.full CategoryTheory.Subgroupoid.full
@@ -2,11 +2,6 @@
Copyright (c) 2022 Rémi Bottinelli. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Rémi Bottinelli, Junyan Xu
-
-! This file was ported from Lean 3 source module category_theory.groupoid.subgroupoid
-! leanprover-community/mathlib commit 70fd9563a21e7b963887c9360bd29b2393e6225a
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.CategoryTheory.Groupoid.VertexGroup
import Mathlib.CategoryTheory.Groupoid.Basic
@@ -16,6 +11,8 @@ import Mathlib.Data.Set.Lattice
import Mathlib.GroupTheory.Subgroup.Basic
import Mathlib.Order.GaloisConnection
+#align_import category_theory.groupoid.subgroupoid from "leanprover-community/mathlib"@"70fd9563a21e7b963887c9360bd29b2393e6225a"
+
/-!
# Subgroupoid
@@ -172,7 +172,7 @@ theorem hom.inj_on_objects : Function.Injective (hom S).obj := by
#align category_theory.subgroupoid.hom.inj_on_objects CategoryTheory.Subgroupoid.hom.inj_on_objects
theorem hom.faithful : ∀ c d, Function.Injective fun f : c ⟶ d => (hom S).map f := by
- rintro ⟨c, hc⟩ ⟨d, hd⟩ ⟨f, hf⟩ ⟨g, hg⟩ hfg; exact Subtype.eq hfg
+ rintro ⟨c, hc⟩ ⟨d, hd⟩ ⟨f, hf⟩ ⟨g, hg⟩ hfg; exact Subtype.eq hfg
#align category_theory.subgroupoid.hom.faithful CategoryTheory.Subgroupoid.hom.faithful
/-- The subgroup of the vertex group at `c` given by the subgroupoid -/
This is the second half of the changes originally in #5699, removing all occurrences of ;
after a space and implementing a linter rule to enforce it.
In most cases this 2-character substring has a space after it, so the following command was run first:
find . -type f -name "*.lean" -exec sed -i -E 's/ ; /; /g' {} \;
The remaining cases were few enough in number that they were done manually.
@@ -538,7 +538,7 @@ theorem mem_map_objs_iff (hφ : Function.Injective φ.obj) (d : D) :
dsimp [objs, map]
constructor
· rintro ⟨f, hf⟩
- change Map.Arrows φ hφ S d d f at hf ; rw [Map.arrows_iff] at hf
+ change Map.Arrows φ hφ S d d f at hf; rw [Map.arrows_iff] at hf
obtain ⟨c, d, g, ec, ed, eg, gS, eg⟩ := hf
exact ⟨c, ⟨mem_objs_of_src S eg, ec⟩⟩
· rintro ⟨c, ⟨γ, γS⟩, rfl⟩
@@ -592,7 +592,7 @@ theorem isNormal_map (hφ : Function.Injective φ.obj) (hφ' : im φ hφ = ⊤)
change Map.Arrows φ hφ S (φ.obj c') (φ.obj c') _
simp only [eqToHom_refl, Category.comp_id, Category.id_comp, inv_eq_inv]
suffices Map.Arrows φ hφ S (φ.obj c') (φ.obj c') (φ.map <| Groupoid.inv f ≫ γ ≫ f) by
- simp only [inv_eq_inv, Functor.map_comp, Functor.map_inv] at this ; exact this
+ simp only [inv_eq_inv, Functor.map_comp, Functor.map_inv] at this; exact this
· constructor; apply Sn.conj f γS }
#align category_theory.subgroupoid.is_normal_map CategoryTheory.Subgroupoid.isNormal_map
@@ -45,8 +45,8 @@ Given a type `C` with associated `groupoid C` instance.
## Implementation details
-The structure of this file is copied from/inspired by `Mathlib/GroupTheory.Subgroup.Basic`
-and `Mathlib/Combinatorics/SimpleGraph/Subgraph`.
+The structure of this file is copied from/inspired by `Mathlib/GroupTheory/Subgroup/Basic.lean`
+and `Mathlib/Combinatorics/SimpleGraph/Subgraph.lean`.
## TODO
@@ -411,7 +411,7 @@ theorem IsNormal.generatedNormal_le {S : Subgroupoid C} (Sn : S.IsNormal) :
constructor
· rintro h c d
have h' := generated_le_generatedNormal X
- rw [le_iff] at h h'
+ rw [le_iff] at h h'
exact ((subset_generated X c d).trans (@h' c d)).trans (@h c d)
· rintro h
apply @sInf_le (Subgroupoid C) _
@@ -538,7 +538,7 @@ theorem mem_map_objs_iff (hφ : Function.Injective φ.obj) (d : D) :
dsimp [objs, map]
constructor
· rintro ⟨f, hf⟩
- change Map.Arrows φ hφ S d d f at hf ; rw [Map.arrows_iff] at hf
+ change Map.Arrows φ hφ S d d f at hf ; rw [Map.arrows_iff] at hf
obtain ⟨c, d, g, ec, ed, eg, gS, eg⟩ := hf
exact ⟨c, ⟨mem_objs_of_src S eg, ec⟩⟩
· rintro ⟨c, ⟨γ, γS⟩, rfl⟩
@@ -581,13 +581,13 @@ theorem isNormal_map (hφ : Function.Injective φ.obj) (hφ' : im φ hφ = ⊤)
change Map.Arrows φ hφ S _ _ (𝟙 _); rw [← Functor.map_id]
constructor; exact Sn.wide c
conj := fun {d d'} g δ hδ => by
- rw [mem_map_iff] at hδ
+ rw [mem_map_iff] at hδ
obtain ⟨c, c', γ, cd, cd', γS, hγ⟩ := hδ; subst_vars; cases hφ cd'
have : d' ∈ (im φ hφ).objs := by rw [hφ']; apply mem_top_objs
- rw [mem_im_objs_iff] at this
+ rw [mem_im_objs_iff] at this
obtain ⟨c', rfl⟩ := this
have : g ∈ (im φ hφ).arrows (φ.obj c) (φ.obj c') := by rw [hφ']; trivial
- rw [mem_im_iff] at this
+ rw [mem_im_iff] at this
obtain ⟨b, b', f, hb, hb', _, hf⟩ := this; subst_vars; cases hφ hb; cases hφ hb'
change Map.Arrows φ hφ S (φ.obj c') (φ.obj c') _
simp only [eqToHom_refl, Category.comp_id, Category.id_comp, inv_eq_inv]
@@ -712,4 +712,3 @@ end Full
end Subgroupoid
end CategoryTheory
-
The unported dependencies are