Zulip Chat Archive

Stream: mathlib4

Topic: Fin.instOfNat vs Fin.instOfNatFin


Yury G. Kudryashov (Apr 28 2024 at 01:48):

I'm trying to write a version of List.get_mk_zero from std4#758 that will work with (0 : Fin (length l)) instead of Fin.mk 0 _. I fail to make a version that works both with docs#Fin.instOfNat and docs#Fin.instOfNatFin. The issue is that usually Lean fails to generate NeZero instance (but can get it by unfolding some definitions and matching a list with .cons _ _, thus matching its length with _ + 1; or it can get it as an output of some rw/simp).

Yury G. Kudryashov (Apr 28 2024 at 01:57):

Moreover, this fails:

example (a : ) : @instOfNat n a = @instOfNatFin (n + 1) a _ := by
  with_reducible_and_instances rfl

Yury G. Kudryashov (Apr 28 2024 at 03:37):

Can we change the instance in core to use some version of docs#NeZero (e.g., a Nat-only version or a version that takes [OfNat α 0] instead of [Zero α]), or it goes against some deliberate design choices?

Yury G. Kudryashov (Apr 28 2024 at 03:37):

@Kim Morrison , who's the right person to answer this :up: question?

Kim Morrison (Apr 28 2024 at 05:57):

Which instance is it that you want to change? I'm not following yet.

Kim Morrison (Apr 28 2024 at 05:57):

Separately, docs#Fin.instOfNatFin seems to crash my browser (chrome on macos). Anyone else? (EDIT: restarting has fixed it; other things were crashing too.)

Mario Carneiro (Apr 28 2024 at 05:58):

works fine on FF / ubuntu, redirecting to https://leanprover-community.github.io/mathlib4_docs/Mathlib/Data/Fin/Basic.html#Fin.instOfNatFin

Yury G. Kudryashov (Apr 28 2024 at 05:59):

In Mathlib, we define the following instance:

instance {a : } [NeZero n] : OfNat (Fin n) a where
  ofNat := Fin.ofNat' a (NeZero.pos n)

Yury G. Kudryashov (Apr 28 2024 at 06:02):

This way we can argue about, e.g., (0 : Fin (2 ^ n)) for a variable n.

Yury G. Kudryashov (Apr 28 2024 at 06:03):

(BTW, this may be useful to prove some lemmas about this type, then apply to UInt*)

Yury G. Kudryashov (Apr 28 2024 at 06:05):

But this instance conflicts with the instance (n a : Nat) : OfNat (Fin (n + 1)) a in core.

Kim Morrison (Apr 28 2024 at 06:06):

I see, and you'd like that to not have a +1, but instead some other typeclass playing the role of NeZero.

Yury G. Kudryashov (Apr 28 2024 at 06:07):

Exactly. Either backport a generic NeZero, or create a Nat-specific version.


Last updated: May 02 2025 at 03:31 UTC