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

tactic: induction' f using Quotient.induction_on_pi with f
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: let g : ι → PGame.{u} := Subtype.val ∘ 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: 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
⊢ 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: 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 => ⟦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: clear_value g
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 f
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: 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
⊢ 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: 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
⊢ 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: 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 : ι
⊢ 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: simpa [x] using fun j ↦ @moveLeft_lf x ⟨equivShrink ι i, j⟩
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: simp [x]
state_before: ι : 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 : x.LeftMoves) (j : x.RightMoves), x.moveLeft i < x.moveRight j
state_after: no goals

tactic: simp [x]
state_before: ι : 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
⊢ ∀ (j : x.RightMoves), (x.moveRight j).Numeric
state_after: no goals