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

tactic: apply List.prod_eq_one
state_before: I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
s : Finset I
x y : ↑(π C fun x => x ∈ s)
h : y = x
⊢ (List.map (⇑(LocallyConstant.evalMonoidHom y)) (factors C s x)).prod = 1
state_after: case hl
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
s : Finset I
x y : ↑(π C fun x => x ∈ s)
h : y = x
⊢ ∀ x_1 ∈ List.map (⇑(LocallyConstant.evalMonoidHom y)) (factors C s x), x_1 = 1

tactic: simp only [h, List.mem_map, LocallyConstant.evalMonoidHom, factors]
state_before: case hl
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
s : Finset I
x y : ↑(π C fun x => x ∈ s)
h : y = x
⊢ ∀ x_1 ∈ List.map (⇑(LocallyConstant.evalMonoidHom y)) (factors C s x), x_1 = 1
state_after: case hl
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
s : Finset I
x y : ↑(π C fun x => x ∈ s)
h : y = x
⊢ ∀ (x_1 : ℤ),
    (∃ a,
        (∃ a_1 ∈ Finset.sort (fun x x_2 => x ≥ x_2) s,
            (if ↑x a_1 = true then e (π C fun x => x ∈ s) a_1 else 1 - e (π C fun x => x ∈ s) a_1) = a) ∧
          ((Pi.evalMonoidHom (fun a => ℤ) x).comp LocallyConstant.coeFnMonoidHom) a = x_1) →
      x_1 = 1

tactic: rintro _ ⟨a, ⟨b, _, rfl⟩, rfl⟩
state_before: case hl
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
s : Finset I
x y : ↑(π C fun x => x ∈ s)
h : y = x
⊢ ∀ (x_1 : ℤ),
    (∃ a,
        (∃ a_1 ∈ Finset.sort (fun x x_2 => x ≥ x_2) s,
            (if ↑x a_1 = true then e (π C fun x => x ∈ s) a_1 else 1 - e (π C fun x => x ∈ s) a_1) = a) ∧
          ((Pi.evalMonoidHom (fun a => ℤ) x).comp LocallyConstant.coeFnMonoidHom) a = x_1) →
      x_1 = 1
state_after: case hl.intro.intro.intro.intro
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
s : Finset I
x y : ↑(π C fun x => x ∈ s)
h : y = x
b : I
left✝ : b ∈ Finset.sort (fun x x_1 => x ≥ x_1) s
⊢ ((Pi.evalMonoidHom (fun a => ℤ) x).comp LocallyConstant.coeFnMonoidHom)
      (if ↑x b = true then e (π C fun x => x ∈ s) b else 1 - e (π C fun x => x ∈ s) b) =
    1

tactic: dsimp
state_before: case hl.intro.intro.intro.intro
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
s : Finset I
x y : ↑(π C fun x => x ∈ s)
h : y = x
b : I
left✝ : b ∈ Finset.sort (fun x x_1 => x ≥ x_1) s
⊢ ((Pi.evalMonoidHom (fun a => ℤ) x).comp LocallyConstant.coeFnMonoidHom)
      (if ↑x b = true then e (π C fun x => x ∈ s) b else 1 - e (π C fun x => x ∈ s) b) =
    1
state_after: case hl.intro.intro.intro.intro
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
s : Finset I
x y : ↑(π C fun x => x ∈ s)
h : y = x
b : I
left✝ : b ∈ Finset.sort (fun x x_1 => x ≥ x_1) s
⊢ (if ↑x b = true then e (π C fun x => x ∈ s) b else 1 - e (π C fun x => x ∈ s) b) x = 1

tactic: split_ifs with hh
state_before: case hl.intro.intro.intro.intro
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
s : Finset I
x y : ↑(π C fun x => x ∈ s)
h : y = x
b : I
left✝ : b ∈ Finset.sort (fun x x_1 => x ≥ x_1) s
⊢ (if ↑x b = true then e (π C fun x => x ∈ s) b else 1 - e (π C fun x => x ∈ s) b) x = 1
state_after: case pos
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
s : Finset I
x y : ↑(π C fun x => x ∈ s)
h : y = x
b : I
left✝ : b ∈ Finset.sort (fun x x_1 => x ≥ x_1) s
hh : ↑x b = true
⊢ (e (π C fun x => x ∈ s) b) x = 1

case neg
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
s : Finset I
x y : ↑(π C fun x => x ∈ s)
h : y = x
b : I
left✝ : b ∈ Finset.sort (fun x x_1 => x ≥ x_1) s
hh : ¬↑x b = true
⊢ (1 - e (π C fun x => x ∈ s) b) x = 1

tactic: rw [e, LocallyConstant.coe_mk, if_pos hh]
state_before: case pos
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
s : Finset I
x y : ↑(π C fun x => x ∈ s)
h : y = x
b : I
left✝ : b ∈ Finset.sort (fun x x_1 => x ≥ x_1) s
hh : ↑x b = true
⊢ (e (π C fun x => x ∈ s) b) x = 1
state_after: no goals

tactic: rw [LocallyConstant.sub_apply, e, LocallyConstant.coe_mk, LocallyConstant.coe_mk, if_neg hh]
state_before: case neg
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
s : Finset I
x y : ↑(π C fun x => x ∈ s)
h : y = x
b : I
left✝ : b ∈ Finset.sort (fun x x_1 => x ≥ x_1) s
hh : ¬↑x b = true
⊢ (1 - e (π C fun x => x ∈ s) b) x = 1
state_after: case neg
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
s : Finset I
x y : ↑(π C fun x => x ∈ s)
h : y = x
b : I
left✝ : b ∈ Finset.sort (fun x x_1 => x ≥ x_1) s
hh : ¬↑x b = true
⊢ LocallyConstant.toFun 1 x - 0 = 1

tactic: simp only [LocallyConstant.toFun_eq_coe, LocallyConstant.coe_one, Pi.one_apply, sub_zero]
state_before: case neg
I : Type u
inst✝¹ : LinearOrder I
inst✝ : IsWellOrder I fun x x_1 => x < x_1
C : Set (I → Bool)
s : Finset I
x y : ↑(π C fun x => x ∈ s)
h : y = x
b : I
left✝ : b ∈ Finset.sort (fun x x_1 => x ≥ x_1) s
hh : ¬↑x b = true
⊢ LocallyConstant.toFun 1 x - 0 = 1
state_after: no goals