Zulip Chat Archive
Stream: mathlib4
Topic: ext for DFinsupp.ext
Antoine Chambert-Loir (Jul 21 2023 at 20:50):
docs#DFinsupp.ext has no [ext]attribute while docs3#dfinsupp.ext has one.
Is there any reason for this?
Ruben Van de Velde (Jul 21 2023 at 21:00):
@[ext]
theorem ext {f g : Π₀ i, β i} (h : ∀ i, f i = g i) : f = g :=
  FunLike.ext _ _ h
#align dfinsupp.ext DFinsupp.ext
Looks like it's just not rendered in the docs
Antoine Chambert-Loir (Jul 21 2023 at 21:02):
But what surprises me is that on my current setup, apply DFinsupp.ext works, while ext doesn't
(and worked in the Lean3 version of the file I am presently porting…)
Yury G. Kudryashov (Jul 21 2023 at 21:03):
Do you have a #mwe ?
Adam Topaz (Jul 21 2023 at 21:03):
This is probably due to a change in the way the ext tactic works between lean3 and 4. In lean3, it was much more aggressive, essentially trying all possible ext lemmas as a failsafe, while the lean4 version doesn't do this.
Yury G. Kudryashov (Jul 21 2023 at 21:04):
Do LHS and RHS have type DFinsupp or some T where def T := DFinsupp?
Adam Topaz (Jul 21 2023 at 21:04):
In such situations in lean4, it usually means that some API is missing.
Kevin Buzzard (Jul 21 2023 at 22:04):
Well that's one interpretation; another is that ext! is missing.
Antoine Chambert-Loir (Jul 21 2023 at 22:07):
Here is a MWE :
import Mathlib.Algebra.Module.LinearMap
import Mathlib.RingTheory.GradedAlgebra.HomogeneousIdeal
variable {ι : Type _} [DecidableEq ι]
theorem DirectSum.mk_apply {β : ι → Type _} [∀ i, AddCommMonoid (β i)] (s : Finset ι)
    (f : ∀ i : s, β ↑i) (i : ι) :
    DirectSum.mk β s f i = if h : i ∈ s then f ⟨i, h⟩ else 0 :=
  rfl
theorem DirectSum.mk_eq_sum' {β : ι → Type _}
    [∀ i, AddCommMonoid (β i)]
    [∀ (i : ι) (x : β i), Decidable (x ≠ 0)] (s : Finset ι) (f : ∀ i, β i) :
    (DirectSum.mk β s (fun i => f i)) =
      s.sum (fun i => DirectSum.of β i (f i)) := by
  simp only [Finset.coe_sort_coe]
  -- ext does not work
  apply DFinsupp.ext
  intro i
  rw [DirectSum.mk_apply, DFinsupp.finset_sum_apply]
  split_ifs with hi
  · rw [Finset.sum_eq_single_of_mem i hi]
    · rw [← DirectSum.lof_eq_of ℕ, DirectSum.lof_apply]
    · intro j _ hij
      exact DirectSum.of_eq_of_ne _ _ _ _ hij
  · apply symm
    apply Finset.sum_eq_zero
    intro j hj
    exact DirectSum.of_eq_of_ne _ _ _ _ (ne_of_mem_of_not_mem hj hi)
Eric Wieser (Jul 21 2023 at 22:07):
Yury G. Kudryashov said:
Do LHS and RHS have type
DFinsuppor someTwheredef T := DFinsupp?
So the answer to this is "Yes, with T = DirectSum"
Eric Wieser (Jul 21 2023 at 22:08):
I don't really like the idea of duplicating all the dfinsupp API for direct_sum, but duplicating ext seems fairly standard (we already do it for all the FunLike types)
Antoine Chambert-Loir (Jul 21 2023 at 22:10):
Yury G. Kudryashov said:
Do LHS and RHS have type
DFinsuppor someTwheredef T := DFinsupp?
both live in ⨁ (i : ι), β i
Antoine Chambert-Loir (Jul 21 2023 at 22:13):
Eric Wieser said:
I don't really like the idea of duplicating all the dfinsupp API for direct_sum, but duplicating
extseems fairly standard (we already do it for all theFunLiketypes)
Do you mean I'm erring here?
(I don't like the idea of duplicating stuff, especially if I have to do it. IIRC, I had to write this in order to provide quotient of graded modules by homogeneous submodules with a grading.)
Eric Wieser (Jul 21 2023 at 22:14):
(⨁ i, β i is docs#DirectSum, Π₀ i, β i is docs#DFinsupp)
Eric Wieser (Jul 21 2023 at 22:14):
I think you only need to duplicate the ext lemma (and I think it is fine to do so)
Yury G. Kudryashov (Jul 21 2023 at 22:52):
The problem is that ext and some other tactics in Lean 4 (like simp) match lemmas based on types of terms. So, it is possible that some simp lemma about DFinsupp will not apply because you have (f : DirectSum _) instead of f : DFinsupp _.
Yury G. Kudryashov (Jul 21 2023 at 22:53):
BTW, are there any instances on DirectSum that don't agree with DFinsupp? If no, then should we make DirectSum reducible?
Eric Wieser (Jul 21 2023 at 23:03):
Yes, only direct_sum has the convolutive multiplication (it is to DFinsupp as AddMonoidAlgebra is to Finsupp)
Eric Wieser (Jul 21 2023 at 23:04):
In principle dfinsupp should have pointwise multiplication to match finsupp, though I don't think we ever added it
Scott Morrison (Jul 23 2023 at 01:07):
Kevin Buzzard said:
Well that's one interpretation; another is that
ext!is missing.
How about someone implements ext! so that is applies all @[ext] lemmas, regardless of whether the DiscrTree approves, but then prints a message like "XYZ.ext applies here. If you would like to be able to use this with ext, please make a copy of this lemma written in terms of the type PQR."
Eric Wieser (Jul 23 2023 at 08:56):
Should it be ext!?, to fit the pattern of "tactics ending in ? shouldn't be committed"?
Jon Eugster (Jul 24 2023 at 01:34):
Added an implementation of ext!? to std4#120 where I also implemented ext? a while ago.
Screenshot_20230724_033331.png
Last updated: May 02 2025 at 03:31 UTC
