Theorem: CategoryTheory.Limits.IsLimit.swapBinaryFan_lift
File: Mathlib/CategoryTheory/Monoidal/OfChosenFiniteProducts/Basic.lean

Proof steps:
state_before: C : Type u
inst✝ : Category.{v, u} C
X Y P Q : C
t : BinaryFan P Q
I : IsLimit t
s : Cone (pair Q P)
⊢ ∀ (j : Discrete WalkingPair), (fun s => I.lift (BinaryFan.swap s)) s ≫ t.swap.π.app j = s.π.app j
state_after: no goals
tactic: rintro ⟨⟨⟩⟩ <;> simp
state_before: C : Type u
inst✝ : Category.{v, u} C
X Y P Q : C
t : BinaryFan P Q
I : IsLimit t
s : Cone (pair Q P)
m : s.pt ⟶ t.swap.pt
w : ∀ (j : Discrete WalkingPair), m ≫ t.swap.π.app j = s.π.app j
⊢ m = (fun s => I.lift (BinaryFan.swap s)) s
state_after: C : Type u
inst✝ : Category.{v, u} C
X Y P Q : C
t : BinaryFan P Q
I : IsLimit t
s : Cone (pair Q P)
m : s.pt ⟶ t.swap.pt
w : ∀ (j : Discrete WalkingPair), m ≫ t.swap.π.app j = s.π.app j
h : (∀ (j : Discrete WalkingPair), m ≫ t.π.app j = (BinaryFan.swap s).π.app j) → m = I.lift (BinaryFan.swap s)
⊢ m = (fun s => I.lift (BinaryFan.swap s)) s
tactic: have h := I.uniq (BinaryFan.swap s) m
state_before: C : Type u
inst✝ : Category.{v, u} C
X Y P Q : C
t : BinaryFan P Q
I : IsLimit t
s : Cone (pair Q P)
m : s.pt ⟶ t.swap.pt
w : ∀ (j : Discrete WalkingPair), m ≫ t.swap.π.app j = s.π.app j
h : (∀ (j : Discrete WalkingPair), m ≫ t.π.app j = (BinaryFan.swap s).π.app j) → m = I.lift (BinaryFan.swap s)
⊢ m = (fun s => I.lift (BinaryFan.swap s)) s
state_after: C : Type u
inst✝ : Category.{v, u} C
X Y P Q : C
t : BinaryFan P Q
I : IsLimit t
s : Cone (pair Q P)
m : s.pt ⟶ t.swap.pt
w : ∀ (j : Discrete WalkingPair), m ≫ t.swap.π.app j = s.π.app j
h : (∀ (j : Discrete WalkingPair), m ≫ t.π.app j = (BinaryFan.swap s).π.app j) → m = I.lift (BinaryFan.swap s)
⊢ ∀ (j : Discrete WalkingPair), m ≫ t.π.app j = (BinaryFan.swap s).π.app j
tactic: rw [h]
state_before: C : Type u
inst✝ : Category.{v, u} C
X Y P Q : C
t : BinaryFan P Q
I : IsLimit t
s : Cone (pair Q P)
m : s.pt ⟶ t.swap.pt
w : ∀ (j : Discrete WalkingPair), m ≫ t.swap.π.app j = s.π.app j
h : (∀ (j : Discrete WalkingPair), m ≫ t.π.app j = (BinaryFan.swap s).π.app j) → m = I.lift (BinaryFan.swap s)
⊢ ∀ (j : Discrete WalkingPair), m ≫ t.π.app j = (BinaryFan.swap s).π.app j
state_after: case mk
C : Type u
inst✝ : Category.{v, u} C
X Y P Q : C
t : BinaryFan P Q
I : IsLimit t
s : Cone (pair Q P)
m : s.pt ⟶ t.swap.pt
w : ∀ (j : Discrete WalkingPair), m ≫ t.swap.π.app j = s.π.app j
h : (∀ (j : Discrete WalkingPair), m ≫ t.π.app j = (BinaryFan.swap s).π.app j) → m = I.lift (BinaryFan.swap s)
j : WalkingPair
⊢ m ≫ t.π.app { as := j } = (BinaryFan.swap s).π.app { as := j }
tactic: rintro ⟨j⟩
state_before: case mk
C : Type u
inst✝ : Category.{v, u} C
X Y P Q : C
t : BinaryFan P Q
I : IsLimit t
s : Cone (pair Q P)
m : s.pt ⟶ t.swap.pt
w : ∀ (j : Discrete WalkingPair), m ≫ t.swap.π.app j = s.π.app j
h : (∀ (j : Discrete WalkingPair), m ≫ t.π.app j = (BinaryFan.swap s).π.app j) → m = I.lift (BinaryFan.swap s)
j : WalkingPair
⊢ m ≫ t.π.app { as := j } = (BinaryFan.swap s).π.app { as := j }
state_after: case mk
C : Type u
inst✝ : Category.{v, u} C
X Y P Q : C
t : BinaryFan P Q
I : IsLimit t
s : Cone (pair Q P)
m : s.pt ⟶ t.swap.pt
h : (∀ (j : Discrete WalkingPair), m ≫ t.π.app j = (BinaryFan.swap s).π.app j) → m = I.lift (BinaryFan.swap s)
j : WalkingPair
w : m ≫ t.swap.π.app { as := WalkingPair.swap j } = s.π.app { as := WalkingPair.swap j }
⊢ m ≫ t.π.app { as := j } = (BinaryFan.swap s).π.app { as := j }
tactic: specialize w ⟨WalkingPair.swap j⟩
state_before: case mk
C : Type u
inst✝ : Category.{v, u} C
X Y P Q : C
t : BinaryFan P Q
I : IsLimit t
s : Cone (pair Q P)
m : s.pt ⟶ t.swap.pt
h : (∀ (j : Discrete WalkingPair), m ≫ t.π.app j = (BinaryFan.swap s).π.app j) → m = I.lift (BinaryFan.swap s)
j : WalkingPair
w : m ≫ t.swap.π.app { as := WalkingPair.swap j } = s.π.app { as := WalkingPair.swap j }
⊢ m ≫ t.π.app { as := j } = (BinaryFan.swap s).π.app { as := j }
state_after: no goals
tactic: cases j <;> exact w