Zulip Chat Archive
Stream: new members
Topic: Rewrite type of expression
hakanaras (Sep 11 2025 at 21:06):
Is there a quick and easy way to use an expression of type A where an expression of type B is expected, if (A = B) can be shown easily, e.g. by grind? For example can I do this without introducing a separate lemma1 here:
def lemma1 {a s : Nat} : List.Vector α (a + (s + 0)).succ -> List.Vector α (a + 1 + 0 + s)
| ⟨ l, len ⟩ => ⟨ l, by grind only ⟩
/-- Applies the stack permutation to the given input and stack vectors. -/
def apply {α : Type} {i s : Nat} :
(perm : StackPermutation i s) -> (input : V α i) -> (stack : V α s) -> V α (i + s)
| .nil, _, _ => V.nil
| .skip 0 rest, ⟨ ih :: it, i ⟩, ⟨ ss, s ⟩ => lemma1 $ V.cons ih $ apply rest ⟨ it, by grind only [List.length_cons] ⟩ ⟨ ss, s ⟩
| .skip (Nat.succ n) rest, ⟨ i :: is, _ ⟩, ⟨ ss, _ ⟩ => sorry -- apply (.skip n rest) ⟨ is, _ ⟩ ⟨ i :: ss, _ ⟩
| .pop rest, is, ⟨ s :: ss, _ ⟩ => V.cons s $ apply rest is ⟨ ss, by grind only [List.length_cons] ⟩
Also I have a feeling I'm making apply way more complicated than it needs to be. I'd be thankful for any tips on simplifying it.
I have gone through much of the language reference and other parts of the documentation, and I'm still continuing to do so, but I can't easily find answers to questions like this.
Kenny Lau (Sep 11 2025 at 21:07):
without reading your example, it's the various cast functions (whose precise implementation depends on what A and B are), such as docs#Fin.cast that casts Fin m to Fin n
hakanaras (Sep 11 2025 at 21:16):
Thanks, regular cast was exactly what I needed
Kenny Lau (Sep 11 2025 at 21:16):
the reason why various cast functions are defined (which are all equal to cast) is because sometimes you want to carry certain structures
hakanaras (Sep 11 2025 at 21:18):
I understand, I checked if there is one for List.Vector from mathlib4 but there isn't
Last updated: Dec 20 2025 at 21:32 UTC