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

Proof steps:
state_before: I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
hC : IsClosed C
⊢ ⊤ ≤ Submodule.span ℤ (Set.range (eval C))
state_after: I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
hC : IsClosed C
⊢ ⊤ ≤ Submodule.span ℤ (Set.range (Products.eval C))
tactic: rw [span_iff_products]
state_before: I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
hC : IsClosed C
⊢ ⊤ ≤ Submodule.span ℤ (Set.range (Products.eval C))
state_after: I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
hC : IsClosed C
f : LocallyConstant ↑C ℤ
a✝ : f ∈ ⊤
⊢ f ∈ Submodule.span ℤ (Set.range (Products.eval C))
tactic: intro f _
state_before: I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
hC : IsClosed C
f : LocallyConstant ↑C ℤ
a✝ : f ∈ ⊤
⊢ f ∈ Submodule.span ℤ (Set.range (Products.eval C))
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)
hC : IsClosed C
K : Finset I
f' : LocallyConstant ↑(π C fun x => x ∈ K) ℤ
a✝ : (πJ C K) f' ∈ ⊤
⊢ (πJ C K) f' ∈ Submodule.span ℤ (Set.range (Products.eval C))
tactic: obtain ⟨K, f', rfl⟩ : ∃ K f', f = πJ C K f' := fin_comap_jointlySurjective C hC f
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)
hC : IsClosed C
K : Finset I
f' : LocallyConstant ↑(π C fun x => x ∈ K) ℤ
a✝ : (πJ C K) f' ∈ ⊤
⊢ (πJ C K) f' ∈ Submodule.span ℤ (Set.range (Products.eval C))
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)
hC : IsClosed C
K : Finset I
f' : LocallyConstant ↑(π C fun x => x ∈ K) ℤ
a✝ : (πJ C K) f' ∈ ⊤
⊢ ⇑(πJ C K) '' Set.range (eval (π C fun x => x ∈ K)) ⊆ Set.range (Products.eval C)
tactic: refine Submodule.span_mono ?_ <| Submodule.apply_mem_span_image_of_mem_span (πJ C K) <|
    spanFin C K (Submodule.mem_top : f' ∈ ⊤)
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)
hC : IsClosed C
K : Finset I
f' : LocallyConstant ↑(π C fun x => x ∈ K) ℤ
a✝ : (πJ C K) f' ∈ ⊤
⊢ ⇑(πJ C K) '' Set.range (eval (π C fun x => x ∈ K)) ⊆ Set.range (Products.eval C)
state_after: case intro.intro.intro.intro.intro
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
hC : IsClosed C
K : Finset I
f' : LocallyConstant ↑(π C fun x => x ∈ K) ℤ
a✝ : (πJ C K) f' ∈ ⊤
m : { l // Products.isGood (π C fun x => x ∈ K) l }
⊢ (πJ C K) (eval (π C fun x => x ∈ K) m) ∈ Set.range (Products.eval C)
tactic: rintro l ⟨y, ⟨m, rfl⟩, rfl⟩
state_before: case intro.intro.intro.intro.intro
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
hC : IsClosed C
K : Finset I
f' : LocallyConstant ↑(π C fun x => x ∈ K) ℤ
a✝ : (πJ C K) f' ∈ ⊤
m : { l // Products.isGood (π C fun x => x ∈ K) l }
⊢ (πJ C K) (eval (π C fun x => x ∈ K) m) ∈ Set.range (Products.eval C)
state_after: no goals
tactic: exact ⟨m.val, eval_eq_πJ C K m.val m.prop⟩