Zulip Chat Archive
Stream: mathlib4
Topic: simpNF says simp can prove something it can't
Robert Maxton (Apr 20 2025 at 23:58):
Sorry to crosspost, but as it's been a week since the last time I asked:
This PR (one of six 'helper' PRs for the PR constructing (co)limits in Quiv) doesn't pass CI because simpNF claims that simp can prove limitSubobjectProduct_π and its dual. However, when I actually try it locally, simp doesn't work on its own. Is this a false positive, or am I misunderstanding what the linter is telling me here?
Maja Kądziołka (Apr 21 2025 at 00:02):
Have you seen the full error message here: https://github.com/leanprover-community/mathlib4/actions/runs/14425381374/job/40453462576
Maja Kądziołka (Apr 21 2025 at 00:02):
also, does a simp with no modifiers make any progress on the left-hand side?
Robert Maxton (Apr 21 2025 at 00:10):
Maja Kądziołka said:
Have you seen the full error message here: https://github.com/leanprover-community/mathlib4/actions/runs/14425381374/job/40453462576
Yes, but it doesn't make much sense to me; I'm not even sure simp is using any of the Fan.mk_ etc lemmas in this proof.
Robert Maxton (Apr 21 2025 at 00:10):
Maja Kądziołka said:
also, does a
simpwith no modifiers make any progress on the left-hand side?
A simp with no modifiers makes no progress without unfolding limitSubobjectProduct.
Jovan Gerbscheid (Apr 21 2025 at 03:38):
simp can prove limitSubobjectProduct_π as claimed in the error message, but it needs to use limitSubobjectProduct_eq_lift, which is defined after it. That's why it didn't work when you tried to solve it with simp. So I think the simpNF linter is correctly complaining.
Robert Maxton (Apr 21 2025 at 03:45):
Er.... Well, yes. But the proof of limitSubobjectProduct_eq_lift itself makes use of limitSubobjectProduct_π; removing the simp from limitSubobjectProduct_π makes the former proof not go through.
Jovan Gerbscheid (Apr 21 2025 at 03:50):
If you can't just pass the lemma directly to simp, you can use @[local simp] so that the simp tag is only used in this file
Robert Maxton (Apr 21 2025 at 04:21):
Mmm. I suppose I can do that, yeah. Seems a little backward but I guess it marginally reduces the number of simp lemmas
Bolton Bailey (Apr 24 2025 at 01:59):
I am also experiencing a problem where the simpNF linter is telling me a simp lemma can be proved by simp in this run. But in my case, I can't use the simp call that the linter provides, because one of the lemmas being called is exactly the lemma that comes immediately after, that I am using this lemma to prove. What am I supposed to do about this?
Aaron Liu (Apr 24 2025 at 02:04):
In that case, one of the lemmas should not be @[simp]
Bolton Bailey (Apr 24 2025 at 02:16):
It feels to me that both should be simp, In both cases the RHS is much more complicated. Which one shouldn't be simp?
@[simp]
theorem map_univ_comp_coe {β : Type*} (m : Multiset α) (f : α → β) :
((Finset.univ : Finset m).val.map (f ∘ (fun x : m ↦ (x : α)))) = m.map f := by
rw [← Multiset.map_map, Multiset.map_univ_coe]
@[simp]
theorem map_univ {β : Type*} (m : Multiset α) (f : α → β) :
((Finset.univ : Finset m).val.map fun (x : m) ↦ f (x : α)) = m.map f := by
simp_rw [← Function.comp_apply (f := f)]
exact map_univ_comp_coe m f
Jovan Gerbscheid (Apr 24 2025 at 02:42):
The lemma that the simpNF linter points out (the first one) should not be simp, since it is redundant.
The fact that Function.comp_apply is actually applied here by simp seems very surprising, but it can be explained by the congr lemma Multiset.map_congr
Last updated: May 02 2025 at 03:31 UTC