Theorem: ModuleCat.directLimitIsColimit_desc
File: Mathlib/Algebra/Category/ModuleCat/Limits.lean

Proof steps:
state_before: R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
i j : ι
h : i ≤ j
x : G i
⊢ (s.ι.app j) ((f i j h) x) = (s.ι.app i) x
state_after: R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
i j : ι
h : i ≤ j
x : G i
⊢ (s.ι.app j) ((f i j h) x) = ((directLimitDiagram G f).map (homOfLE h) ≫ s.ι.app j) x
tactic: rw [← s.w (homOfLE h)]
state_before: R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
i j : ι
h : i ≤ j
x : G i
⊢ (s.ι.app j) ((f i j h) x) = ((directLimitDiagram G f).map (homOfLE h) ≫ s.ι.app j) x
state_after: no goals
tactic: rfl
state_before: R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
i : ι
⊢ (directLimitCocone G f).ι.app i ≫ (fun s => DirectLimit.lift R ι G f s.ι.app ⋯) s = s.ι.app i
state_after: case h
R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
i : ι
⊢ ∀ (x : ↑((directLimitDiagram G f).obj i)),
    ((directLimitCocone G f).ι.app i ≫ (fun s => DirectLimit.lift R ι G f s.ι.app ⋯) s) x = (s.ι.app i) x
tactic: apply LinearMap.ext
state_before: case h
R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
i : ι
⊢ ∀ (x : ↑((directLimitDiagram G f).obj i)),
    ((directLimitCocone G f).ι.app i ≫ (fun s => DirectLimit.lift R ι G f s.ι.app ⋯) s) x = (s.ι.app i) x
state_after: case h
R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
i : ι
x : ↑((directLimitDiagram G f).obj i)
⊢ ((directLimitCocone G f).ι.app i ≫ (fun s => DirectLimit.lift R ι G f s.ι.app ⋯) s) x = (s.ι.app i) x
tactic: intro x
state_before: case h
R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
i : ι
x : ↑((directLimitDiagram G f).obj i)
⊢ ((directLimitCocone G f).ι.app i ≫ (fun s => DirectLimit.lift R ι G f s.ι.app ⋯) s) x = (s.ι.app i) x
state_after: case h
R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
i : ι
x : ↑((directLimitDiagram G f).obj i)
⊢ (DirectLimit.lift R ι G f s.ι.app ⋯ ∘ₗ DirectLimit.of R ι G f i) x = (s.ι.app i) x
tactic: dsimp only [directLimitCocone, CategoryStruct.comp]
state_before: case h
R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
i : ι
x : ↑((directLimitDiagram G f).obj i)
⊢ (DirectLimit.lift R ι G f s.ι.app ⋯ ∘ₗ DirectLimit.of R ι G f i) x = (s.ι.app i) x
state_after: case h
R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
i : ι
x : ↑((directLimitDiagram G f).obj i)
⊢ (DirectLimit.lift R ι G f s.ι.app ⋯) ((DirectLimit.of R ι G f i) x) = (s.ι.app i) x
tactic: rw [LinearMap.comp_apply]
state_before: case h
R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
i : ι
x : ↑((directLimitDiagram G f).obj i)
⊢ (DirectLimit.lift R ι G f s.ι.app ⋯) ((DirectLimit.of R ι G f i) x) = (s.ι.app i) x
state_after: no goals
tactic: apply DirectLimit.lift_of
state_before: R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
m : (directLimitCocone G f).pt ⟶ s.pt
h : ∀ (j : ι), (directLimitCocone G f).ι.app j ≫ m = s.ι.app j
⊢ m = (fun s => DirectLimit.lift R ι G f s.ι.app ⋯) s
state_after: R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
m : (directLimitCocone G f).pt ⟶ s.pt
h : ∀ (j : ι), (directLimitCocone G f).ι.app j ≫ m = s.ι.app j
this : s.ι.app = fun i => m ∘ₗ DirectLimit.of R ι (fun i => G i) (fun i j H => f i j H) i
⊢ m = (fun s => DirectLimit.lift R ι G f s.ι.app ⋯) s
tactic: have :
      s.ι.app = fun i =>
        LinearMap.comp m (DirectLimit.of R ι (fun i => G i) (fun i j H => f i j H) i) := by
      funext i
      rw [← h]
      rfl
