Theorem: univLE_iff_cardinal_le
File: Mathlib/SetTheory/Cardinal/UnivLE.lean

tactic: rw [← not_iff_not, UnivLE]
state_before: ⊢ UnivLE.{u, v} ↔ univ.{u, v + 1} ≤ univ.{v, u + 1}
state_after: ⊢ (¬∀ (α : Type u), Small.{v, u} α) ↔ ¬univ.{u, v + 1} ≤ univ.{v, u + 1}

tactic: simp_rw [small_iff_lift_mk_lt_univ]
state_before: ⊢ (¬∀ (α : Type u), Small.{v, u} α) ↔ ¬univ.{u, v + 1} ≤ univ.{v, u + 1}
state_after: ⊢ (¬∀ (α : Type u), lift.{v + 1, u} #α < univ.{v, max u (v + 1)}) ↔ ¬univ.{u, v + 1} ≤ univ.{v, u + 1}

tactic: push_neg
state_before: ⊢ (¬∀ (α : Type u), lift.{v + 1, u} #α < univ.{v, max u (v + 1)}) ↔ ¬univ.{u, v + 1} ≤ univ.{v, u + 1}
state_after: ⊢ (∃ α, univ.{v, max u (v + 1)} ≤ lift.{v + 1, u} #α) ↔ univ.{v, u + 1} < univ.{u, v + 1}

tactic: refine ⟨fun ⟨α, le⟩ ↦ ?_, fun h ↦ ?_⟩
state_before: ⊢ (∃ α, univ.{v, max u (v + 1)} ≤ lift.{v + 1, u} #α) ↔ univ.{v, u + 1} < univ.{u, v + 1}
state_after: case refine_1
x✝ : ∃ α, univ.{v, max u (v + 1)} ≤ lift.{v + 1, u} #α
α : Type u
le : univ.{v, max u (v + 1)} ≤ lift.{v + 1, u} #α
⊢ univ.{v, u + 1} < univ.{u, v + 1}

case refine_2
h : univ.{v, u + 1} < univ.{u, v + 1}
⊢ ∃ α, univ.{v, max u (v + 1)} ≤ lift.{v + 1, u} #α

tactic: rw [univ_umax.{v,u}, ← lift_le.{u+1}, lift_univ, lift_lift] at le
state_before: case refine_1
x✝ : ∃ α, univ.{v, max u (v + 1)} ≤ lift.{v + 1, u} #α
α : Type u
le : univ.{v, max u (v + 1)} ≤ lift.{v + 1, u} #α
⊢ univ.{v, u + 1} < univ.{u, v + 1}
state_after: case refine_1
x✝ : ∃ α, univ.{v, max u (v + 1)} ≤ lift.{v + 1, u} #α
α : Type u
le : univ.{v, u + 1} ≤ lift.{max (v + 1) (u + 1), u} #α
⊢ univ.{v, u + 1} < univ.{u, v + 1}

tactic: exact le.trans_lt (lift_lt_univ'.{u,v+1} #α)
state_before: case refine_1
x✝ : ∃ α, univ.{v, max u (v + 1)} ≤ lift.{v + 1, u} #α
α : Type u
le : univ.{v, u + 1} ≤ lift.{max (v + 1) (u + 1), u} #α
⊢ univ.{v, u + 1} < univ.{u, v + 1}
state_after: no goals

tactic: obtain ⟨⟨α⟩, h⟩ := lt_univ'.mp h
state_before: case refine_2
h : univ.{v, u + 1} < univ.{u, v + 1}
⊢ ∃ α, univ.{v, max u (v + 1)} ≤ lift.{v + 1, u} #α
state_after: case refine_2.intro.mk
h✝ : univ.{v, u + 1} < univ.{u, v + 1}
w✝ : Cardinal.{u}
α : Type u
h : univ.{v, u + 1} = lift.{max (u + 1) (v + 1), u} (Quot.mk Setoid.r α)
⊢ ∃ α, univ.{v, max u (v + 1)} ≤ lift.{v + 1, u} #α

tactic: use α
state_before: case refine_2.intro.mk
h✝ : univ.{v, u + 1} < univ.{u, v + 1}
w✝ : Cardinal.{u}
α : Type u
h : univ.{v, u + 1} = lift.{max (u + 1) (v + 1), u} (Quot.mk Setoid.r α)
⊢ ∃ α, univ.{v, max u (v + 1)} ≤ lift.{v + 1, u} #α
state_after: case h
h✝ : univ.{v, u + 1} < univ.{u, v + 1}
w✝ : Cardinal.{u}
α : Type u
h : univ.{v, u + 1} = lift.{max (u + 1) (v + 1), u} (Quot.mk Setoid.r α)
⊢ univ.{v, max u (v + 1)} ≤ lift.{v + 1, u} #α

tactic: rw [univ_umax.{v,u}, ← lift_le.{u+1}, lift_univ, lift_lift]
state_before: case h
h✝ : univ.{v, u + 1} < univ.{u, v + 1}
w✝ : Cardinal.{u}
α : Type u
h : univ.{v, u + 1} = lift.{max (u + 1) (v + 1), u} (Quot.mk Setoid.r α)
⊢ univ.{v, max u (v + 1)} ≤ lift.{v + 1, u} #α
state_after: case h
h✝ : univ.{v, u + 1} < univ.{u, v + 1}
w✝ : Cardinal.{u}
α : Type u
h : univ.{v, u + 1} = lift.{max (u + 1) (v + 1), u} (Quot.mk Setoid.r α)
⊢ univ.{v, u + 1} ≤ lift.{max (v + 1) (u + 1), u} #α

tactic: exact h.le
state_before: case h
h✝ : univ.{v, u + 1} < univ.{u, v + 1}
w✝ : Cardinal.{u}
α : Type u
h : univ.{v, u + 1} = lift.{max (u + 1) (v + 1), u} (Quot.mk Setoid.r α)
⊢ univ.{v, u + 1} ≤ lift.{max (v + 1) (u + 1), u} #α
state_after: no goals