Zulip Chat Archive
Stream: Type theory
Topic: Setless proof of `Fin2 1 -> Fin2 1 \neq Fin2 2 -> Fin2 2`
nrs (Dec 16 2024 at 03:50):
Is there a way to talk about cardinality of functions without referring to mathlib's ZFC sets? I was surprised how non-obvious proving (Fin2 1 -> Fin2 1) \neq (Fin2 2 -> Fin2 2)
was without calling simp [Nat.card]
(it seems to me a cardinality argument is the obvious method), and then further realized that is is probably not provable without funext
. Do we have any notion of size that would make sense for these functions, in a purely type theoretical setting? And as a bonus, can we prove this can't be proven without funext
internally in Lean?
Eric Wieser (Dec 16 2024 at 05:03):
I assume you're missing some parentheses there?
nrs (Dec 16 2024 at 05:07):
whoops! fixed thanks
Eric Wieser (Dec 16 2024 at 05:23):
I assume this proof doesn't satisfy you?
import Mathlib
example : (Fin 1 → Fin 1) ≠ (Fin 2 → Fin 2) := by
intro h
simpa using congr(Fintype.card $h)
Eric Wieser (Dec 16 2024 at 05:31):
Certainly there's no mention of ZFC sets
Eric Wieser (Dec 16 2024 at 05:33):
But even the definition of Fintype
uses funext
, as Mathlib makes absolutely no effort to avoid this axiom, and only a very small amount of effort to avoid Classical.choice
nrs (Dec 16 2024 at 05:52):
hm the issue is there's a call to Classical.choice
here, and I might be mistaken, but the definition of Set A
as A -> Prop
combined with Classical.choice
might be enough to imply this holds only in a set-theoretical model
Eric Wieser (Dec 16 2024 at 05:54):
Set shouldn't be involved in the above at all
nrs (Dec 16 2024 at 05:54):
but you're right that there's no explicit mention of mathlib's ZFC sets. I wonder if we can avoid Classical.choice
completely?
nrs (Dec 16 2024 at 05:57):
Eric Wieser said:
Set shouldn't be involved in the above at all
right but it is enough for there to be any type A -> Prop
which would behave as Set
(in the case Set
with Classical.choice
can only be realized in a set-theoretical model)
Eric Wieser (Dec 16 2024 at 06:24):
So it looks like docs#List.nodup_range is one source of the use of choice
, which might be easy enough to remove
Eric Wieser (Dec 16 2024 at 06:26):
But I would be surprised if Lean accepts a PR that removes the use of choice there
nrs (Dec 16 2024 at 06:27):
Multiset.pi
too it seems
nrs (Dec 16 2024 at 06:27):
Eric Wieser said:
But I would be surprised if Lean accepts a PR that removes the use of choice there
oh this is mostly out of interest in mapping out the metatheory of Lean
Eric Wieser (Dec 16 2024 at 07:14):
I'm curious if the use of choice in docs#Multiset.pi is unavoidable or trivial
Eric Wieser (Dec 16 2024 at 07:16):
That one is in mathlib not Lean, so I'd be happy to merge a de-choicification if the proof readability doesn't majorly suffer
nrs (Dec 16 2024 at 07:17):
it comes from the generated Multiset.pi.proof_1
which I don't know much about, am currently investigating what it means
Eric Wieser (Dec 16 2024 at 07:32):
It's probably easier just to look at the source of Multiset.pi, which contains a by
block corresponding to that
Eric Wieser (Dec 16 2024 at 07:35):
Looks like docs#Multiset.Pi.cons_swap is to blame
Eric Wieser (Dec 16 2024 at 07:39):
Fixed in #19990
nrs (Dec 16 2024 at 07:53):
Very cool! Thanks a lot for taking the time, it's a very nice change for metatheoretical purposes!
nrs (Dec 16 2024 at 07:54):
I will one day have time to write that command I've been meaning to write that singles out relevant lemmas for investigating their axiom usage, instead of a wall of #print axioms
Last updated: May 02 2025 at 03:31 UTC