state_before: R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
m : (directLimitCocone G f).pt ⟶ s.pt
h : ∀ (j : ι), (directLimitCocone G f).ι.app j ≫ m = s.ι.app j
this : s.ι.app = fun i => m ∘ₗ DirectLimit.of R ι (fun i => G i) (fun i j H => f i j H) i
⊢ m = (fun s => DirectLimit.lift R ι G f s.ι.app ⋯) s
state_after: case h
R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
m : (directLimitCocone G f).pt ⟶ s.pt
h : ∀ (j : ι), (directLimitCocone G f).ι.app j ≫ m = s.ι.app j
this : s.ι.app = fun i => m ∘ₗ DirectLimit.of R ι (fun i => G i) (fun i j H => f i j H) i
⊢ ∀ (x : ↑(directLimitCocone G f).pt), m x = ((fun s => DirectLimit.lift R ι G f s.ι.app ⋯) s) x
tactic: apply LinearMap.ext
state_before: case h
R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
m : (directLimitCocone G f).pt ⟶ s.pt
h : ∀ (j : ι), (directLimitCocone G f).ι.app j ≫ m = s.ι.app j
this : s.ι.app = fun i => m ∘ₗ DirectLimit.of R ι (fun i => G i) (fun i j H => f i j H) i
⊢ ∀ (x : ↑(directLimitCocone G f).pt), m x = ((fun s => DirectLimit.lift R ι G f s.ι.app ⋯) s) x
state_after: case h
R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
m : (directLimitCocone G f).pt ⟶ s.pt
h : ∀ (j : ι), (directLimitCocone G f).ι.app j ≫ m = s.ι.app j
this : s.ι.app = fun i => m ∘ₗ DirectLimit.of R ι (fun i => G i) (fun i j H => f i j H) i
x : ↑(directLimitCocone G f).pt
⊢ m x = ((fun s => DirectLimit.lift R ι G f s.ι.app ⋯) s) x
tactic: intro x
state_before: case h
R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
m : (directLimitCocone G f).pt ⟶ s.pt
h : ∀ (j : ι), (directLimitCocone G f).ι.app j ≫ m = s.ι.app j
this : s.ι.app = fun i => m ∘ₗ DirectLimit.of R ι (fun i => G i) (fun i j H => f i j H) i
x : ↑(directLimitCocone G f).pt
⊢ m x = ((fun s => DirectLimit.lift R ι G f s.ι.app ⋯) s) x
state_after: case h
R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
m : (directLimitCocone G f).pt ⟶ s.pt
h : ∀ (j : ι), (directLimitCocone G f).ι.app j ≫ m = s.ι.app j
this : s.ι.app = fun i => m ∘ₗ DirectLimit.of R ι (fun i => G i) (fun i j H => f i j H) i
x : ↑(directLimitCocone G f).pt
⊢ m x = (DirectLimit.lift R ι G f (fun i => m ∘ₗ DirectLimit.of R ι (fun i => G i) (fun i j H => f i j H) i) ⋯) x
tactic: simp only [this]
state_before: case h
R : Type u
inst✝⁷ : Ring R
J : Type v
inst✝⁶ : Category.{t, v} J
F : J ⥤ ModuleCat R
ι : Type v
dec_ι : DecidableEq ι
inst✝⁵ : Preorder ι
G : ι → Type v
inst✝⁴ : (i : ι) → AddCommGroup (G i)
inst✝³ : (i : ι) → Module R (G i)
f : (i j : ι) → i ≤ j → G i →ₗ[R] G j
inst✝² : DirectedSystem G fun i j h => ⇑(f i j h)
inst✝¹ : DecidableEq ι
inst✝ : IsDirected ι fun x x_1 => x ≤ x_1
s : Cocone (directLimitDiagram G f)
m : (directLimitCocone G f).pt ⟶ s.pt
h : ∀ (j : ι), (directLimitCocone G f).ι.app j ≫ m = s.ι.app j
this : s.ι.app = fun i => m ∘ₗ DirectLimit.of R ι (fun i => G i) (fun i j H => f i j H) i
x : ↑(directLimitCocone G f).pt
⊢ m x = (DirectLimit.lift R ι G f (fun i => m ∘ₗ DirectLimit.of R ι (fun i => G i) (fun i j H => f i j H) i) ⋯) x
state_after: no goals
tactic: apply Module.DirectLimit.lift_unique