Theorem: Surreal.bddAbove_range_of_small
File: Mathlib/SetTheory/Surreal/Basic.lean

Proof steps:
state_before: ι : Type u_1
inst✝ : Small.{u, u_1} ι
f : ι → Surreal
⊢ BddAbove (Set.range f)
state_after: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
f : ι → Subtype Numeric
⊢ BddAbove (Set.range fun i => ⟦f i⟧)
tactic: induction' f using Quotient.induction_on_pi with f
state_before: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
f : ι → Subtype Numeric
⊢ BddAbove (Set.range fun i => ⟦f i⟧)
state_after: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
f : ι → Subtype Numeric
g : ι → PGame := Subtype.val ∘ f
⊢ BddAbove (Set.range fun i => ⟦f i⟧)
tactic: let g : ι → PGame.{u} := Subtype.val ∘ f
state_before: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
f : ι → Subtype Numeric
g : ι → PGame := Subtype.val ∘ f
⊢ BddAbove (Set.range fun i => ⟦f i⟧)
state_after: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
f : ι → Subtype Numeric
g : ι → PGame := Subtype.val ∘ f
hg : ∀ (i : ι), (g i).Numeric
⊢ BddAbove (Set.range fun i => ⟦f i⟧)
tactic: have hg (i) : (g i).Numeric := Subtype.prop _
state_before: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
f : ι → Subtype Numeric
g : ι → PGame := Subtype.val ∘ f
hg : ∀ (i : ι), (g i).Numeric
⊢ BddAbove (Set.range fun i => ⟦f i⟧)
state_after: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
f : ι → Subtype Numeric
g : ι → PGame := Subtype.val ∘ f
hg : ∀ (i : ι), (g i).Numeric
⊢ BddAbove (Set.range fun i => mk (g i) ⋯)
tactic: conv in (⟦f _⟧) =>
    change mk (g i) (hg i)
state_before: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
f : ι → Subtype Numeric
g : ι → PGame := Subtype.val ∘ f
hg : ∀ (i : ι), (g i).Numeric
⊢ BddAbove (Set.range fun i => mk (g i) ⋯)
state_after: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
f : ι → Subtype Numeric
g : ι → PGame
hg : ∀ (i : ι), (g i).Numeric
⊢ BddAbove (Set.range fun i => mk (g i) ⋯)
tactic: clear_value g
state_before: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
f : ι → Subtype Numeric
g : ι → PGame
hg : ∀ (i : ι), (g i).Numeric
⊢ BddAbove (Set.range fun i => mk (g i) ⋯)
state_after: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
g : ι → PGame
hg : ∀ (i : ι), (g i).Numeric
⊢ BddAbove (Set.range fun i => mk (g i) ⋯)
tactic: clear f
state_before: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
g : ι → PGame
hg : ∀ (i : ι), (g i).Numeric
⊢ BddAbove (Set.range fun i => mk (g i) ⋯)
state_after: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
g : ι → PGame
hg : ∀ (i : ι), (g i).Numeric
x : PGame :=
  PGame.mk ((i : Shrink.{u, u_1} ι) × (g ((equivShrink ι).symm i)).LeftMoves) PEmpty.{u + 1}
    (fun x => (g ((equivShrink ι).symm x.fst)).moveLeft x.snd) PEmpty.elim
⊢ BddAbove (Set.range fun i => mk (g i) ⋯)
tactic: let x : PGame.{u} := ⟨Σ i, (g <| (equivShrink.{u} ι).symm i).LeftMoves, PEmpty,
    fun x ↦ moveLeft _ x.2, PEmpty.elim⟩
state_before: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
g : ι → PGame
hg : ∀ (i : ι), (g i).Numeric
x : PGame :=
  PGame.mk ((i : Shrink.{u, u_1} ι) × (g ((equivShrink ι).symm i)).LeftMoves) PEmpty.{u + 1}
    (fun x => (g ((equivShrink ι).symm x.fst)).moveLeft x.snd) PEmpty.elim
⊢ BddAbove (Set.range fun i => mk (g i) ⋯)
state_after: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
g : ι → PGame
hg : ∀ (i : ι), (g i).Numeric
x : PGame :=
  PGame.mk ((i : Shrink.{u, u_1} ι) × (g ((equivShrink ι).symm i)).LeftMoves) PEmpty.{u + 1}
    (fun x => (g ((equivShrink ι).symm x.fst)).moveLeft x.snd) PEmpty.elim
i : ι
⊢ mk (g i) ⋯ ≤ mk x ⋯
tactic: refine ⟨mk x (.mk (by simp [x]) (fun _ ↦ (hg _).moveLeft _) (by simp [x])),
    Set.forall_mem_range.2 fun i ↦ ?_⟩
state_before: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
g : ι → PGame
hg : ∀ (i : ι), (g i).Numeric
x : PGame :=
  PGame.mk ((i : Shrink.{u, u_1} ι) × (g ((equivShrink ι).symm i)).LeftMoves) PEmpty.{u + 1}
    (fun x => (g ((equivShrink ι).symm x.fst)).moveLeft x.snd) PEmpty.elim
i : ι
⊢ mk (g i) ⋯ ≤ mk x ⋯
state_after: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
g : ι → PGame
hg : ∀ (i : ι), (g i).Numeric
x : PGame :=
  PGame.mk ((i : Shrink.{u, u_1} ι) × (g ((equivShrink ι).symm i)).LeftMoves) PEmpty.{u + 1}
    (fun x => (g ((equivShrink ι).symm x.fst)).moveLeft x.snd) PEmpty.elim
i : ι
⊢ (∀ (i_1 : (g ((equivShrink ι).symm ((equivShrink ι) i))).LeftMoves),
      (g ((equivShrink ι).symm ((equivShrink ι) i))).moveLeft i_1 ⧏ x) ∧
    ∀ (j : x.RightMoves), g ((equivShrink ι).symm ((equivShrink ι) i)) ⧏ x.moveRight j
tactic: rw [mk_le_mk, ← (equivShrink ι).symm_apply_apply i, le_iff_forall_lf]
state_before: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
g : ι → PGame
hg : ∀ (i : ι), (g i).Numeric
x : PGame :=
  PGame.mk ((i : Shrink.{u, u_1} ι) × (g ((equivShrink ι).symm i)).LeftMoves) PEmpty.{u + 1}
    (fun x => (g ((equivShrink ι).symm x.fst)).moveLeft x.snd) PEmpty.elim
i : ι
⊢ (∀ (i_1 : (g ((equivShrink ι).symm ((equivShrink ι) i))).LeftMoves),
      (g ((equivShrink ι).symm ((equivShrink ι) i))).moveLeft i_1 ⧏ x) ∧
    ∀ (j : x.RightMoves), g ((equivShrink ι).symm ((equivShrink ι) i)) ⧏ x.moveRight j
state_after: no goals
tactic: simpa [x] using fun j ↦ @moveLeft_lf x ⟨equivShrink ι i, j⟩