Theorem: Surreal.bddBelow_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
⊢ BddBelow (Set.range f)
state_after: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
f : ι → Subtype Numeric
⊢ BddBelow (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
⊢ BddBelow (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
⊢ BddBelow (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
⊢ BddBelow (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
⊢ BddBelow (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
⊢ BddBelow (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
⊢ BddBelow (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
⊢ BddBelow (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
⊢ BddBelow (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
⊢ BddBelow (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
⊢ BddBelow (Set.range fun i => mk (g i) ⋯)

tactic: let x : PGame.{u} := ⟨PEmpty, Σ i, (g <| (equivShrink.{u} ι).symm i).RightMoves,
  PEmpty.elim, fun x ↦ moveRight _ x.2⟩
state_before: case h
ι : Type u_1
inst✝ : Small.{u, u_1} ι
g : ι → PGame
hg : ∀ (i : ι), (g i).Numeric
⊢ BddBelow (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 PEmpty.{u + 1} ((i : Shrink.{u, u_1} ι) × (g ((equivShrink ι).symm i)).RightMoves) PEmpty.elim fun x =>
    (g ((equivShrink ι).symm x.fst)).moveRight x.snd
⊢ BddBelow (Set.range fun i => mk (g i) ⋯)

tactic: refine ⟨mk x (.mk (by simp [x]) (by simp [x]) (fun _ ↦ (hg _).moveRight _) ),
  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 PEmpty.{u + 1} ((i : Shrink.{u, u_1} ι) × (g ((equivShrink ι).symm i)).RightMoves) PEmpty.elim fun x =>
    (g ((equivShrink ι).symm x.fst)).moveRight x.snd
⊢ BddBelow (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 PEmpty.{u + 1} ((i : Shrink.{u, u_1} ι) × (g ((equivShrink ι).symm i)).RightMoves) PEmpty.elim fun x =>
    (g ((equivShrink ι).symm x.fst)).moveRight x.snd
i : ι
⊢ mk x ⋯ ≤ mk (g i) ⋯

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 PEmpty.{u + 1} ((i : Shrink.{u, u_1} ι) × (g ((equivShrink ι).symm i)).RightMoves) PEmpty.elim fun x =>
    (g ((equivShrink ι).symm x.fst)).moveRight x.snd
i : ι
⊢ mk x ⋯ ≤ 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 PEmpty.{u + 1} ((i : Shrink.{u, u_1} ι) × (g ((equivShrink ι).symm i)).RightMoves) PEmpty.elim fun x =>
    (g ((equivShrink ι).symm x.fst)).moveRight x.snd
i : ι
⊢ (∀ (i_1 : x.LeftMoves), x.moveLeft i_1 ⧏ g ((equivShrink ι).symm ((equivShrink ι) i))) ∧
    ∀ (j : (g ((equivShrink ι).symm ((equivShrink ι) i))).RightMoves),
      x ⧏ (g ((equivShrink ι).symm ((equivShrink ι) i))).moveRight j

tactic: simpa [x] using fun j ↦ @lf_moveRight 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 PEmpty.{u + 1} ((i : Shrink.{u, u_1} ι) × (g ((equivShrink ι).symm i)).RightMoves) PEmpty.elim fun x =>
    (g ((equivShrink ι).symm x.fst)).moveRight x.snd
i : ι
⊢ (∀ (i_1 : x.LeftMoves), x.moveLeft i_1 ⧏ g ((equivShrink ι).symm ((equivShrink ι) i))) ∧
    ∀ (j : (g ((equivShrink ι).symm ((equivShrink ι) i))).RightMoves),
      x ⧏ (g ((equivShrink ι).symm ((equivShrink ι) i))).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 PEmpty.{u + 1} ((i : Shrink.{u, u_1} ι) × (g ((equivShrink ι).symm i)).RightMoves) PEmpty.elim fun x =>
    (g ((equivShrink ι).symm x.fst)).moveRight x.snd
⊢ ∀ (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 PEmpty.{u + 1} ((i : Shrink.{u, u_1} ι) × (g ((equivShrink ι).symm i)).RightMoves) PEmpty.elim fun x =>
    (g ((equivShrink ι).symm x.fst)).moveRight x.snd
⊢ ∀ (i : x.LeftMoves), (x.moveLeft i).Numeric
state_after: no goals