Zulip Chat Archive

Stream: new members

Topic: how to congr inside a condition?


Alex Kontorovich (Feb 03 2022 at 03:09):

Another stupid question: how to prove this?

example (s :   finset ) (t :   finset ) (x : ) (hst :  n, n  x  (s n).card = (t n).card) :
 n in finset.Icc 1 x, (s n).card =  n in finset.Icc 1 x, (t n).card :=
begin
  sorry,
end

I can't use congr', because then I lose the condition n ≤ x, needed to apply hst...?

Kyle Miller (Feb 03 2022 at 04:06):

You need to "attach" the membership condition:

import algebra.big_operators.basic
import data.nat.interval

open_locale big_operators

example (s t:   ) (x : ) (hst :  n, n  x  s n = t n) :
   n in finset.Icc 1 x, s n =  n in finset.Icc 1 x, t n :=
begin
  conv
  { congr,
    rw  finset.sum_attach,
    skip,
    rw  finset.sum_attach, },
  congr,
  ext y, hy⟩,
  rw finset.mem_Icc at hy,
  simp [hst _ hy.2],
end

Johan Commelin (Feb 03 2022 at 04:11):

Shouldn't

apply finset.sum_congr rfl
intros i hi,
apply hst,
library_search

prove this? (Didn't test)

Kyle Miller (Feb 03 2022 at 04:14):

Oh, right, docs#finset.sum_congr.

You can simplify that down to

example (s t:   ) (x : ) (hst :  n, n  x  s n = t n) :
   n in finset.Icc 1 x, s n =  n in finset.Icc 1 x, t n :=
begin
  apply finset.sum_congr rfl,
  simp [hst] { contextual := tt },
end

Yakov Pechersky (Feb 03 2022 at 04:15):

import number_theory.divisors

open_locale big_operators

example (s t:   ) (x : ) (hst :  n, n  x  s n = t n) :
   n in finset.Icc 1 x, s n =  n in finset.Icc 1 x, t n :=
begin
  refine finset.sum_congr rfl _,
  simp only [finset.mem_Icc, and_imp],
  intros y hy,
  exact hst _
end

Kevin Buzzard (Feb 03 2022 at 08:58):

I can never remember that "get simp to do intros" trick. That's the contextual := tt thing, right? Is this in some FAQ somewhere?

Kyle Miller (Feb 03 2022 at 18:10):

@Kevin Buzzard Yes, that's the contextual := tt thing. The paragraph right before the last code block at the simp page mentions it.

Kyle Miller (Feb 03 2022 at 18:12):

I wish it were easier to invoke. An idea that came to mind this morning (similar to a proposal I had before but perhaps more sane) is to have flags for tactics. For example, this could be an additional way you can add contextual := tt:

simp/c [hst]

Kyle Miller (Feb 03 2022 at 18:13):

Or,

simp+c [hst]

Kyle Miller (Feb 03 2022 at 18:16):

That way we could have negative flags, for example

simp-bezpi+c
-- short for
simp-b-e-z-p-i+c

could turn off beta reduction, eta equivalence, zeta reductions, projection reduction, recursor reduction, while turning on contextual


Last updated: Dec 20 2023 at 11:08 UTC