Zulip Chat Archive
Stream: lean4
Topic: Add parametric type to the statement being proven
Leni Aniva (Aug 31 2023 at 01:31):
I'm trying to prove a statement like this:
private theorem list_get_replicate (x: α) (i: Fin n): List.get (List.replicate n x) i = x := ...
However it gives this error even just to state the theorem:
application type mismatch
List.get (List.replicate n x) i
argument
i
has type
Fin n : Type
but is expected to have type
Fin (List.length (List.replicate n x)) : Type
The equivalence of n and List.length ... is established by List.length_replicate. How can I use this theorem here?
Adam Topaz (Aug 31 2023 at 01:32):
I would use the length instead of n. Is there a particular reason not to?
Adam Topaz (Aug 31 2023 at 01:33):
If you want to convert some x : Fin (length …) to Fin n, you could use docs#Fin.cast
Leni Aniva (Aug 31 2023 at 01:36):
Adam Topaz said:
I would use the length instead of n. Is there a particular reason not to?
How would this be stated? The length of the list comes from n
Adam Topaz (Aug 31 2023 at 01:37):
Just add n to the context
Adam Topaz (Aug 31 2023 at 01:38):
e.g.
private theorem list_get_replicate {n : Nat} (x: α) (i: Fin (List.replicate n x).length): List.get (List.replicate n x) i = x := ...
Leni Aniva (Aug 31 2023 at 01:39):
Adam Topaz said:
e.g.
private theorem list_get_replicate {n : Nat} (x: α) (i: Fin (List.replicate n x).length): List.get (List.replicate n x) i = x := ...
Thanks! Is this a common idiom?
Adam Topaz (Aug 31 2023 at 01:41):
What idiom are you referring to?
Adam Topaz (Aug 31 2023 at 01:42):
In this case you could also use your original code, but replace i after the : with an appropriate Fin.cast … i. Either approach works, but it’s up to the author to build the relevant API for the approach they take
Leni Aniva (Aug 31 2023 at 01:42):
Adam Topaz said:
What idiom are you referring to?
In this case it is necessary to duplicate List.replicate ... twice to ensure that i conforms to Fin condition in the statement of the theorem. Is this commonly seen?
Leni Aniva (Aug 31 2023 at 01:43):
Adam Topaz said:
In this case you could also use your original code, but replace
iafter the:with an appropriateFin.cast … i. Either approach works, but it’s up to the author to build the relevant API for the approach they take
Thanks!
Leni Aniva (Aug 31 2023 at 01:49):
Adam Topaz said:
In this case you could also use your original code, but replace
iafter the:with an appropriateFin.cast … i. Either approach works, but it’s up to the author to build the relevant API for the approach they take
Are you sure its Fin.cast? Lean gives the error
unknown constant 'Fin.cast'
Adam Topaz (Aug 31 2023 at 01:53):
Adam Topaz (Aug 31 2023 at 01:53):
You might be missing the import Std.Data.Fin.Basic
Adam Topaz (Aug 31 2023 at 01:54):
BTW, it's usually better to provide #mwe 's when asking such questions, which would make it obvious if you have some import missing, for example.
Last updated: May 02 2025 at 03:31 UTC