Theorem: Profinite.NobelingProof.GoodProducts.smaller_mono
File: Mathlib/Topology/Category/Profinite/Nobeling.lean

tactic: rintro f ⟨g, hg, rfl⟩
state_before: I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
⊢ smaller C o₁ ⊆ smaller C o₂
state_after: case intro.intro
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
g : LocallyConstant ↑(π C fun x => ord I x < o₁) ℤ
hg : g ∈ range (π C fun x => ord I x < o₁)
⊢ (πs C o₁) g ∈ smaller C o₂

tactic: simp only [smaller, Set.mem_image]
state_before: case intro.intro
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
g : LocallyConstant ↑(π C fun x => ord I x < o₁) ℤ
hg : g ∈ range (π C fun x => ord I x < o₁)
⊢ (πs C o₁) g ∈ smaller C o₂
state_after: case intro.intro
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
g : LocallyConstant ↑(π C fun x => ord I x < o₁) ℤ
hg : g ∈ range (π C fun x => ord I x < o₁)
⊢ ∃ x ∈ range (π C fun x => ord I x < o₂), (πs C o₂) x = (πs C o₁) g

tactic: use πs' C h g
state_before: case intro.intro
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
g : LocallyConstant ↑(π C fun x => ord I x < o₁) ℤ
hg : g ∈ range (π C fun x => ord I x < o₁)
⊢ ∃ x ∈ range (π C fun x => ord I x < o₂), (πs C o₂) x = (πs C o₁) g
state_after: case h
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
g : LocallyConstant ↑(π C fun x => ord I x < o₁) ℤ
hg : g ∈ range (π C fun x => ord I x < o₁)
⊢ (πs' C h) g ∈ range (π C fun x => ord I x < o₂) ∧ (πs C o₂) ((πs' C h) g) = (πs C o₁) g

tactic: obtain ⟨⟨l, gl⟩, rfl⟩ := hg
state_before: case h
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
g : LocallyConstant ↑(π C fun x => ord I x < o₁) ℤ
hg : g ∈ range (π C fun x => ord I x < o₁)
⊢ (πs' C h) g ∈ range (π C fun x => ord I x < o₂) ∧ (πs C o₂) ((πs' C h) g) = (πs C o₁) g
state_after: case h.intro.mk
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
l : Products I
gl : Products.isGood (π C fun x => ord I x < o₁) l
⊢ (πs' C h) (eval (π C fun x => ord I x < o₁) ⟨l, gl⟩) ∈ range (π C fun x => ord I x < o₂) ∧
    (πs C o₂) ((πs' C h) (eval (π C fun x => ord I x < o₁) ⟨l, gl⟩)) =
      (πs C o₁) (eval (π C fun x => ord I x < o₁) ⟨l, gl⟩)

tactic: refine ⟨?_, ?_⟩
state_before: case h.intro.mk
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
l : Products I
gl : Products.isGood (π C fun x => ord I x < o₁) l
⊢ (πs' C h) (eval (π C fun x => ord I x < o₁) ⟨l, gl⟩) ∈ range (π C fun x => ord I x < o₂) ∧
    (πs C o₂) ((πs' C h) (eval (π C fun x => ord I x < o₁) ⟨l, gl⟩)) =
      (πs C o₁) (eval (π C fun x => ord I x < o₁) ⟨l, gl⟩)
state_after: case h.intro.mk.refine_1
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
l : Products I
gl : Products.isGood (π C fun x => ord I x < o₁) l
⊢ (πs' C h) (eval (π C fun x => ord I x < o₁) ⟨l, gl⟩) ∈ range (π C fun x => ord I x < o₂)

case h.intro.mk.refine_2
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
l : Products I
gl : Products.isGood (π C fun x => ord I x < o₁) l
⊢ (πs C o₂) ((πs' C h) (eval (π C fun x => ord I x < o₁) ⟨l, gl⟩)) =
    (πs C o₁) (eval (π C fun x => ord I x < o₁) ⟨l, gl⟩)

tactic: use ⟨l, Products.isGood_mono C h gl⟩
state_before: case h.intro.mk.refine_1
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
l : Products I
gl : Products.isGood (π C fun x => ord I x < o₁) l
⊢ (πs' C h) (eval (π C fun x => ord I x < o₁) ⟨l, gl⟩) ∈ range (π C fun x => ord I x < o₂)
state_after: case h
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
l : Products I
gl : Products.isGood (π C fun x => ord I x < o₁) l
⊢ eval (π C fun x => ord I x < o₂) ⟨l, ⋯⟩ = (πs' C h) (eval (π C fun x => ord I x < o₁) ⟨l, gl⟩)

tactic: ext x
state_before: case h
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
l : Products I
gl : Products.isGood (π C fun x => ord I x < o₁) l
⊢ eval (π C fun x => ord I x < o₂) ⟨l, ⋯⟩ = (πs' C h) (eval (π C fun x => ord I x < o₁) ⟨l, gl⟩)
state_after: case h.h
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
l : Products I
gl : Products.isGood (π C fun x => ord I x < o₁) l
x : ↑(π C fun x => ord I x < o₂)
⊢ (eval (π C fun x => ord I x < o₂) ⟨l, ⋯⟩) x = ((πs' C h) (eval (π C fun x => ord I x < o₁) ⟨l, gl⟩)) x

tactic: rw [eval, ← Products.eval_πs' _ h (Products.prop_of_isGood  C _ gl), eval]
state_before: case h.h
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
l : Products I
gl : Products.isGood (π C fun x => ord I x < o₁) l
x : ↑(π C fun x => ord I x < o₂)
⊢ (eval (π C fun x => ord I x < o₂) ⟨l, ⋯⟩) x = ((πs' C h) (eval (π C fun x => ord I x < o₁) ⟨l, gl⟩)) x
state_after: no goals

tactic: rw [← LocallyConstant.coe_inj, coe_πs C o₂, ← LocallyConstant.toFun_eq_coe, coe_πs',
  Function.comp.assoc, projRestricts_comp_projRestrict C _, coe_πs]
state_before: case h.intro.mk.refine_2
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
l : Products I
gl : Products.isGood (π C fun x => ord I x < o₁) l
⊢ (πs C o₂) ((πs' C h) (eval (π C fun x => ord I x < o₁) ⟨l, gl⟩)) =
    (πs C o₁) (eval (π C fun x => ord I x < o₁) ⟨l, gl⟩)
state_after: case h.intro.mk.refine_2
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
l : Products I
gl : Products.isGood (π C fun x => ord I x < o₁) l
⊢ ((eval (π C fun x => ord I x < o₁) ⟨l, gl⟩).toFun ∘ ProjRestrict C fun x => ord I x < o₁) =
    ⇑(eval (π C fun x => ord I x < o₁) ⟨l, gl⟩) ∘ ProjRestrict C fun x => ord I x < o₁

tactic: rfl
state_before: case h.intro.mk.refine_2
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o₁ o₂ : Ordinal.{u}
h : o₁ ≤ o₂
l : Products I
gl : Products.isGood (π C fun x => ord I x < o₁) l
⊢ ((eval (π C fun x => ord I x < o₁) ⟨l, gl⟩).toFun ∘ ProjRestrict C fun x => ord I x < o₁) =
    ⇑(eval (π C fun x => ord I x < o₁) ⟨l, gl⟩) ∘ ProjRestrict C fun x => ord I x < o₁
state_after: no goals