Theorem: Finset.prod_add
File: Mathlib/Algebra/BigOperators/Ring.lean

tactic: simp
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
⊢ ∏ a in s, (f a + g a) = ∏ a in s, ∑ p in {True, False}, if p then f a else g a

tactic: simp
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
⊢ ∀ (a : (a : α) → a ∈ s → Prop) (ha : a ∈ pi s fun x => {True, False}),
    (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a ha ∈ powerset s

tactic: rw [prod_ite]
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a : (a : α) → a ∈ s → Prop
x✝ : a ∈ pi s fun x => {True, False}
⊢ (∏ a_1 in attach s, if a ↑a_1 (_ : ↑a_1 ∈ s) then f ↑a_1 else g ↑a_1) =
    (∏ a in (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a x✝, f a) *
      ∏ a in s \ (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a x✝, g a

tactic: congr 1
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a : (a : α) → a ∈ s → Prop
x✝ : a ∈ pi s fun x => {True, False}
⊢ (∏ x in filter (fun a_1 => a ↑a_1 (_ : ↑a_1 ∈ s)) (attach s), f ↑x) *
      ∏ x in filter (fun x => ¬a ↑x (_ : ↑x ∈ s)) (attach s), g ↑x =
    (∏ a in (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a x✝, f a) *
      ∏ a in s \ (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a x✝, g a

tactic: exact prod_bij'
  (fun a _ => a.1) (by simp; tauto) (by simp)
  (fun a ha => ⟨a, (mem_filter.1 ha).1⟩) (fun a ha => by simp at ha; simp; tauto)
  (by simp) (by simp)
state_before: case e_a
α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a : (a : α) → a ∈ s → Prop
x✝ : a ∈ pi s fun x => {True, False}
⊢ ∏ x in filter (fun a_1 => a ↑a_1 (_ : ↑a_1 ∈ s)) (attach s), f ↑x =
    ∏ a in (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a x✝, f a

case e_a
α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a : (a : α) → a ∈ s → Prop
x✝ : a ∈ pi s fun x => {True, False}
⊢ ∏ x in filter (fun x => ¬a ↑x (_ : ↑x ∈ s)) (attach s), g ↑x =
    ∏ a in s \ (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a x✝, g a

tactic: exact prod_bij'
  (fun a _ => a.1) (by simp) (by simp)
  (fun a ha => ⟨a, (mem_sdiff.1 ha).1⟩) (fun a ha => by simp at ha; simp; tauto)
  (by simp) (by simp)
state_before: case e_a
α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a : (a : α) → a ∈ s → Prop
x✝ : a ∈ pi s fun x => {True, False}
⊢ ∏ x in filter (fun x => ¬a ↑x (_ : ↑x ∈ s)) (attach s), g ↑x =
    ∏ a in s \ (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a x✝, g a

tactic: simp
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a : (a : α) → a ∈ s → Prop
x✝ : a ∈ pi s fun x => {True, False}
⊢ ∀ (a_1 : { x // x ∈ s }) (ha : a_1 ∈ filter (fun a_2 => a ↑a_2 (_ : ↑a_2 ∈ s)) (attach s)),
    (fun a_2 x => ↑a_2) a_1 ha ∈ (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a x✝

tactic: tauto
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a : (a : α) → a ∈ s → Prop
x✝ : a ∈ pi s fun x => {True, False}
⊢ ∀ (a_1 : α) (b : a_1 ∈ s),
    a a_1 (_ : ↑{ val := a_1, property := b } ∈ s) → ∀ (h : ↑{ val := a_1, property := b } ∈ s), a a_1 h

tactic: simp
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a : (a : α) → a ∈ s → Prop
x✝ : a ∈ pi s fun x => {True, False}
⊢ ∀ (a_1 : { x // x ∈ s }) (ha : a_1 ∈ filter (fun a_2 => a ↑a_2 (_ : ↑a_2 ∈ s)) (attach s)),
    f ↑a_1 = f ((fun a_2 x => ↑a_2) a_1 ha)

tactic: simp at ha
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝¹ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a✝ : (a : α) → a ∈ s → Prop
x✝ : a✝ ∈ pi s fun x => {True, False}
a : α
ha : a ∈ (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a✝ x✝
⊢ (fun a ha => { val := a, property := (_ : a ∈ s) }) a ha ∈ filter (fun a => a✝ ↑a (_ : ↑a ∈ s)) (attach s)

tactic: simp
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝¹ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a✝ : (a : α) → a ∈ s → Prop
x✝ : a✝ ∈ pi s fun x => {True, False}
a : α
ha✝ : a ∈ (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a✝ x✝
ha : a ∈ s ∧ ∀ (h : a ∈ s), a✝ a h
⊢ (fun a ha => { val := a, property := (_ : a ∈ s) }) a ha✝ ∈ filter (fun a => a✝ ↑a (_ : ↑a ∈ s)) (attach s)

tactic: tauto
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝¹ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a✝ : (a : α) → a ∈ s → Prop
x✝ : a✝ ∈ pi s fun x => {True, False}
a : α
ha✝ : a ∈ (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a✝ x✝
ha : a ∈ s ∧ ∀ (h : a ∈ s), a✝ a h
⊢ a✝ a (_ : ↑{ val := a, property := (_ : a ∈ s) } ∈ s)

tactic: simp
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a : (a : α) → a ∈ s → Prop
x✝ : a ∈ pi s fun x => {True, False}
⊢ ∀ (a_1 : { x // x ∈ s }) (ha : a_1 ∈ filter (fun a_2 => a ↑a_2 (_ : ↑a_2 ∈ s)) (attach s)),
    (fun a_2 ha => { val := a_2, property := (_ : a_2 ∈ s) }) ((fun a_2 x => ↑a_2) a_1 ha)
        (_ : (fun a_2 x => ↑a_2) a_1 ha ∈ (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a x✝) =
      a_1

tactic: simp
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a : (a : α) → a ∈ s → Prop
x✝ : a ∈ pi s fun x => {True, False}
⊢ ∀ (a_1 : α) (ha : a_1 ∈ (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a x✝),
    (fun a_2 x => ↑a_2) ((fun a_2 ha => { val := a_2, property := (_ : a_2 ∈ s) }) a_1 ha)
        (_ :
          (fun a_2 ha => { val := a_2, property := (_ : a_2 ∈ s) }) a_1 ha ∈
            filter (fun a_2 => a ↑a_2 (_ : ↑a_2 ∈ s)) (attach s)) =
      a_1

tactic: simp
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a : (a : α) → a ∈ s → Prop
x✝ : a ∈ pi s fun x => {True, False}
⊢ ∀ (a_1 : { x // x ∈ s }) (ha : a_1 ∈ filter (fun x => ¬a ↑x (_ : ↑x ∈ s)) (attach s)),
    (fun a_2 x => ↑a_2) a_1 ha ∈ s \ (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a x✝

tactic: simp
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a : (a : α) → a ∈ s → Prop
x✝ : a ∈ pi s fun x => {True, False}
⊢ ∀ (a_1 : { x // x ∈ s }) (ha : a_1 ∈ filter (fun x => ¬a ↑x (_ : ↑x ∈ s)) (attach s)),
    g ↑a_1 = g ((fun a_2 x => ↑a_2) a_1 ha)

tactic: simp at ha
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝¹ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a✝ : (a : α) → a ∈ s → Prop
x✝ : a✝ ∈ pi s fun x => {True, False}
a : α
ha : a ∈ s \ (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a✝ x✝
⊢ (fun a ha => { val := a, property := (_ : a ∈ s) }) a ha ∈ filter (fun x => ¬a✝ ↑x (_ : ↑x ∈ s)) (attach s)

tactic: simp
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝¹ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a✝ : (a : α) → a ∈ s → Prop
x✝ : a✝ ∈ pi s fun x => {True, False}
a : α
ha✝ : a ∈ s \ (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a✝ x✝
ha : a ∈ s ∧ (a ∈ s → ∃ x, ¬a✝ a x)
⊢ (fun a ha => { val := a, property := (_ : a ∈ s) }) a ha✝ ∈ filter (fun x => ¬a✝ ↑x (_ : ↑x ∈ s)) (attach s)

tactic: tauto
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝¹ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a✝ : (a : α) → a ∈ s → Prop
x✝ : a✝ ∈ pi s fun x => {True, False}
a : α
ha✝ : a ∈ s \ (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a✝ x✝
ha : a ∈ s ∧ (a ∈ s → ∃ x, ¬a✝ a x)
⊢ ¬a✝ a (_ : ↑{ val := a, property := (_ : a ∈ s) } ∈ s)

tactic: simp
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a : (a : α) → a ∈ s → Prop
x✝ : a ∈ pi s fun x => {True, False}
⊢ ∀ (a_1 : { x // x ∈ s }) (ha : a_1 ∈ filter (fun x => ¬a ↑x (_ : ↑x ∈ s)) (attach s)),
    (fun a_2 ha => { val := a_2, property := (_ : a_2 ∈ s) }) ((fun a_2 x => ↑a_2) a_1 ha)
        (_ : ↑a_1 ∈ s \ filter (fun a_2 => ∀ (h : a_2 ∈ s), a a_2 h) s) =
      a_1

tactic: simp
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
a : (a : α) → a ∈ s → Prop
x✝ : a ∈ pi s fun x => {True, False}
⊢ ∀ (a_1 : α) (ha : a_1 ∈ s \ (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a x✝),
    (fun a_2 x => ↑a_2) ((fun a_2 ha => { val := a_2, property := (_ : a_2 ∈ s) }) a_1 ha)
        (_ :
          (fun a_2 ha => { val := a_2, property := (_ : a_2 ∈ s) }) a_1 ha ∈
            filter (fun x => ¬a ↑x (_ : ↑x ∈ s)) (attach s)) =
      a_1

tactic: simp [Classical.em]
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
⊢ ∀ (a : Finset α) (ha : a ∈ powerset s), (fun t x a x => a ∈ t) a ha ∈ pi s fun x => {True, False}

tactic: simp [Function.funext_iff]
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
⊢ ∀ (a : (a : α) → a ∈ s → Prop) (ha : a ∈ pi s fun x => {True, False}),
    (fun t x a x => a ∈ t) ((fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) a ha)
        (_ : filter (fun a_1 => ∀ (h : a_1 ∈ s), a a_1 h) s ∈ powerset s) =
      a

tactic: tauto
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
⊢ ∀ (a : (a : α) → a ∈ s → Prop),
    (∀ (a_1 : α) (h : a_1 ∈ s), a a_1 h ∨ ¬a a_1 h) →
      ∀ (a_1 : α) (a_2 : a_1 ∈ s), (a_1 ∈ s ∧ ∀ (h : a_1 ∈ s), a a_1 h) ↔ a a_1 a_2

tactic: simp [Finset.ext_iff, @mem_filter _ _ (id _)]
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
⊢ ∀ (a : Finset α) (ha : a ∈ powerset s),
    (fun f x => filter (fun a => ∀ (h : a ∈ s), f a h) s) ((fun t x a x => a ∈ t) a ha)
        (_ : (fun a_1 x => a_1 ∈ a) ∈ pi s fun x => {True, False}) =
      a

tactic: tauto
state_before: α : Type u
β : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a : α
b : β
f✝ g✝ : α → β
inst✝ : CommSemiring β
f g : α → β
s : Finset α
⊢ ∀ (a : Finset α), a ⊆ s → ∀ (a_1 : α), a_1 ∈ s ∧ (a_1 ∈ s → a_1 ∈ a) ↔ a_1 ∈ a