Theorem: Finset.fold_op_rel_iff_and
File: Mathlib/Data/Finset/Fold.lean

tactic: induction' s using Finset.induction_on with a s ha IH
state_before: α : Type u_1
β : Type u_2
γ : Type ?u.57392
op : β → β → β
hc : IsCommutative β op
ha : IsAssociative β op
f : α → β
b : β
s : Finset α
a : α
r : β → β → Prop
hr : ∀ {x y z : β}, r x (op y z) ↔ r x y ∧ r x z
c : β
⊢ r c (fold op b f s) ↔ r c b ∧ ∀ (x : α), x ∈ s → r c (f x)

tactic: rw [Finset.fold_insert ha, hr, IH, ← and_assoc, @and_comm (r c (f a)), and_assoc]
state_before: case insert
α : Type u_1
β : Type u_2
γ : Type ?u.57392
op : β → β → β
hc : IsCommutative β op
ha✝ : IsAssociative β op
f : α → β
b : β
s✝ : Finset α
a✝ : α
r : β → β → Prop
hr : ∀ {x y z : β}, r x (op y z) ↔ r x y ∧ r x z
c : β
a : α
s : Finset α
ha : ¬a ∈ s
IH : r c (fold op b f s) ↔ r c b ∧ ∀ (x : α), x ∈ s → r c (f x)
⊢ r c (fold op b f (insert a s)) ↔ r c b ∧ ∀ (x : α), x ∈ insert a s → r c (f x)

tactic: apply and_congr Iff.rfl
state_before: case insert
α : Type u_1
β : Type u_2
γ : Type ?u.57392
op : β → β → β
hc : IsCommutative β op
ha✝ : IsAssociative β op
f : α → β
b : β
s✝ : Finset α
a✝ : α
r : β → β → Prop
hr : ∀ {x y z : β}, r x (op y z) ↔ r x y ∧ r x z
c : β
a : α
s : Finset α
ha : ¬a ∈ s
IH : r c (fold op b f s) ↔ r c b ∧ ∀ (x : α), x ∈ s → r c (f x)
⊢ (r c b ∧ r c (f a) ∧ ∀ (x : α), x ∈ s → r c (f x)) ↔ r c b ∧ ∀ (x : α), x ∈ insert a s → r c (f x)

tactic: constructor
state_before: case insert
α : Type u_1
β : Type u_2
γ : Type ?u.57392
op : β → β → β
hc : IsCommutative β op
ha✝ : IsAssociative β op
f : α → β
b : β
s✝ : Finset α
a✝ : α
r : β → β → Prop
hr : ∀ {x y z : β}, r x (op y z) ↔ r x y ∧ r x z
c : β
a : α
s : Finset α
ha : ¬a ∈ s
IH : r c (fold op b f s) ↔ r c b ∧ ∀ (x : α), x ∈ s → r c (f x)
⊢ (r c (f a) ∧ ∀ (x : α), x ∈ s → r c (f x)) ↔ ∀ (x : α), x ∈ insert a s → r c (f x)

tactic: simp
state_before: case empty
α : Type u_1
β : Type u_2
γ : Type ?u.57392
op : β → β → β
hc : IsCommutative β op
ha : IsAssociative β op
f : α → β
b : β
s : Finset α
a : α
r : β → β → Prop
hr : ∀ {x y z : β}, r x (op y z) ↔ r x y ∧ r x z
c : β
⊢ r c (fold op b f ∅) ↔ r c b ∧ ∀ (x : α), x ∈ ∅ → r c (f x)

tactic: rintro ⟨h₁, h₂⟩
state_before: case insert.mp
α : Type u_1
β : Type u_2
γ : Type ?u.57392
op : β → β → β
hc : IsCommutative β op
ha✝ : IsAssociative β op
f : α → β
b : β
s✝ : Finset α
a✝ : α
r : β → β → Prop
hr : ∀ {x y z : β}, r x (op y z) ↔ r x y ∧ r x z
c : β
a : α
s : Finset α
ha : ¬a ∈ s
IH : r c (fold op b f s) ↔ r c b ∧ ∀ (x : α), x ∈ s → r c (f x)
⊢ (r c (f a) ∧ ∀ (x : α), x ∈ s → r c (f x)) → ∀ (x : α), x ∈ insert a s → r c (f x)

tactic: intro b hb
state_before: case insert.mp.intro
α : Type u_1
β : Type u_2
γ : Type ?u.57392
op : β → β → β
hc : IsCommutative β op
ha✝ : IsAssociative β op
f : α → β
b : β
s✝ : Finset α
a✝ : α
r : β → β → Prop
hr : ∀ {x y z : β}, r x (op y z) ↔ r x y ∧ r x z
c : β
a : α
s : Finset α
ha : ¬a ∈ s
IH : r c (fold op b f s) ↔ r c b ∧ ∀ (x : α), x ∈ s → r c (f x)
h₁ : r c (f a)
h₂ : ∀ (x : α), x ∈ s → r c (f x)
⊢ ∀ (x : α), x ∈ insert a s → r c (f x)

