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

tactic: dsimp (config := { unfoldPartialApp := true }) [range_equiv_smaller_toFun]
state_before: I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o : Ordinal.{u}
⊢ Function.Bijective (range_equiv_smaller_toFun C o)
state_after: I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o : Ordinal.{u}
⊢ Function.Bijective fun x => ⟨(πs C o) ↑x, ⋯⟩

tactic: refine ⟨fun a b hab ↦ ?_, fun ⟨a, b, hb⟩ ↦ ?_⟩
state_before: I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o : Ordinal.{u}
⊢ Function.Bijective fun x => ⟨(πs C o) ↑x, ⋯⟩
state_after: case refine_1
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o : Ordinal.{u}
a b : ↑(range (π C fun x => ord I x < o))
hab : (fun x => ⟨(πs C o) ↑x, ⋯⟩) a = (fun x => ⟨(πs C o) ↑x, ⋯⟩) b
⊢ a = b

case refine_2
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o : Ordinal.{u}
x✝ : ↑(smaller C o)
a : LocallyConstant ↑C ℤ
b : LocallyConstant ↑(π C fun x => ord I x < o) ℤ
hb : b ∈ range (π C fun x => ord I x < o) ∧ (πs C o) b = a
⊢ ∃ a_1, (fun x => ⟨(πs C o) ↑x, ⋯⟩) a_1 = ⟨a, ⋯⟩

tactic: ext1
state_before: case refine_1
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o : Ordinal.{u}
a b : ↑(range (π C fun x => ord I x < o))
hab : (fun x => ⟨(πs C o) ↑x, ⋯⟩) a = (fun x => ⟨(πs C o) ↑x, ⋯⟩) b
⊢ a = b
state_after: case refine_1.a
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o : Ordinal.{u}
a b : ↑(range (π C fun x => ord I x < o))
hab : (fun x => ⟨(πs C o) ↑x, ⋯⟩) a = (fun x => ⟨(πs C o) ↑x, ⋯⟩) b
⊢ ↑a = ↑b

tactic: simp only [Subtype.mk.injEq] at hab
state_before: case refine_1.a
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o : Ordinal.{u}
a b : ↑(range (π C fun x => ord I x < o))
hab : (fun x => ⟨(πs C o) ↑x, ⋯⟩) a = (fun x => ⟨(πs C o) ↑x, ⋯⟩) b
⊢ ↑a = ↑b
state_after: case refine_1.a
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o : Ordinal.{u}
a b : ↑(range (π C fun x => ord I x < o))
hab : (πs C o) ↑a = (πs C o) ↑b
⊢ ↑a = ↑b

tactic: exact injective_πs C o hab
state_before: case refine_1.a
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o : Ordinal.{u}
a b : ↑(range (π C fun x => ord I x < o))
hab : (πs C o) ↑a = (πs C o) ↑b
⊢ ↑a = ↑b
state_after: no goals

tactic: use ⟨b, hb.1⟩
state_before: case refine_2
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
o : Ordinal.{u}
x✝ : ↑(smaller C o)
a : LocallyConstant ↑C ℤ
b : LocallyConstant ↑(π C fun x => ord I x < o) ℤ
hb : b ∈ range (π C fun x => ord I x < o) ∧ (πs C o) b = a
⊢ ∃ a_1, (fun x => ⟨(πs C o) ↑x, ⋯⟩) a_1 = ⟨a, ⋯⟩
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 : Ordinal.{u}
x✝ : ↑(smaller C o)
a : LocallyConstant ↑C ℤ
b : LocallyConstant ↑(π C fun x => ord I x < o) ℤ
hb : b ∈ range (π C fun x => ord I x < o) ∧ (πs C o) b = a
⊢ (fun x => ⟨(πs C o) ↑x, ⋯⟩) ⟨b, ⋯⟩ = ⟨a, ⋯⟩

tactic: simpa only [Subtype.mk.injEq] using hb.2
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 : Ordinal.{u}
x✝ : ↑(smaller C o)
a : LocallyConstant ↑C ℤ
b : LocallyConstant ↑(π C fun x => ord I x < o) ℤ
hb : b ∈ range (π C fun x => ord I x < o) ∧ (πs C o) b = a
⊢ (fun x => ⟨(πs C o) ↑x, ⋯⟩) ⟨b, ⋯⟩ = ⟨a, ⋯⟩
state_after: no goals