Zulip Chat Archive
Stream: new members
Topic: Extensionality for big operators
Justus Springer (Apr 23 2021 at 17:01):
So I'm in a situation where I want to prove that two sums are equal, knowing that for each index, the summands are equal. Like this:
import data.finset
open_locale big_operators
variables {α : Type*} {β : Type*} [add_comm_monoid β]
lemma foo (s : finset α) (f g : α → β) (h : ∀ x ∈ s, f x = g x) :
∑ (x : α) in s, f x = ∑ (x : α) in s, g x :=
begin
sorry
end
Seems like a pretty trivial task, however I can't seem to find the right lemma to prove this... Initially this felt like some kind of extensionality lemma, butext
gives the error message: only constants and Pi types are supported: β
. Using congr
makes progress, but it would require me to prove f x = g x
for all values x : α
, but I only know it for elements of s
.
I've been stuck here for quite some time now, any help is much appreciated!
Johan Commelin (Apr 23 2021 at 17:04):
finset.sum_congr rfl h
Patrick Massot (Apr 23 2021 at 17:05):
Johan is wrong, he wanted to write library_search
.
Patrick Massot (Apr 23 2021 at 17:06):
That's really important to know.
Justus Springer (Apr 23 2021 at 17:54):
I'm amazed that I didn't find this!
Thanks
Yakov Pechersky (Apr 23 2021 at 17:54):
Or congr' 1
Yakov Pechersky (Apr 23 2021 at 17:55):
To prevent congr from doing too much
Justus Springer (Apr 23 2021 at 17:57):
Yakov Pechersky said:
Or congr' 1
That one doesn't work for me, it produces the goal (λ (x : α), f x) = λ (x : α), g x
Justus Springer (Apr 23 2021 at 17:58):
I only know f x = g x
for x ∈ s
Yakov Pechersky (Apr 23 2021 at 17:58):
Then apologies for being misleading
Justus Springer (Apr 23 2021 at 17:58):
No problem :)
Patrick Massot (Apr 23 2021 at 17:59):
Justus Springer said:
I'm amazed that I didn't find this!
Thanks
library_search
is really a fundamental tactic, especially after you made the effort of stating a clean general lemma as you did.
Kevin Buzzard (Apr 23 2021 at 18:02):
finset.sum_congr rfl
is such a common idiom, and it's really hard to find: it's like one of those secrets which gets passed around. It took me a while to understand what a congr
lemma was, but once I'd got the hang of it it really started opening doors for me, e.g. I could guess what the logic lemmas and_congr
and forall_congr
were going to say and use them without having to trouble library_search
.
Eric Wieser (Apr 23 2021 at 18:16):
The nice thing about docs#finsum is congr
just works!
Justus Springer (Apr 23 2021 at 18:57):
Patrick Massot said:
library_search
is really a fundamental tactic, especially after you made the effort of stating a clean general lemma as you did.
Good tip! Extracting the general statement I'm looking for and then throwing library_search
at it seems like a great strategy
Justus Springer (Apr 23 2021 at 18:59):
Kevin Buzzard said:
finset.sum_congr rfl
is such a common idiom, and it's really hard to find: it's like one of those secrets which gets passed around. It took me a while to understand what acongr
lemma was, but once I'd got the hang of it it really started opening doors for me, e.g. I could guess what the logic lemmasand_congr
andforall_congr
were going to say and use them without having to troublelibrary_search
.
I guess haven't internalized yet what a congr
lemma is, I was thinking ext
for some reason
Kevin Buzzard (Apr 23 2021 at 19:16):
ext
gets you from \forall x, f x = g x
to f = g
. But congr
gets you from \forall x, f x = g x
to [some stuff I make with some f x
values] = [some stuff I make with some g x
values].
Eric Wieser (Apr 23 2021 at 19:22):
Where "from X to Y" there means "your goal was Y and is now X"
Eric Wieser (Apr 23 2021 at 19:23):
congr
turns foo x1 y1 = foo x2 y2
into two goals, x1 = x2
and y1 = y2
Kevin Buzzard (Apr 23 2021 at 19:58):
We mathematicians go forwards :-)
Scott Morrison (Apr 23 2021 at 23:50):
There's also the little used tactic#apply_congr, which was designed for rewriting inside big operators when you need the membership hypothesis.
Last updated: Dec 20 2023 at 11:08 UTC