Skip to content

Commit 3c029be

Browse files
committed
feat: cons lemmas for Finset.noncommProd (#11194)
These are more general than the `insert` versions as they do not assume `DecidableEq`. This also lets some later proofs be golfed.
1 parent 598676f commit 3c029be

File tree

2 files changed

+31
-36
lines changed

2 files changed

+31
-36
lines changed

Mathlib/Data/Finset/Basic.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -878,6 +878,9 @@ theorem mem_cons {h} : b ∈ s.cons a h ↔ b = a ∨ b ∈ s :=
878878
Multiset.mem_cons
879879
#align finset.mem_cons Finset.mem_cons
880880

881+
theorem mem_cons_of_mem {a b : α} {s : Finset α} {hb : b ∉ s} (ha : a ∈ s) : a ∈ cons b s hb :=
882+
Multiset.mem_cons_of_mem ha
883+
881884
-- Porting note: @[simp] can prove this
882885
theorem mem_cons_self (a : α) (s : Finset α) {h} : a ∈ cons a s h :=
883886
Multiset.mem_cons_self _ _

Mathlib/Data/Finset/NoncommProd.lean

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -309,35 +309,35 @@ theorem noncommProd_empty (f : α → β) (h) : noncommProd (∅ : Finset α) f
309309
#align finset.noncomm_prod_empty Finset.noncommProd_empty
310310
#align finset.noncomm_sum_empty Finset.noncommSum_empty
311311

312+
@[to_additive (attr := simp)]
313+
theorem noncommProd_cons (s : Finset α) (a : α) (f : α → β)
314+
(ha : a ∉ s) (comm) :
315+
noncommProd (cons a s ha) f comm =
316+
f a * noncommProd s f (comm.mono fun _ => Finset.mem_cons.2 ∘ .inr) := by
317+
simp_rw [noncommProd, Finset.cons_val, Multiset.map_cons, Multiset.noncommProd_cons]
318+
319+
@[to_additive]
320+
theorem noncommProd_cons' (s : Finset α) (a : α) (f : α → β)
321+
(ha : a ∉ s) (comm) :
322+
noncommProd (cons a s ha) f comm =
323+
noncommProd s f (comm.mono fun _ => Finset.mem_cons.2 ∘ .inr) * f a := by
324+
simp_rw [noncommProd, Finset.cons_val, Multiset.map_cons, Multiset.noncommProd_cons']
325+
312326
@[to_additive (attr := simp)]
313327
theorem noncommProd_insert_of_not_mem [DecidableEq α] (s : Finset α) (a : α) (f : α → β) (comm)
314328
(ha : a ∉ s) :
315329
noncommProd (insert a s) f comm =
316-
f a * noncommProd s f (comm.mono fun _ => mem_insert_of_mem) :=
317-
calc noncommProd (insert a s) f comm
318-
= Multiset.noncommProd ((insert a s).val.map f) _ := rfl
319-
_ = Multiset.noncommProd (f a ::ₘ s.1.map f)
320-
(by convert noncommProd_lemma _ f comm using 3
321-
simp [@eq_comm _ (f a)]) := by
322-
{ congr
323-
rw [insert_val_of_not_mem ha, Multiset.map_cons] }
324-
_ = _ := by rw [Multiset.noncommProd_cons, noncommProd]
330+
f a * noncommProd s f (comm.mono fun _ => mem_insert_of_mem) := by
331+
simp only [← cons_eq_insert _ _ ha, noncommProd_cons]
325332
#align finset.noncomm_prod_insert_of_not_mem Finset.noncommProd_insert_of_not_mem
326333
#align finset.noncomm_sum_insert_of_not_mem Finset.noncommSum_insert_of_not_mem
327334

328335
@[to_additive]
329336
theorem noncommProd_insert_of_not_mem' [DecidableEq α] (s : Finset α) (a : α) (f : α → β) (comm)
330337
(ha : a ∉ s) :
331338
noncommProd (insert a s) f comm =
332-
noncommProd s f (comm.mono fun _ => mem_insert_of_mem) * f a :=
333-
calc noncommProd (insert a s) f comm
334-
= Multiset.noncommProd ((insert a s).val.map f) _ := rfl
335-
_ = Multiset.noncommProd (f a ::ₘ s.1.map f)
336-
(by convert noncommProd_lemma _ f comm using 3
337-
simp [@eq_comm _ (f a)]) := by
338-
{ congr
339-
rw [insert_val_of_not_mem ha, Multiset.map_cons] }
340-
_ = _ := by rw [Multiset.noncommProd_cons', noncommProd]
339+
noncommProd s f (comm.mono fun _ => mem_insert_of_mem) * f a := by
340+
simp only [← cons_eq_insert _ _ ha, noncommProd_cons']
341341
#align finset.noncomm_prod_insert_of_not_mem' Finset.noncommProd_insert_of_not_mem'
342342
#align finset.noncomm_sum_insert_of_not_mem' Finset.noncommSum_insert_of_not_mem'
343343

@@ -398,10 +398,9 @@ theorem noncommProd_erase_mul [DecidableEq α] (s : Finset α) {a : α} (h : a
398398
@[to_additive]
399399
theorem noncommProd_eq_prod {β : Type*} [CommMonoid β] (s : Finset α) (f : α → β) :
400400
(noncommProd s f fun _ _ _ _ _ => Commute.all _ _) = s.prod f := by
401-
classical
402-
induction' s using Finset.induction_on with a s ha IH
403-
· simp
404-
· simp [ha, IH]
401+
induction' s using Finset.cons_induction_on with a s ha IH
402+
· simp
403+
· simp [ha, IH]
405404
#align finset.noncomm_prod_eq_prod Finset.noncommProd_eq_prod
406405
#align finset.noncomm_sum_eq_sum Finset.noncommSum_eq_sum
407406

@@ -444,20 +443,13 @@ theorem noncommProd_mul_distrib_aux {s : Finset α} {f : α → β} {g : α →
444443
theorem noncommProd_mul_distrib {s : Finset α} (f : α → β) (g : α → β) (comm_ff comm_gg comm_gf) :
445444
noncommProd s (f * g) (noncommProd_mul_distrib_aux comm_ff comm_gg comm_gf) =
446445
noncommProd s f comm_ff * noncommProd s g comm_gg := by
447-
classical
448-
induction' s using Finset.induction_on with x s hnmem ih
449-
· simp
450-
simp only [Finset.noncommProd_insert_of_not_mem _ _ _ _ hnmem]
451-
specialize
452-
ih (comm_ff.mono fun _ => mem_insert_of_mem) (comm_gg.mono fun _ => mem_insert_of_mem)
453-
(comm_gf.mono fun _ => mem_insert_of_mem)
454-
rw [ih, Pi.mul_apply]
455-
simp only [mul_assoc]
456-
congr 1
457-
simp only [← mul_assoc]
458-
congr 1
459-
refine' noncommProd_commute _ _ _ _ fun y hy => _
460-
exact comm_gf (mem_insert_self x s) (mem_insert_of_mem hy) (ne_of_mem_of_not_mem hy hnmem).symm
446+
induction' s using Finset.cons_induction_on with x s hnmem ih
447+
· simp
448+
rw [Finset.noncommProd_cons, Finset.noncommProd_cons, Finset.noncommProd_cons, Pi.mul_apply,
449+
ih (comm_ff.mono fun _ => mem_cons_of_mem) (comm_gg.mono fun _ => mem_cons_of_mem)
450+
(comm_gf.mono fun _ => mem_cons_of_mem),
451+
(noncommProd_commute _ _ _ _ fun y hy => ?_).mul_mul_mul_comm]
452+
exact comm_gf (mem_cons_self x s) (mem_cons_of_mem hy) (ne_of_mem_of_not_mem hy hnmem).symm
461453
#align finset.noncomm_prod_mul_distrib Finset.noncommProd_mul_distrib
462454
#align finset.noncomm_sum_add_distrib Finset.noncommSum_add_distrib
463455

0 commit comments

Comments
 (0)