Zulip Chat Archive
Stream: mathlib4
Topic: Fintype.card of a `Set ℕ`
David Renshaw (Feb 20 2023 at 15:34):
This works in mathlib3:
import data.nat.interval
import data.fintype.card
def foo (m : ℕ) (A : set ℕ) (hA : A = {n | n < m}) : fintype A :=
begin
rw[hA],
exact infer_instance
end
theorem bar (m : ℕ) (A : set ℕ) (hA : A = {n | n < m}) :
@fintype.card A (foo m A hA) = m :=
begin
simp_rw[hA],
simp[hA]
end
However, I have not been able to figure out how to make it work in mathlib4:
import Mathlib.Data.Nat.Interval
import Mathlib.Data.Fintype.Card
def foo (m : ℕ) (A : Set ℕ) (hA : A = {n | n < m}) : Fintype A := by
rw[hA]
exact inferInstance
theorem bar (m : ℕ) (A : Set ℕ) (hA : A = {n | n < m}) :
@Fintype.card A (foo m A hA) = m := by
simp_rw[hA] -- does not do anything
sorry
Does this indicate the existence of a bug? Or maybe I'm abusing Fintype.card, and this shouldn't be expected to work anyways?
Eric Wieser (Feb 20 2023 at 15:51):
This works:
@[congr]
lemma Fintype.card_congr'' {A B : Type _} {iA : Fintype A} {iB : Fintype B} (h : A = B) :
@Fintype.card _ iA = @Fintype.card _ iB := Fintype.card_congr' h
theorem bar (m : ℕ) (A : Set ℕ) (hA : A = {n | n < m}) :
@Fintype.card A (foo m A hA) = m := by
simp_rw[hA] -- works
sorry
Eric Wieser (Feb 20 2023 at 15:53):
It looks like somehow docs4#Fintype.card_congr' isn't firing
David Renshaw (Feb 20 2023 at 16:00):
cool, and then simp only [Fintype.card_ofFinset, Finset.card_range] closes that sorry
David Renshaw (Feb 20 2023 at 16:01):
but now I'm confused about why in the mathlib3 version, the simp picks up the finset.card_range lemma, which is not tagged as [simp].
David Renshaw (Feb 20 2023 at 16:05):
The difference between Fintype.card_congr' and your Fintype.card_congr'' seems to be that the former uses [] brackets for the Fintype premises, while the latter uses {} brackets.
Eric Wieser (Feb 20 2023 at 16:06):
Yes, I suspect this is because Lean4 chooses to be stubborn and not fill [] by unification even if it knows it can
Eric Wieser (Feb 20 2023 at 16:07):
I don't know whether the solution is to teach @[congr] to use unification, or to change Fintype.card_congr' to use {} and add a porting note. Probably the thing to do is open an issue about the former, and then reference it in a comment in the latter
Last updated: May 02 2025 at 03:31 UTC