tactic: rw [Finset.mem_insert] at hb
state_before: case insert.mp.intro
α : Type u_1
β : Type u_2
γ : Type ?u.57392
op : β → β → β
hc : IsCommutative β op
ha✝ : IsAssociative β op
f : α → β
b✝ : β
s✝ : Finset α
a✝ : α
r : β → β → Prop
hr : ∀ {x y z : β}, r x (op y z) ↔ r x y ∧ r x z
c : β
a : α
s : Finset α
ha : ¬a ∈ s
IH : r c (fold op b✝ f s) ↔ r c b✝ ∧ ∀ (x : α), x ∈ s → r c (f x)
h₁ : r c (f a)
h₂ : ∀ (x : α), x ∈ s → r c (f x)
b : α
hb : b ∈ insert a s
⊢ r c (f b)

tactic: rcases hb with (rfl | hb) <;> solve_by_elim
state_before: case insert.mp.intro
α : Type u_1
β : Type u_2
γ : Type ?u.57392
op : β → β → β
hc : IsCommutative β op
ha✝ : IsAssociative β op
f : α → β
b✝ : β
s✝ : Finset α
a✝ : α
r : β → β → Prop
hr : ∀ {x y z : β}, r x (op y z) ↔ r x y ∧ r x z
c : β
a : α
s : Finset α
ha : ¬a ∈ s
IH : r c (fold op b✝ f s) ↔ r c b✝ ∧ ∀ (x : α), x ∈ s → r c (f x)
h₁ : r c (f a)
h₂ : ∀ (x : α), x ∈ s → r c (f x)
b : α
hb : b = a ∨ b ∈ s
⊢ r c (f b)

tactic: intro h
state_before: case insert.mpr
α : Type u_1
β : Type u_2
γ : Type ?u.57392
op : β → β → β
hc : IsCommutative β op
ha✝ : IsAssociative β op
f : α → β
b : β
s✝ : Finset α
a✝ : α
r : β → β → Prop
hr : ∀ {x y z : β}, r x (op y z) ↔ r x y ∧ r x z
c : β
a : α
s : Finset α
ha : ¬a ∈ s
IH : r c (fold op b f s) ↔ r c b ∧ ∀ (x : α), x ∈ s → r c (f x)
⊢ (∀ (x : α), x ∈ insert a s → r c (f x)) → r c (f a) ∧ ∀ (x : α), x ∈ s → r c (f x)

tactic: constructor
state_before: case insert.mpr
α : Type u_1
β : Type u_2
γ : Type ?u.57392
op : β → β → β
hc : IsCommutative β op
ha✝ : IsAssociative β op
f : α → β
b : β
s✝ : Finset α
a✝ : α
r : β → β → Prop
hr : ∀ {x y z : β}, r x (op y z) ↔ r x y ∧ r x z
c : β
a : α
s : Finset α
ha : ¬a ∈ s
IH : r c (fold op b f s) ↔ r c b ∧ ∀ (x : α), x ∈ s → r c (f x)
h : ∀ (x : α), x ∈ insert a s → r c (f x)
⊢ r c (f a) ∧ ∀ (x : α), x ∈ s → r c (f x)

tactic: exact h a (Finset.mem_insert_self _ _)
state_before: case insert.mpr.left
α : Type u_1
β : Type u_2
γ : Type ?u.57392
op : β → β → β
hc : IsCommutative β op
ha✝ : IsAssociative β op
f : α → β
b : β
s✝ : Finset α
a✝ : α
r : β → β → Prop
hr : ∀ {x y z : β}, r x (op y z) ↔ r x y ∧ r x z
c : β
a : α
s : Finset α
ha : ¬a ∈ s
IH : r c (fold op b f s) ↔ r c b ∧ ∀ (x : α), x ∈ s → r c (f x)
h : ∀ (x : α), x ∈ insert a s → r c (f x)
⊢ r c (f a)

tactic: exact fun b hb => h b <| Finset.mem_insert_of_mem hb
state_before: case insert.mpr.right
α : Type u_1
β : Type u_2
γ : Type ?u.57392
op : β → β → β
hc : IsCommutative β op
ha✝ : IsAssociative β op
f : α → β
b : β
s✝ : Finset α
a✝ : α
r : β → β → Prop
hr : ∀ {x y z : β}, r x (op y z) ↔ r x y ∧ r x z
c : β
a : α
s : Finset α
ha : ¬a ∈ s
IH : r c (fold op b f s) ↔ r c b ∧ ∀ (x : α), x ∈ s → r c (f x)
h : ∀ (x : α), x ∈ insert a s → r c (f x)
⊢ ∀ (x : α), x ∈ s → r c (f x)